From 19ff1b64597acf8dd4665f3ce5f22baa3a1a45fc Mon Sep 17 00:00:00 2001 From: thomasstorm Date: Tue, 21 Nov 2023 14:44:11 +0100 Subject: [PATCH] finalised JNB #1, and removed wrong info --- notebooks/geoDB-openEO_use_case_1.ipynb | 291 ++++-------------------- notebooks/geoDB-openEO_use_case_2.ipynb | 158 ++----------- xcube_geodb_openeo/backend/processes.py | 57 ----- 3 files changed, 62 insertions(+), 444 deletions(-) diff --git a/notebooks/geoDB-openEO_use_case_1.ipynb b/notebooks/geoDB-openEO_use_case_1.ipynb index 22bb96a..851a9d1 100644 --- a/notebooks/geoDB-openEO_use_case_1.ipynb +++ b/notebooks/geoDB-openEO_use_case_1.ipynb @@ -6,74 +6,31 @@ "source": [ "# Demonstration of basic geoDB capabilities + Use Case #1\n", "\n", + "This notebook demonstrates the STAC capabilities of the geoDB openEO backend, as well as the simple use case #1: accessing and downloading data from the geoDB using the openeo client. \n", + "\n", "## Preparations\n", - "First, some imports are done, and the base URL is set.\n", - "The base URL is where the backend is running, and it will be used in all later examples." + "First, we open a connection to the geoDB openEO backend." ] }, { "cell_type": "code", - "execution_count": 26, - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-16T14:45:40.870573200Z", - "start_time": "2023-11-16T14:45:40.849715200Z" - } - }, + "execution_count": null, "outputs": [], - "source": [ - "import urllib3\n", - "import json\n", - "\n", - "http = urllib3.PoolManager()\n", - "# base_url = 'https://geodb.openeo.dev.brockmann-consult.de'\n", - "base_url = 'http://127.0.0.1:8080'" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.21.1\n" - ] - } - ], "source": [ "import openeo\n", "\n", - "print(openeo.client_version())" + "# geodb_url = 'https://geodb.openeo.dev.brockmann-consult.de'\n", + "geodb_url = 'http://localhost:8080'\n", + "geodb = openeo.connect(geodb_url)" ], "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-11-16T14:45:43.176416800Z", - "start_time": "2023-11-16T14:45:42.783487500Z" - } - } - }, - { - "cell_type": "code", - "execution_count": 13, - "outputs": [], - "source": [ - "connection = openeo.connect(base_url)" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-11-16T14:34:31.763007300Z", - "start_time": "2023-11-16T14:34:29.677273800Z" - } + "collapsed": false } }, { "cell_type": "markdown", "source": [ - "Print the general metadata:" + "We print the general metadata:" ], "metadata": { "collapsed": false @@ -85,14 +42,14 @@ "metadata": {}, "outputs": [], "source": [ - "connection.capabilities()" + "geodb.capabilities()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Show the file formats the geoDB-openEO-backend supports (currently empty):" + "Show the file formats the geoDB-openEO-backend supports:" ] }, { @@ -101,14 +58,14 @@ "metadata": {}, "outputs": [], "source": [ - "connection.list_file_formats()" + "geodb.list_file_formats()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Collections listing - STAC part\n", + "### STAC\n", "List the collections currently available using the geoDB-openEO-backend:" ] }, @@ -118,7 +75,7 @@ "metadata": {}, "outputs": [], "source": [ - "connection.list_collection_ids()" + "geodb.list_collection_ids()" ] }, { @@ -134,189 +91,23 @@ "metadata": {}, "outputs": [], "source": [ - "connection.describe_collection('stac_test~_train_tier_1_source')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "## Processes listing of the geoDB-openEO backend" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-16T14:38:47.322883200Z", - "start_time": "2023-11-16T14:38:47.248577100Z" - } - }, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'print_endpoint' is not defined", - "output_type": "error", - "traceback": [ - "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[1;31mNameError\u001B[0m Traceback (most recent call last)", - "Cell \u001B[1;32mIn[19], line 1\u001B[0m\n\u001B[1;32m----> 1\u001B[0m \u001B[43mprint_endpoint\u001B[49m(\u001B[38;5;124mf\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;132;01m{\u001B[39;00mbase_url\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m/processes\u001B[39m\u001B[38;5;124m'\u001B[39m)\n", - "\u001B[1;31mNameError\u001B[0m: name 'print_endpoint' is not defined" - ] - } - ], - "source": [ - "print_endpoint(f'{base_url}/processes')" + "geodb.describe_collection('my_eurocrops~AT_2021_EC21')" ] }, { "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Use Case 1\n", - "Run the function `load_collection`, and store the result in a local variable:" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "outputs": [], "source": [ - "collection = connection.load_collection('openeo~hamburg')\n", - "collection_agg = collection.aggregate_temporal()" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-11-16T14:45:55.733058500Z", - "start_time": "2023-11-16T14:45:47.905301900Z" - } - } - }, - { - "cell_type": "code", - "execution_count": 29, - "outputs": [ - { - "ename": "ConnectionError", - "evalue": "('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))", - "output_type": "error", - "traceback": [ - "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m", - "\u001B[1;31mConnectionResetError\u001B[0m Traceback (most recent call last)", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\urllib3\\connectionpool.py:703\u001B[0m, in \u001B[0;36mHTTPConnectionPool.urlopen\u001B[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001B[0m\n\u001B[0;32m 702\u001B[0m \u001B[38;5;66;03m# Make the request on the httplib connection object.\u001B[39;00m\n\u001B[1;32m--> 703\u001B[0m httplib_response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_make_request\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m 704\u001B[0m \u001B[43m \u001B[49m\u001B[43mconn\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 705\u001B[0m \u001B[43m \u001B[49m\u001B[43mmethod\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 706\u001B[0m \u001B[43m \u001B[49m\u001B[43murl\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 707\u001B[0m \u001B[43m \u001B[49m\u001B[43mtimeout\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtimeout_obj\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 708\u001B[0m \u001B[43m \u001B[49m\u001B[43mbody\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mbody\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 709\u001B[0m \u001B[43m \u001B[49m\u001B[43mheaders\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mheaders\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 710\u001B[0m \u001B[43m \u001B[49m\u001B[43mchunked\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mchunked\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 711\u001B[0m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 713\u001B[0m \u001B[38;5;66;03m# If we're going to release the connection in ``finally:``, then\u001B[39;00m\n\u001B[0;32m 714\u001B[0m \u001B[38;5;66;03m# the response doesn't need to know about the connection. Otherwise\u001B[39;00m\n\u001B[0;32m 715\u001B[0m \u001B[38;5;66;03m# it will also try to release it and we'll have a double-release\u001B[39;00m\n\u001B[0;32m 716\u001B[0m \u001B[38;5;66;03m# mess.\u001B[39;00m\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\urllib3\\connectionpool.py:449\u001B[0m, in \u001B[0;36mHTTPConnectionPool._make_request\u001B[1;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001B[0m\n\u001B[0;32m 445\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mBaseException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 446\u001B[0m \u001B[38;5;66;03m# Remove the TypeError from the exception chain in\u001B[39;00m\n\u001B[0;32m 447\u001B[0m \u001B[38;5;66;03m# Python 3 (including for exceptions like SystemExit).\u001B[39;00m\n\u001B[0;32m 448\u001B[0m \u001B[38;5;66;03m# Otherwise it looks like a bug in the code.\u001B[39;00m\n\u001B[1;32m--> 449\u001B[0m \u001B[43msix\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mraise_from\u001B[49m\u001B[43m(\u001B[49m\u001B[43me\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mNone\u001B[39;49;00m\u001B[43m)\u001B[49m\n\u001B[0;32m 450\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m (SocketTimeout, BaseSSLError, SocketError) \u001B[38;5;28;01mas\u001B[39;00m e:\n", - "File \u001B[1;32m:3\u001B[0m, in \u001B[0;36mraise_from\u001B[1;34m(value, from_value)\u001B[0m\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\urllib3\\connectionpool.py:444\u001B[0m, in \u001B[0;36mHTTPConnectionPool._make_request\u001B[1;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001B[0m\n\u001B[0;32m 443\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m--> 444\u001B[0m httplib_response \u001B[38;5;241m=\u001B[39m \u001B[43mconn\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mgetresponse\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 445\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mBaseException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 446\u001B[0m \u001B[38;5;66;03m# Remove the TypeError from the exception chain in\u001B[39;00m\n\u001B[0;32m 447\u001B[0m \u001B[38;5;66;03m# Python 3 (including for exceptions like SystemExit).\u001B[39;00m\n\u001B[0;32m 448\u001B[0m \u001B[38;5;66;03m# Otherwise it looks like a bug in the code.\u001B[39;00m\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\http\\client.py:1377\u001B[0m, in \u001B[0;36mHTTPConnection.getresponse\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 1376\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m-> 1377\u001B[0m \u001B[43mresponse\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mbegin\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 1378\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mConnectionError\u001B[39;00m:\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\http\\client.py:320\u001B[0m, in \u001B[0;36mHTTPResponse.begin\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 319\u001B[0m \u001B[38;5;28;01mwhile\u001B[39;00m \u001B[38;5;28;01mTrue\u001B[39;00m:\n\u001B[1;32m--> 320\u001B[0m version, status, reason \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_read_status\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 321\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m status \u001B[38;5;241m!=\u001B[39m CONTINUE:\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\http\\client.py:281\u001B[0m, in \u001B[0;36mHTTPResponse._read_status\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 280\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21m_read_status\u001B[39m(\u001B[38;5;28mself\u001B[39m):\n\u001B[1;32m--> 281\u001B[0m line \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mstr\u001B[39m(\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mfp\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mreadline\u001B[49m\u001B[43m(\u001B[49m\u001B[43m_MAXLINE\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m+\u001B[39;49m\u001B[43m \u001B[49m\u001B[38;5;241;43m1\u001B[39;49m\u001B[43m)\u001B[49m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124miso-8859-1\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m 282\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(line) \u001B[38;5;241m>\u001B[39m _MAXLINE:\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\socket.py:704\u001B[0m, in \u001B[0;36mSocketIO.readinto\u001B[1;34m(self, b)\u001B[0m\n\u001B[0;32m 703\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m--> 704\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_sock\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrecv_into\u001B[49m\u001B[43m(\u001B[49m\u001B[43mb\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 705\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m timeout:\n", - "\u001B[1;31mConnectionResetError\u001B[0m: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001B[1;31mProtocolError\u001B[0m Traceback (most recent call last)", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\requests\\adapters.py:486\u001B[0m, in \u001B[0;36mHTTPAdapter.send\u001B[1;34m(self, request, stream, timeout, verify, cert, proxies)\u001B[0m\n\u001B[0;32m 485\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m--> 486\u001B[0m resp \u001B[38;5;241m=\u001B[39m \u001B[43mconn\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43murlopen\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m 487\u001B[0m \u001B[43m \u001B[49m\u001B[43mmethod\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mrequest\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mmethod\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 488\u001B[0m \u001B[43m \u001B[49m\u001B[43murl\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43murl\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 489\u001B[0m \u001B[43m \u001B[49m\u001B[43mbody\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mrequest\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mbody\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 490\u001B[0m \u001B[43m \u001B[49m\u001B[43mheaders\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mrequest\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mheaders\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 491\u001B[0m \u001B[43m \u001B[49m\u001B[43mredirect\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43;01mFalse\u001B[39;49;00m\u001B[43m,\u001B[49m\n\u001B[0;32m 492\u001B[0m \u001B[43m \u001B[49m\u001B[43massert_same_host\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43;01mFalse\u001B[39;49;00m\u001B[43m,\u001B[49m\n\u001B[0;32m 493\u001B[0m \u001B[43m \u001B[49m\u001B[43mpreload_content\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43;01mFalse\u001B[39;49;00m\u001B[43m,\u001B[49m\n\u001B[0;32m 494\u001B[0m \u001B[43m \u001B[49m\u001B[43mdecode_content\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43;01mFalse\u001B[39;49;00m\u001B[43m,\u001B[49m\n\u001B[0;32m 495\u001B[0m \u001B[43m \u001B[49m\u001B[43mretries\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mmax_retries\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 496\u001B[0m \u001B[43m \u001B[49m\u001B[43mtimeout\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtimeout\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 497\u001B[0m \u001B[43m \u001B[49m\u001B[43mchunked\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mchunked\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 498\u001B[0m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 500\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m (ProtocolError, \u001B[38;5;167;01mOSError\u001B[39;00m) \u001B[38;5;28;01mas\u001B[39;00m err:\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\urllib3\\connectionpool.py:787\u001B[0m, in \u001B[0;36mHTTPConnectionPool.urlopen\u001B[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001B[0m\n\u001B[0;32m 785\u001B[0m e \u001B[38;5;241m=\u001B[39m ProtocolError(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mConnection aborted.\u001B[39m\u001B[38;5;124m\"\u001B[39m, e)\n\u001B[1;32m--> 787\u001B[0m retries \u001B[38;5;241m=\u001B[39m \u001B[43mretries\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mincrement\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m 788\u001B[0m \u001B[43m \u001B[49m\u001B[43mmethod\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43murl\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43merror\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43me\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m_pool\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m_stacktrace\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43msys\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mexc_info\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;241;43m2\u001B[39;49m\u001B[43m]\u001B[49m\n\u001B[0;32m 789\u001B[0m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 790\u001B[0m retries\u001B[38;5;241m.\u001B[39msleep()\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\urllib3\\util\\retry.py:550\u001B[0m, in \u001B[0;36mRetry.increment\u001B[1;34m(self, method, url, response, error, _pool, _stacktrace)\u001B[0m\n\u001B[0;32m 549\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m read \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mFalse\u001B[39;00m \u001B[38;5;129;01mor\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_is_method_retryable(method):\n\u001B[1;32m--> 550\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[43msix\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mreraise\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mtype\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43merror\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43merror\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m_stacktrace\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 551\u001B[0m \u001B[38;5;28;01melif\u001B[39;00m read \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\urllib3\\packages\\six.py:769\u001B[0m, in \u001B[0;36mreraise\u001B[1;34m(tp, value, tb)\u001B[0m\n\u001B[0;32m 768\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m value\u001B[38;5;241m.\u001B[39m__traceback__ \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m tb:\n\u001B[1;32m--> 769\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m value\u001B[38;5;241m.\u001B[39mwith_traceback(tb)\n\u001B[0;32m 770\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m value\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\urllib3\\connectionpool.py:703\u001B[0m, in \u001B[0;36mHTTPConnectionPool.urlopen\u001B[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001B[0m\n\u001B[0;32m 702\u001B[0m \u001B[38;5;66;03m# Make the request on the httplib connection object.\u001B[39;00m\n\u001B[1;32m--> 703\u001B[0m httplib_response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_make_request\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m 704\u001B[0m \u001B[43m \u001B[49m\u001B[43mconn\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 705\u001B[0m \u001B[43m \u001B[49m\u001B[43mmethod\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 706\u001B[0m \u001B[43m \u001B[49m\u001B[43murl\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 707\u001B[0m \u001B[43m \u001B[49m\u001B[43mtimeout\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtimeout_obj\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 708\u001B[0m \u001B[43m \u001B[49m\u001B[43mbody\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mbody\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 709\u001B[0m \u001B[43m \u001B[49m\u001B[43mheaders\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mheaders\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 710\u001B[0m \u001B[43m \u001B[49m\u001B[43mchunked\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mchunked\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m 711\u001B[0m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 713\u001B[0m \u001B[38;5;66;03m# If we're going to release the connection in ``finally:``, then\u001B[39;00m\n\u001B[0;32m 714\u001B[0m \u001B[38;5;66;03m# the response doesn't need to know about the connection. Otherwise\u001B[39;00m\n\u001B[0;32m 715\u001B[0m \u001B[38;5;66;03m# it will also try to release it and we'll have a double-release\u001B[39;00m\n\u001B[0;32m 716\u001B[0m \u001B[38;5;66;03m# mess.\u001B[39;00m\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\urllib3\\connectionpool.py:449\u001B[0m, in \u001B[0;36mHTTPConnectionPool._make_request\u001B[1;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001B[0m\n\u001B[0;32m 445\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mBaseException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 446\u001B[0m \u001B[38;5;66;03m# Remove the TypeError from the exception chain in\u001B[39;00m\n\u001B[0;32m 447\u001B[0m \u001B[38;5;66;03m# Python 3 (including for exceptions like SystemExit).\u001B[39;00m\n\u001B[0;32m 448\u001B[0m \u001B[38;5;66;03m# Otherwise it looks like a bug in the code.\u001B[39;00m\n\u001B[1;32m--> 449\u001B[0m \u001B[43msix\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mraise_from\u001B[49m\u001B[43m(\u001B[49m\u001B[43me\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mNone\u001B[39;49;00m\u001B[43m)\u001B[49m\n\u001B[0;32m 450\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m (SocketTimeout, BaseSSLError, SocketError) \u001B[38;5;28;01mas\u001B[39;00m e:\n", - "File \u001B[1;32m:3\u001B[0m, in \u001B[0;36mraise_from\u001B[1;34m(value, from_value)\u001B[0m\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\urllib3\\connectionpool.py:444\u001B[0m, in \u001B[0;36mHTTPConnectionPool._make_request\u001B[1;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001B[0m\n\u001B[0;32m 443\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m--> 444\u001B[0m httplib_response \u001B[38;5;241m=\u001B[39m \u001B[43mconn\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mgetresponse\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 445\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mBaseException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 446\u001B[0m \u001B[38;5;66;03m# Remove the TypeError from the exception chain in\u001B[39;00m\n\u001B[0;32m 447\u001B[0m \u001B[38;5;66;03m# Python 3 (including for exceptions like SystemExit).\u001B[39;00m\n\u001B[0;32m 448\u001B[0m \u001B[38;5;66;03m# Otherwise it looks like a bug in the code.\u001B[39;00m\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\http\\client.py:1377\u001B[0m, in \u001B[0;36mHTTPConnection.getresponse\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 1376\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m-> 1377\u001B[0m \u001B[43mresponse\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mbegin\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 1378\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mConnectionError\u001B[39;00m:\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\http\\client.py:320\u001B[0m, in \u001B[0;36mHTTPResponse.begin\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 319\u001B[0m \u001B[38;5;28;01mwhile\u001B[39;00m \u001B[38;5;28;01mTrue\u001B[39;00m:\n\u001B[1;32m--> 320\u001B[0m version, status, reason \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_read_status\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 321\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m status \u001B[38;5;241m!=\u001B[39m CONTINUE:\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\http\\client.py:281\u001B[0m, in \u001B[0;36mHTTPResponse._read_status\u001B[1;34m(self)\u001B[0m\n\u001B[0;32m 280\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21m_read_status\u001B[39m(\u001B[38;5;28mself\u001B[39m):\n\u001B[1;32m--> 281\u001B[0m line \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mstr\u001B[39m(\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mfp\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mreadline\u001B[49m\u001B[43m(\u001B[49m\u001B[43m_MAXLINE\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m+\u001B[39;49m\u001B[43m \u001B[49m\u001B[38;5;241;43m1\u001B[39;49m\u001B[43m)\u001B[49m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124miso-8859-1\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m 282\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(line) \u001B[38;5;241m>\u001B[39m _MAXLINE:\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\socket.py:704\u001B[0m, in \u001B[0;36mSocketIO.readinto\u001B[1;34m(self, b)\u001B[0m\n\u001B[0;32m 703\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[1;32m--> 704\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_sock\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrecv_into\u001B[49m\u001B[43m(\u001B[49m\u001B[43mb\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 705\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m timeout:\n", - "\u001B[1;31mProtocolError\u001B[0m: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001B[1;31mConnectionError\u001B[0m Traceback (most recent call last)", - "Cell \u001B[1;32mIn[29], line 1\u001B[0m\n\u001B[1;32m----> 1\u001B[0m gj \u001B[38;5;241m=\u001B[39m \u001B[43ma\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdownload\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 2\u001B[0m gj\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\openeo\\rest\\datacube.py:1950\u001B[0m, in \u001B[0;36mDataCube.download\u001B[1;34m(self, outputfile, format, options)\u001B[0m\n\u001B[0;32m 1948\u001B[0m \u001B[38;5;28mformat\u001B[39m \u001B[38;5;241m=\u001B[39m guess_format(outputfile)\n\u001B[0;32m 1949\u001B[0m cube \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_ensure_save_result(\u001B[38;5;28mformat\u001B[39m\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mformat\u001B[39m, options\u001B[38;5;241m=\u001B[39moptions)\n\u001B[1;32m-> 1950\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_connection\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mdownload\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcube\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mflat_graph\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43moutputfile\u001B[49m\u001B[43m)\u001B[49m\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\openeo\\rest\\connection.py:1404\u001B[0m, in \u001B[0;36mConnection.download\u001B[1;34m(self, graph, outputfile, timeout)\u001B[0m\n\u001B[0;32m 1393\u001B[0m \u001B[38;5;250m\u001B[39m\u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m 1394\u001B[0m \u001B[38;5;124;03mDownloads the result of a process graph synchronously,\u001B[39;00m\n\u001B[0;32m 1395\u001B[0m \u001B[38;5;124;03mand save the result to the given file or return bytes object if no outputfile is specified.\u001B[39;00m\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 1401\u001B[0m \u001B[38;5;124;03m:param timeout: timeout to wait for response\u001B[39;00m\n\u001B[0;32m 1402\u001B[0m \u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m 1403\u001B[0m request \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_build_request_with_process_graph(process_graph\u001B[38;5;241m=\u001B[39mgraph)\n\u001B[1;32m-> 1404\u001B[0m response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mpost\u001B[49m\u001B[43m(\u001B[49m\u001B[43mpath\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43m/result\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mjson\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mrequest\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mexpected_status\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;241;43m200\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;28;43;01mTrue\u001B[39;49;00m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mtimeout\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtimeout\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 1406\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m outputfile \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m 1407\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m Path(outputfile)\u001B[38;5;241m.\u001B[39mopen(mode\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mwb\u001B[39m\u001B[38;5;124m\"\u001B[39m) \u001B[38;5;28;01mas\u001B[39;00m f:\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\openeo\\rest\\connection.py:190\u001B[0m, in \u001B[0;36mRestApiConnection.post\u001B[1;34m(self, path, json, **kwargs)\u001B[0m\n\u001B[0;32m 182\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mpost\u001B[39m(\u001B[38;5;28mself\u001B[39m, path: \u001B[38;5;28mstr\u001B[39m, json: Optional[\u001B[38;5;28mdict\u001B[39m] \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m Response:\n\u001B[0;32m 183\u001B[0m \u001B[38;5;250m \u001B[39m\u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m 184\u001B[0m \u001B[38;5;124;03m Do POST request to REST API.\u001B[39;00m\n\u001B[0;32m 185\u001B[0m \n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 188\u001B[0m \u001B[38;5;124;03m :return: response: Response\u001B[39;00m\n\u001B[0;32m 189\u001B[0m \u001B[38;5;124;03m \"\"\"\u001B[39;00m\n\u001B[1;32m--> 190\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mrequest(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpost\u001B[39m\u001B[38;5;124m\"\u001B[39m, path\u001B[38;5;241m=\u001B[39mpath, json\u001B[38;5;241m=\u001B[39mjson, allow_redirects\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mFalse\u001B[39;00m, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\openeo\\rest\\connection.py:727\u001B[0m, in \u001B[0;36mConnection.request\u001B[1;34m(self, method, path, headers, auth, check_error, expected_status, **kwargs)\u001B[0m\n\u001B[0;32m 720\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28msuper\u001B[39m(Connection, \u001B[38;5;28mself\u001B[39m)\u001B[38;5;241m.\u001B[39mrequest(\n\u001B[0;32m 721\u001B[0m method\u001B[38;5;241m=\u001B[39mmethod, path\u001B[38;5;241m=\u001B[39mpath, headers\u001B[38;5;241m=\u001B[39mheaders, auth\u001B[38;5;241m=\u001B[39mauth,\n\u001B[0;32m 722\u001B[0m check_error\u001B[38;5;241m=\u001B[39mcheck_error, expected_status\u001B[38;5;241m=\u001B[39mexpected_status, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs,\n\u001B[0;32m 723\u001B[0m )\n\u001B[0;32m 725\u001B[0m \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m 726\u001B[0m \u001B[38;5;66;03m# Initial request attempt\u001B[39;00m\n\u001B[1;32m--> 727\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43m_request\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 728\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m OpenEoApiError \u001B[38;5;28;01mas\u001B[39;00m api_exc:\n\u001B[0;32m 729\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m api_exc\u001B[38;5;241m.\u001B[39mhttp_status_code \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m403\u001B[39m \u001B[38;5;129;01mand\u001B[39;00m api_exc\u001B[38;5;241m.\u001B[39mcode \u001B[38;5;241m==\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mTokenInvalid\u001B[39m\u001B[38;5;124m\"\u001B[39m:\n\u001B[0;32m 730\u001B[0m \u001B[38;5;66;03m# Auth token expired: can we refresh?\u001B[39;00m\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\openeo\\rest\\connection.py:720\u001B[0m, in \u001B[0;36mConnection.request.._request\u001B[1;34m()\u001B[0m\n\u001B[0;32m 719\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21m_request\u001B[39m():\n\u001B[1;32m--> 720\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28msuper\u001B[39m(Connection, \u001B[38;5;28mself\u001B[39m)\u001B[38;5;241m.\u001B[39mrequest(\n\u001B[0;32m 721\u001B[0m method\u001B[38;5;241m=\u001B[39mmethod, path\u001B[38;5;241m=\u001B[39mpath, headers\u001B[38;5;241m=\u001B[39mheaders, auth\u001B[38;5;241m=\u001B[39mauth,\n\u001B[0;32m 722\u001B[0m check_error\u001B[38;5;241m=\u001B[39mcheck_error, expected_status\u001B[38;5;241m=\u001B[39mexpected_status, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs,\n\u001B[0;32m 723\u001B[0m )\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\openeo\\rest\\connection.py:119\u001B[0m, in \u001B[0;36mRestApiConnection.request\u001B[1;34m(self, method, path, headers, auth, check_error, expected_status, **kwargs)\u001B[0m\n\u001B[0;32m 115\u001B[0m _log\u001B[38;5;241m.\u001B[39mdebug(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mRequest `\u001B[39m\u001B[38;5;132;01m{m}\u001B[39;00m\u001B[38;5;124m \u001B[39m\u001B[38;5;132;01m{u}\u001B[39;00m\u001B[38;5;124m` with headers \u001B[39m\u001B[38;5;132;01m{h}\u001B[39;00m\u001B[38;5;124m, auth \u001B[39m\u001B[38;5;132;01m{a}\u001B[39;00m\u001B[38;5;124m, kwargs \u001B[39m\u001B[38;5;132;01m{k}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;241m.\u001B[39mformat(\n\u001B[0;32m 116\u001B[0m m\u001B[38;5;241m=\u001B[39mmethod\u001B[38;5;241m.\u001B[39mupper(), u\u001B[38;5;241m=\u001B[39murl, h\u001B[38;5;241m=\u001B[39mheaders \u001B[38;5;129;01mand\u001B[39;00m headers\u001B[38;5;241m.\u001B[39mkeys(), a\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mtype\u001B[39m(auth)\u001B[38;5;241m.\u001B[39m\u001B[38;5;18m__name__\u001B[39m, k\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mlist\u001B[39m(kwargs\u001B[38;5;241m.\u001B[39mkeys()))\n\u001B[0;32m 117\u001B[0m )\n\u001B[0;32m 118\u001B[0m \u001B[38;5;28;01mwith\u001B[39;00m ContextTimer() \u001B[38;5;28;01mas\u001B[39;00m timer:\n\u001B[1;32m--> 119\u001B[0m resp \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39msession\u001B[38;5;241m.\u001B[39mrequest(\n\u001B[0;32m 120\u001B[0m method\u001B[38;5;241m=\u001B[39mmethod,\n\u001B[0;32m 121\u001B[0m url\u001B[38;5;241m=\u001B[39murl,\n\u001B[0;32m 122\u001B[0m headers\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_merged_headers(headers),\n\u001B[0;32m 123\u001B[0m auth\u001B[38;5;241m=\u001B[39mauth,\n\u001B[0;32m 124\u001B[0m timeout\u001B[38;5;241m=\u001B[39mkwargs\u001B[38;5;241m.\u001B[39mpop(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtimeout\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mdefault_timeout),\n\u001B[0;32m 125\u001B[0m \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs\n\u001B[0;32m 126\u001B[0m )\n\u001B[0;32m 127\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m slow_response_threshold \u001B[38;5;129;01mand\u001B[39;00m timer\u001B[38;5;241m.\u001B[39melapsed() \u001B[38;5;241m>\u001B[39m slow_response_threshold:\n\u001B[0;32m 128\u001B[0m _log\u001B[38;5;241m.\u001B[39mwarning(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mSlow response: `\u001B[39m\u001B[38;5;132;01m{m}\u001B[39;00m\u001B[38;5;124m \u001B[39m\u001B[38;5;132;01m{u}\u001B[39;00m\u001B[38;5;124m` took \u001B[39m\u001B[38;5;132;01m{e:.2f}\u001B[39;00m\u001B[38;5;124ms (>\u001B[39m\u001B[38;5;132;01m{t:.2f}\u001B[39;00m\u001B[38;5;124ms)\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;241m.\u001B[39mformat(\n\u001B[0;32m 129\u001B[0m m\u001B[38;5;241m=\u001B[39mmethod\u001B[38;5;241m.\u001B[39mupper(), u\u001B[38;5;241m=\u001B[39mstr_truncate(url, width\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m64\u001B[39m),\n\u001B[0;32m 130\u001B[0m e\u001B[38;5;241m=\u001B[39mtimer\u001B[38;5;241m.\u001B[39melapsed(), t\u001B[38;5;241m=\u001B[39mslow_response_threshold\n\u001B[0;32m 131\u001B[0m ))\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\requests\\sessions.py:589\u001B[0m, in \u001B[0;36mSession.request\u001B[1;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001B[0m\n\u001B[0;32m 584\u001B[0m send_kwargs \u001B[38;5;241m=\u001B[39m {\n\u001B[0;32m 585\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtimeout\u001B[39m\u001B[38;5;124m\"\u001B[39m: timeout,\n\u001B[0;32m 586\u001B[0m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mallow_redirects\u001B[39m\u001B[38;5;124m\"\u001B[39m: allow_redirects,\n\u001B[0;32m 587\u001B[0m }\n\u001B[0;32m 588\u001B[0m send_kwargs\u001B[38;5;241m.\u001B[39mupdate(settings)\n\u001B[1;32m--> 589\u001B[0m resp \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39msend(prep, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39msend_kwargs)\n\u001B[0;32m 591\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m resp\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\requests\\sessions.py:703\u001B[0m, in \u001B[0;36mSession.send\u001B[1;34m(self, request, **kwargs)\u001B[0m\n\u001B[0;32m 700\u001B[0m start \u001B[38;5;241m=\u001B[39m preferred_clock()\n\u001B[0;32m 702\u001B[0m \u001B[38;5;66;03m# Send the request\u001B[39;00m\n\u001B[1;32m--> 703\u001B[0m r \u001B[38;5;241m=\u001B[39m adapter\u001B[38;5;241m.\u001B[39msend(request, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[0;32m 705\u001B[0m \u001B[38;5;66;03m# Total elapsed time of the request (approximately)\u001B[39;00m\n\u001B[0;32m 706\u001B[0m elapsed \u001B[38;5;241m=\u001B[39m preferred_clock() \u001B[38;5;241m-\u001B[39m start\n", - "File \u001B[1;32m~\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\requests\\adapters.py:501\u001B[0m, in \u001B[0;36mHTTPAdapter.send\u001B[1;34m(self, request, stream, timeout, verify, cert, proxies)\u001B[0m\n\u001B[0;32m 486\u001B[0m resp \u001B[38;5;241m=\u001B[39m conn\u001B[38;5;241m.\u001B[39murlopen(\n\u001B[0;32m 487\u001B[0m method\u001B[38;5;241m=\u001B[39mrequest\u001B[38;5;241m.\u001B[39mmethod,\n\u001B[0;32m 488\u001B[0m url\u001B[38;5;241m=\u001B[39murl,\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 497\u001B[0m chunked\u001B[38;5;241m=\u001B[39mchunked,\n\u001B[0;32m 498\u001B[0m )\n\u001B[0;32m 500\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m (ProtocolError, \u001B[38;5;167;01mOSError\u001B[39;00m) \u001B[38;5;28;01mas\u001B[39;00m err:\n\u001B[1;32m--> 501\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mConnectionError\u001B[39;00m(err, request\u001B[38;5;241m=\u001B[39mrequest)\n\u001B[0;32m 503\u001B[0m \u001B[38;5;28;01mexcept\u001B[39;00m MaxRetryError \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m 504\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(e\u001B[38;5;241m.\u001B[39mreason, ConnectTimeoutError):\n\u001B[0;32m 505\u001B[0m \u001B[38;5;66;03m# TODO: Remove this in 3.0.0: see #2811\u001B[39;00m\n", - "\u001B[1;31mConnectionError\u001B[0m: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))" - ] - } - ], - "source": [ - "gj = a.download()\n", - "gj" - ], - "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-11-16T14:57:00.525189300Z", - "start_time": "2023-11-16T14:45:57.505572900Z" - } - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "result = connection.execute({\"process\": {\n", - " \"id\": \"load_collection\",\n", - " \"parameters\": {\n", - " \"id\": \"geodb_b34bfae7-9265-4a3e-b921-06549d3c6035~populated_places_sub\",\n", - " \"spatial_extent\": {\n", - " \"bbox\": \"(33, -10, 71, 43)\"\n", - " }\n", - " }\n", - "}})\n", - "result" + "Show the collection's items, but not using the openeo-client's function -- it has a bug. Rather, we're using the direct URL:\n", + "https://geodb.openeo.dev.brockmann-consult.de/collections/geodb_b34bfae7-9265-4a3e-b921-06549d3c6035~alster_debug/items" ], "metadata": { "collapsed": false } }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "body = json.dumps({\"process\": {\n", - " \"id\": \"load_collection\",\n", - " \"parameters\": {\n", - " \"id\": \"populated_places_sub\",\n", - " \"spatial_extent\": {\n", - " \"bbox\": \"(33, -10, 71, 43)\"\n", - " }\n", - " }\n", - "}})\n", - "r = http.request('POST', f'{base_url}/result',\n", - " headers={'Content-Type': 'application/json'},\n", - " body=body)\n", - "vector_cube = json.loads(r.data)\n", - "vector_cube" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "vector_cube[20]" - ] - }, { "cell_type": "markdown", "source": [ - "## Validating some collections responses using the (3rd party) STAC validator software\n", - "Preparation:" + "Show the processes currently implemented in the geoDB openEO backend:" ], "metadata": { "collapsed": false @@ -328,52 +119,52 @@ "metadata": {}, "outputs": [], "source": [ - "from stac_validator import stac_validator\n", - "import json" + "geodb.list_processes()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Validate response for collection `AT_2021_EC21`:" + "## Use Case 1\n", + "Load a collection using the process `LoadCollection`, which is internally used by the openeo-client function `load_collection`. Then download the collection using the process `SaveResult`, which is also internally used by the openeo-client function `download`.\n", + "Ignore the warning message: the openeo-client complains about the unknown dimension type 'geometry', but this is specified in the STAC extension 'datacube', so it is fine." ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, "outputs": [], "source": [ - "stac = stac_validator.StacValidate(f'{base_url}/collections/AT_2021_EC21')\n", - "stac.run()\n", - "print(json.dumps(stac.message[0], indent=2))" - ] + "collection = geodb.load_collection('openeo~pop_hamburg')\n", + "collection.download('./hamburg-pop.json', 'GeoJSON')" + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ - "Validate response for collection `populated_places_sub`:" - ] + "Open the downloaded data in a GeoDataFrame, and visualise its geometries:" + ], + "metadata": { + "collapsed": false + } }, { "cell_type": "code", "execution_count": null, - "metadata": {}, "outputs": [], "source": [ - "stac = stac_validator.StacValidate(f'{base_url}/collections/populated_places_sub')\n", - "stac.run()\n", - "print(json.dumps(stac.message[0], indent=2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] + "import geopandas\n", + "gdf = geopandas.read_file('./hamburg-pop.json')\n", + "\n", + "gdf.plot()" + ], + "metadata": { + "collapsed": false + } } ], "metadata": { diff --git a/notebooks/geoDB-openEO_use_case_2.ipynb b/notebooks/geoDB-openEO_use_case_2.ipynb index 016df31..68d3abb 100644 --- a/notebooks/geoDB-openEO_use_case_2.ipynb +++ b/notebooks/geoDB-openEO_use_case_2.ipynb @@ -17,31 +17,10 @@ }, { "cell_type": "code", - "execution_count": 195, + "execution_count": null, "id": "edcce2fdfc4a403a", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T12:29:14.121770200Z", - "start_time": "2023-11-21T12:29:09.707648900Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Authenticated using refresh token.\n" - ] - }, - { - "data": { - "text/plain": "" - }, - "execution_count": 195, - "metadata": {}, - "output_type": "execute_result" - } - ], + "metadata": {}, + "outputs": [], "source": [ "import openeo\n", "\n", @@ -74,25 +53,12 @@ }, { "cell_type": "code", - "execution_count": 197, + "execution_count": null, "id": "7903b501d68f258c", "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-11-21T12:30:01.039006100Z", - "start_time": "2023-11-21T12:29:57.851719100Z" - } + "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\Thomas\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\openeo\\metadata.py:272: UserWarning: Unknown dimension type 'geometry'\n", - " complain(\"Unknown dimension type {t!r}\".format(t=dim_type))\n" - ] - } - ], + "outputs": [], "source": [ "hamburg = geodb.load_collection('openeo~pop_hamburg')\n", "hamburg = hamburg.aggregate_temporal([['2000-01-01', '2030-01-05']], 'mean', context={'pattern': '%Y-%M-%d'})\n", @@ -113,14 +79,9 @@ }, { "cell_type": "code", - "execution_count": 198, + "execution_count": null, "id": "ab0edbcf-c37d-4ccf-b533-70d8877c9419", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T12:30:04.400251400Z", - "start_time": "2023-11-21T12:30:04.324929800Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "olci = cdse.load_collection(\"SENTINEL3_OLCI_L1B\",\n", @@ -147,42 +108,10 @@ }, { "cell_type": "code", - "execution_count": 199, + "execution_count": null, "id": "f056401a-65de-48bd-9f73-1915ea47b14f", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T12:35:20.038996Z", - "start_time": "2023-11-21T12:32:44.537780900Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0:00:00 Job 'j-231121366e30458cba494dc68f586106': send 'start'\n", - "0:00:14 Job 'j-231121366e30458cba494dc68f586106': created (progress N/A)\n", - "0:00:19 Job 'j-231121366e30458cba494dc68f586106': created (progress N/A)\n", - "0:00:26 Job 'j-231121366e30458cba494dc68f586106': running (progress N/A)\n", - "0:00:34 Job 'j-231121366e30458cba494dc68f586106': running (progress N/A)\n", - "0:00:45 Job 'j-231121366e30458cba494dc68f586106': running (progress N/A)\n", - "0:00:57 Job 'j-231121366e30458cba494dc68f586106': running (progress N/A)\n", - "0:01:13 Job 'j-231121366e30458cba494dc68f586106': running (progress N/A)\n", - "0:01:32 Job 'j-231121366e30458cba494dc68f586106': running (progress N/A)\n", - "0:01:56 Job 'j-231121366e30458cba494dc68f586106': running (progress N/A)\n", - "0:02:34 Job 'j-231121366e30458cba494dc68f586106': finished (progress N/A)\n" - ] - }, - { - "data": { - "text/plain": "", - "text/html": "\n \n \n \n \n " - }, - "execution_count": 199, - "metadata": {}, - "output_type": "execute_result" - } - ], + "metadata": {}, + "outputs": [], "source": [ "import json\n", "with open('./hamburg_mean.json') as f:\n", @@ -207,14 +136,9 @@ }, { "cell_type": "code", - "execution_count": 200, + "execution_count": null, "id": "1868c72e-cfb0-458b-82bf-a6e0b57e15d9", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T12:35:55.233822700Z", - "start_time": "2023-11-21T12:35:53.770154Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "result_file = job.get_results().download_files(\"output\")[0]\n", @@ -237,14 +161,9 @@ }, { "cell_type": "code", - "execution_count": 201, + "execution_count": null, "id": "f17b7277-2b4a-40d4-b982-f51a0b57915c", - "metadata": { - "ExecuteTime": { - "end_time": "2023-11-21T12:36:14.012885700Z", - "start_time": "2023-11-21T12:36:13.944682300Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "import geopandas\n", @@ -266,25 +185,12 @@ }, { "cell_type": "code", - "execution_count": 208, + "execution_count": null, "id": "2316d61c-261c-41af-8de6-a5aa30367d0b", "metadata": { - "scrolled": true, - "ExecuteTime": { - "end_time": "2023-11-21T12:46:36.319701800Z", - "start_time": "2023-11-21T12:46:35.884355700Z" - } + "scrolled": true }, - "outputs": [ - { - "data": { - "text/plain": "
", - "image/png": "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t/WdOnWKu+66i3nz5tWY3IEqc1cNw/C4VeG0adM4efJkxe3IkSPevEylAlqYLcxzIaVUwKrTJzwmJoZevXqxd+9ep/u6detGt27dGDx4MBdccAFpaWlMmzatyvP379/PoUOHuOGGGyruKy8vl8DCwti9ezcJCQmEhoZWaV0fO3asSivcVWRkJJGROrJWKaVU8KjTPO7i4mJ27txJfHx8tWUMw6C4uNjtY927d2f79u1kZmZW3G688caKVntCQgIRERH069eP9PR0p+emp6czZMiQuoSvlFJKBRyfWtxTp07lhhtuoFOnThw7doy//OUv5OfnM2HCBAoKCnj22We58cYbiY+PJy8vjzlz5nD06FFuu+22ijrGjx/Peeedx4wZM4iKiqJnz55OxzjnnHMAnO6fMmUK48aNo3///qSkpDB37lyysrK4//776/DSlVJKqcDjU+I+evQod9xxB7m5ubRt25bBgwezadMmEhMTKSoqYteuXSxcuJDc3Fxat27NgAEDWLt2LcnJlQNnsrKyCAnxraE/evRo8vLyePrpp8nOzqZnz54sXbqUxESdq6qUUqppsRmGYVgdRGPJz88nNjaWkydP0rJlS6vDUUqpJku/j2tP1ypXSimlAogmbqWUUiqAaOJWSimlAogmbqWUUiqAaOJWSimlAogmbqWUUiqAaOJWSimlAogmbqWUUiqAaOJWSimlAkiT2v/PsUhcfn6+xZEopVTT5vgebkKLd9abJpW4T506BUBCQoLFkSillAL5Xo6NjbU6jIDSpNYqLy8v54cffqBFixbYbDarw6kX+fn5JCQkcOTIkSa73q++B0LfB6Hvg/D398EwDE6dOkWHDh183niqqWtSLe6QkBA6duxodRgNomXLln754WxM+h4IfR+Evg/Cn98HbWnXjp7mKKWUUgFEE7dSSikVQDRxB7jIyEiefPJJIiMjrQ7FMvoeCH0fhL4PQt+H4NWkBqcppZRSgU5b3EoppVQA0cStlFJKBRBN3EoppVQA0cStlFJKBRBN3H7s1KlTPPzwwyQmJhIdHc2QIUPYvHlzjc95++236dOnD82aNSM+Pp577rmHvLy8Roq4YdTmffi///s/evToQXR0NBdeeCFvvPFGI0VbP7788ktuuOEGOnTogM1m46OPPnJ63DAMpk+fTocOHYiOjuaKK65gx44dHut9//33ueiii4iMjOSiiy7iww8/bKBXUD8a4n3YsWMHt9xyC507d8Zms/Hyyy833AuoJw3xPsybN49hw4bRqlUrWrVqxYgRI/jqq68a8FWo+qKJ249NnDiR9PR03nzzTbZv305qaiojRozg+++/d1t+3bp1jB8/nnvvvZcdO3bw73//m82bNzNx4sRGjrx++fo+vPrqq0ybNo3p06ezY8cOnnrqKSZNmsQnn3zSyJHXXkFBAX369GH27NluH3/hhReYOXMms2fPZvPmzcTFxXH11VdXrMfvzsaNGxk9ejTjxo3j66+/Zty4cdx+++1kZGQ01Muos4Z4HwoLC+natSvPP/88cXFxDRV6vWqI92H16tXccccdfPHFF2zcuJFOnTqRmppa7edK+RFD+aXCwkIjNDTUWLJkidP9ffr0MZ544gm3z3nxxReNrl27Ot33yiuvGB07dmywOBtabd6HlJQUY+rUqU73TZ482Rg6dGiDxdmQAOPDDz+s+L28vNyIi4sznn/++Yr7ioqKjNjYWOMf//hHtfXcfvvtxrXXXut03zXXXGOMGTOm3mNuCPX1PpglJiYas2bNqudIG1ZDvA+GYRilpaVGixYtjIULF9ZnuKoBaIvbT5WWllJWVkZUVJTT/dHR0axbt87tc4YMGcLRo0dZunQphmHw448/8t5773Hdddc1RsgNojbvQ3FxsdvyX331FWfPnm2wWBvLwYMHycnJITU1teK+yMhILr/8cjZs2FDt8zZu3Oj0HIBrrrmmxuf4s9q+D8Gmvt6HwsJCzp49y7nnntsQYap6pInbT7Vo0YKUlBSeeeYZfvjhB8rKynjrrbfIyMggOzvb7XOGDBnC22+/zejRo4mIiCAuLo5zzjmHv//9740cff2pzftwzTXX8Nprr7FlyxYMw+C///0v8+fP5+zZs+Tm5jbyK6h/OTk5ALRv397p/vbt21c8Vt3zfH2OP6vt+xBs6ut9eOyxxzjvvPMYMWJEvcan6p8mbj/25ptvYhgG5513HpGRkbzyyivceeedhIaGui3/3Xff8dBDD/HnP/+ZLVu2sGzZMg4ePMj999/fyJHXL1/fhz/96U+MHDmSwYMHEx4ezqhRo7j77rsBqn1OIHLdmtYwDI/b1dbmOf4uGF9TbdTlfXjhhRd49913+eCDD6r0Vin/o4nbj51//vmsWbOG06dPc+TIkYqu3i5durgtP2PGDIYOHcrvf/97evfuzTXXXMOcOXOYP39+ta3TQODr+xAdHc38+fMpLCzk0KFDZGVl0blzZ1q0aEGbNm0aOfr65xhQ5dqaOnbsWJVWl+vzfH2OP6vt+xBs6vo+/O1vf+O5555jxYoV9O7du0FiVPVLE3cAiImJIT4+np9//pnly5czatQot+UKCwurbEjvaGEaQbAkvbfvg0N4eDgdO3YkNDSURYsWcf3111d5fwJRly5diIuLIz09veK+kpIS1qxZw5AhQ6p9XkpKitNzAFasWFHjc/xZbd+HYFOX9+HFF1/kmWeeYdmyZfTv37+hQ1X1xbJhccqjZcuWGZ999plx4MABY8WKFUafPn2MgQMHGiUlJYZhGMZjjz1mjBs3rqL866+/boSFhRlz5swx9u/fb6xbt87o37+/MXDgQKteQr3w9X3YvXu38eabbxp79uwxMjIyjNGjRxvnnnuucfDgQYtege9OnTplbNu2zdi2bZsBGDNnzjS2bdtmHD582DAMw3j++eeN2NhY44MPPjC2b99u3HHHHUZ8fLyRn59fUce4ceOMxx57rOL39evXG6Ghocbzzz9v7Ny503j++eeNsLAwY9OmTY3++rzVEO9DcXFxRZ3x8fHG1KlTjW3bthl79+5t9NfnrYZ4H/76178aERERxnvvvWdkZ2dX3E6dOtXor0/5RhO3H1u8eLHRtWtXIyIiwoiLizMmTZpknDhxouLxCRMmGJdffrnTc1555RXjoosuMqKjo434+Hhj7NixxtGjRxs58vrl6/vw3XffGRdffLERHR1ttGzZ0hg1apSxa9cuCyKvvS+++MIAqtwmTJhgGIZMAXryySeNuLg4IzIy0rjsssuM7du3O9Vx+eWXV5R3+Pe//21ceOGFRnh4uNG9e3fj/fffb6RXVDsN8T4cPHjQbZ2unyV/0hDvQ2Jiots6n3zyycZ7YapWdFtPpZRSKoAE/gU/pZRSqgnRxK2UUkoFEE3cSimlVADRxK2UUkoFEE3cSimlVADRxK2UUkoFEE3cSimlVADRxK2UUkoFEE3cSimlVADRxK2UUkoFEE3cSimlVADRxK2UUkoFkP8HZAcwZUKcxQYAAAAASUVORK5CYII=" - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "gdf['color'] = ['#006400', '#90EE90']\n", @@ -316,26 +222,8 @@ }, { "cell_type": "code", - "execution_count": 212, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\Thomas\\micromamba\\envs\\xcube-geodb-openeo\\lib\\site-packages\\openeo\\metadata.py:272: UserWarning: Unknown dimension type 'geometry'\n", - " complain(\"Unknown dimension type {t!r}\".format(t=dim_type))\n" - ] - }, - { - "data": { - "text/plain": " id geometry population \\\n0 1 POLYGON ((9.78652 53.60253, 9.98977 53.68638, ... 0.2 \n1 2 POLYGON ((9.78652 53.60253, 9.98977 53.68638, ... 0.4 \n2 3 POLYGON ((9.78652 53.60253, 9.98977 53.68638, ... 0.5 \n3 4 POLYGON ((9.78652 53.60253, 9.98977 53.68638, ... 0.9 \n4 5 POLYGON ((9.99389 53.69045, 10.00213 53.39996,... 0.4 \n5 6 POLYGON ((9.99389 53.69045, 10.00213 53.39996,... 0.9 \n6 7 POLYGON ((9.99389 53.69045, 10.00213 53.39996,... 0.5 \n7 8 POLYGON ((9.99389 53.69045, 10.00213 53.39996,... 0.8 \n\n date \n0 1990-01-01 00:00:00+00:00 \n1 2000-01-01 00:00:00+00:00 \n2 2010-01-01 00:00:00+00:00 \n3 2020-01-01 00:00:00+00:00 \n4 1990-01-01 00:00:00+00:00 \n5 2000-01-01 00:00:00+00:00 \n6 2010-01-01 00:00:00+00:00 \n7 2020-01-01 00:00:00+00:00 ", - "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
idgeometrypopulationdate
01POLYGON ((9.78652 53.60253, 9.98977 53.68638, ...0.21990-01-01 00:00:00+00:00
12POLYGON ((9.78652 53.60253, 9.98977 53.68638, ...0.42000-01-01 00:00:00+00:00
23POLYGON ((9.78652 53.60253, 9.98977 53.68638, ...0.52010-01-01 00:00:00+00:00
34POLYGON ((9.78652 53.60253, 9.98977 53.68638, ...0.92020-01-01 00:00:00+00:00
45POLYGON ((9.99389 53.69045, 10.00213 53.39996,...0.41990-01-01 00:00:00+00:00
56POLYGON ((9.99389 53.69045, 10.00213 53.39996,...0.92000-01-01 00:00:00+00:00
67POLYGON ((9.99389 53.69045, 10.00213 53.39996,...0.52010-01-01 00:00:00+00:00
78POLYGON ((9.99389 53.69045, 10.00213 53.39996,...0.82020-01-01 00:00:00+00:00
\n
" - }, - "execution_count": 212, - "metadata": {}, - "output_type": "execute_result" - } - ], + "execution_count": null, + "outputs": [], "source": [ "def apply_scaling(x: float) -> float:\n", " return x * 0.000001\n", @@ -351,11 +239,7 @@ "gdf[['id', 'geometry', 'population', 'date']]" ], "metadata": { - "collapsed": false, - "ExecuteTime": { - "end_time": "2023-11-21T12:54:31.080321700Z", - "start_time": "2023-11-21T12:54:27.851159Z" - } + "collapsed": false }, "id": "df0c0de2f826109a" } diff --git a/xcube_geodb_openeo/backend/processes.py b/xcube_geodb_openeo/backend/processes.py index e0cf188..78be6b3 100644 --- a/xcube_geodb_openeo/backend/processes.py +++ b/xcube_geodb_openeo/backend/processes.py @@ -171,65 +171,8 @@ def get_file_formats(self) -> Dict: } ] }, - "GPKG": { - "title": "OGC GeoPackage", - "gis_data_types": [ - "raster", - "vector" - ], - "parameters": { - "version": { - "type": "string", - "description": "Set GeoPackage version. In AUTO mode, this will be equivalent to 1.2 starting with GDAL 2.3.", - "enum": [ - "auto", - "1", - "1.1", - "1.2" - ], - "default": "auto" - } - }, - "links": [ - { - "href": "https://gdal.org/drivers/raster/gpkg.html", - "rel": "about", - "title": "GDAL on GeoPackage for raster data" - }, - { - "href": "https://gdal.org/drivers/vector/gpkg.html", - "rel": "about", - "title": "GDAL on GeoPackage for vector data" - } - ] - } }, "input": { - "GPKG": { - "title": "OGC GeoPackage", - "gis_data_types": [ - "raster", - "vector" - ], - "parameters": { - "table": { - "type": "string", - "description": "**RASTER ONLY.** Name of the table containing the tiles. If the GeoPackage dataset only contains one table, this option is not necessary. Otherwise, it is required." - } - }, - "links": [ - { - "href": "https://gdal.org/drivers/raster/gpkg.html", - "rel": "about", - "title": "GDAL on GeoPackage for raster data" - }, - { - "href": "https://gdal.org/drivers/vector/gpkg.html", - "rel": "about", - "title": "GDAL on GeoPackage for vector data" - } - ] - } } } # return {'input': [], 'output': ['GeoJSON']}