From c40ff0c79fc640545b558ec3ada63738070ca871 Mon Sep 17 00:00:00 2001 From: Martin Folkerts Date: Tue, 12 Dec 2023 11:20:05 +0100 Subject: [PATCH] updated scripts --- .gitignore | 1 + .idea/php.xml | 1 + .idea/smartCane.iml | 1 + build_report.sh | 16 +- laravel_app/app/Mail/ReportGenerated.php | 60 ++ laravel_app/routes/web.php | 6 +- python_app/Chemba_download.ipynb | 994 ++++++--------------- python_app/Chemba_download_old.ipynb | 1032 ++++++++++++++++++++++ r_app/1_harvest_data_EcoFarm_v2.R | 3 +- r_app/2_CI_data_prep.R | 256 ++++-- r_app/CI_report_dashboard_planet.Rmd | 144 +-- r_app/Rplots.pdf | Bin 0 -> 162782 bytes r_app/pivot_20210625.geojson | 159 ++++ r_app/r_app.Rproj | 13 + runcane.sh | 12 +- runpython.sh | 2 +- 16 files changed, 1829 insertions(+), 871 deletions(-) create mode 100644 laravel_app/app/Mail/ReportGenerated.php create mode 100644 python_app/Chemba_download_old.ipynb create mode 100644 r_app/Rplots.pdf create mode 100644 r_app/pivot_20210625.geojson create mode 100644 r_app/r_app.Rproj diff --git a/.gitignore b/.gitignore index 01f8967..da0265d 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ /r_app/*.Rdata .DS_Store +.Rproj.user diff --git a/.idea/php.xml b/.idea/php.xml index 635c8d4..4a1d1e0 100644 --- a/.idea/php.xml +++ b/.idea/php.xml @@ -134,6 +134,7 @@ + diff --git a/.idea/smartCane.iml b/.idea/smartCane.iml index d5c4c0f..3c7f70d 100644 --- a/.idea/smartCane.iml +++ b/.idea/smartCane.iml @@ -131,6 +131,7 @@ + diff --git a/build_report.sh b/build_report.sh index 856d78b..dd6da8f 100755 --- a/build_report.sh +++ b/build_report.sh @@ -1,7 +1,15 @@ #!/bin/bash ## Runnen van Rmd bestand # -e betekent "evalueren" en -i specificeert de input file -pwd -script_dir="$(dirname "$0")" -echo $script_dir; -Rscript -e "rmarkdown::render('${script_dir}/r_app/CI_Report_dashboard_planet.Rmd', 'all')" +Rscript --version +echo $PATH +#script_dir="$(dirname "$0")" +#echo $script_dir; +#/bin/ps aux | grep fontd + +echo '\n' + +echo 'zx28tb' | /usr/bin/sudo -S launchctl load -w /System/Library/LaunchAgents/com.apple.fontd.useragent.plist +cd /Users/mfolkerts/smartCane/r_app +Rscript -e "rmarkdown::render('/Users/mfolkerts/smartCane/r_app/CI_Report_dashboard_planet.Rmd', 'all')" + diff --git a/laravel_app/app/Mail/ReportGenerated.php b/laravel_app/app/Mail/ReportGenerated.php new file mode 100644 index 0000000..2f59e10 --- /dev/null +++ b/laravel_app/app/Mail/ReportGenerated.php @@ -0,0 +1,60 @@ +projectMailing->project->mail_subject, + from: [ + 'address' => 'noreply@'.config('app.domain'), + 'name' => 'Report Generator', + ], + to:$this->projectMailing->recipients->get('mame', 'email')->toArray(), + ); + } + + /** + * Get the message content definition. + */ + public function content(): Content + { + return new Content( + view: 'view.name', + ); + } + + /** + * Get the attachments for the message. + * + * @return array + */ + public function attachments(): array + { + return []; + } +} diff --git a/laravel_app/routes/web.php b/laravel_app/routes/web.php index 6785a14..d1d743d 100644 --- a/laravel_app/routes/web.php +++ b/laravel_app/routes/web.php @@ -16,7 +16,11 @@ Route::get('/', function () { return view('welcome'); }); - +if (env('APP_ENV') === 'local') { + Route::get('/mailable', function () { + return new App\Mail\ReportGenerated(App\Models\ProjectMailing::find(1)); + }); +} Route::middleware([ 'auth:sanctum', config('jetstream.auth_session'), diff --git a/python_app/Chemba_download.ipynb b/python_app/Chemba_download.ipynb index d0bf350..1679b90 100644 --- a/python_app/Chemba_download.ipynb +++ b/python_app/Chemba_download.ipynb @@ -4,9 +4,7 @@ "cell_type": "code", "execution_count": 1, "id": "b7ca7102-5fd9-481f-90cd-3ba60e288649", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "# $ pip install sentinelhub\n", @@ -31,22 +29,12 @@ "cell_type": "code", "execution_count": 2, "id": "330c967c-2742-4a7a-9a61-28bfdaf8eeca", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "#pip install pipreqs" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "8f2ec814-76b2-47e6-b74b-a4ffddd908f1", - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": 3, @@ -62,22 +50,18 @@ "cell_type": "code", "execution_count": 4, "id": "5491a840-779c-4f0c-8164-c3de738b3298", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ - "config.sh_client_id = '6e542a89-b040-40ca-8352-8b979ee3067a'\n", - "config.sh_client_secret = 'PiNaFQfP<.)59]rS.*}OF+hlrrzf#k~uqlhy-_F%'" + "config.sh_client_id = '1a72d811-4f0e-4447-8282-df09608cff44'\n", + "config.sh_client_secret = 'FcBlRL29i9ZmTzhmKTv1etSMFs5PxSos'" ] }, { "cell_type": "code", "execution_count": 5, "id": "eb1fb662-0e25-4ca9-8317-c6953290842b", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "collection_id = 'c691479f-358c-46b1-b0f0-e12b70a9856c'\n", @@ -91,9 +75,7 @@ "cell_type": "code", "execution_count": 6, "id": "244b5752-4f02-4347-9278-f6a0a46b88f4", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", @@ -103,17 +85,17 @@ "import numpy as np\n", "\n", "\n", - "def plot_image(image, factor=1.0, clip_range=None, **kwargs):\n", - " \"\"\"\n", - " Utility function for plotting RGB images.\n", - " \"\"\"\n", - " fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(15, 15))\n", - " if clip_range is not None:\n", - " ax.imshow(np.clip(image * factor, *clip_range), **kwargs)\n", - " else:\n", - " ax.imshow(image * factor, **kwargs)\n", - " ax.set_xticks([])\n", - " ax.set_yticks([]) \n", + "#def plot_image(image, factor=1.0, clip_range=None, **kwargs):\n", + "# \"\"\"\n", + "# Utility function for plotting RGB images.\n", + "# \"\"\"\n", + "# fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(15, 15))\n", + "# if clip_range is not None:\n", + "# ax.imshow(np.clip(image * factor, *clip_range), **kwargs)\n", + "# else:\n", + "## ax.imshow(image * factor, **kwargs)\n", + " # ax.set_xticks([])\n", + " # ax.set_yticks([]) \n", "\n", "\n", "#evalscript_true_color = \"\"\"\n", @@ -125,7 +107,8 @@ "# bands: [\"B1\", \"B2\", \"B3\", \"B4\", \"UDM\"]\n", "# }],\n", "# output: {\n", - "# bands: 5\n", + "# bands: 5,\n", + "# nodataValue: NA\n", "# }\n", "# };\n", "# }\n", @@ -141,40 +124,60 @@ " function setup() {\n", " return {\n", " input: [{\n", - " bands: [\"Blue\", \"Green\", \"Red\", \"NIR\", \"UDM\"]\n", + " bands: [\"Red\", \"Green\", \"Blue\", \"NIR\", \"UDM\"]\n", " }],\n", " output: {\n", - " bands: 5\n", + " bands: 2 \n", + " //sampleType: \"FLOAT32\"\n", " }\n", " };\n", " }\n", "\n", " function evaluatePixel(sample) {\n", - " return [2.5 * sample.Blue / 10000, 2.5 * sample.Green / 10000, 2.5 * sample.Red / 10000, 2.5 * sample.NIR / 10000, sample.UDM];\n", - " }\n", + " // Scale the bands\n", + " //var scaledBlue = [2.5 * sample.Blue / 10000];\n", + " var scaledGreen = [2.5 * sample.Green / 10000];\n", + " //var scaledRed = [2.5 * sample.Red / 10000];\n", + " var scaledNIR = [2.5 * sample.NIR / 10000];\n", + " \n", + " // Calculate the CI (Chlorophyll Index) using the scaled values\n", + " // var CI = [scaledNIR / scaledGreen - 1] ;\n", + "\n", + "// Output the scaled bands and CI\n", + " if (sample.UDM == 0) { \n", + " return [\n", + " //scaledRed,\n", + " scaledGreen,\n", + " // scaledBlue,\n", + " scaledNIR\n", + " // sample.UDM,\n", + " // CI,\n", + " ]\n", + " } else {\n", + " return [NaN, NaN]}\n", + " \n", + " }\n", "\"\"\"\n", + "\n", + "#def get_true_color_request(time_interval):\n", + "# return SentinelHubRequest(\n", + "# evalscript=evalscript_true_color,\n", + "# input_data=[\n", + "# SentinelHubRequest.input_data(\n", + " # data_collection=DataCollection.planet_data2,\n", + "# time_interval=time_interval\n", + "# )\n", + "# ],\n", + "# responses=[\n", + "# SentinelHubRequest.output_response('default', MimeType.TIFF)\n", + "# ],\n", + "# bbox=chemba_bbox,\n", + "# size=chemba_size,\n", + "# config=config,\n", + "# data_folder='chemba_single_images/'+date,\n", + "#\n", + "# )\n", "BASE_PATH_SINGLE_IMAGES = Path('../laravel_app/storage/app/chemba/single_images')\n", - "BASE_PATH_WEEKLY = Path('../laravel_app/storage/app/chemba/weekly_img')\n", - "\n", - "def get_true_color_request(time_interval): \n", - " return SentinelHubRequest(\n", - " evalscript=evalscript_true_color,\n", - " input_data=[\n", - " SentinelHubRequest.input_data(\n", - " data_collection=DataCollection.planet_data2,\n", - " time_interval=time_interval\n", - " )\n", - " ],\n", - " responses=[\n", - " SentinelHubRequest.output_response('default', MimeType.TIFF)\n", - " ],\n", - " bbox=chemba_bbox,\n", - " size=chemba_size,\n", - " config=config,\n", - " data_folder=str(BASE_PATH_SINGLE_IMAGES / date),\n", - "\n", - " )\n", - "\n", "def get_true_color_request_day_east(time_interval):\n", " base_path = '../laravel_app/storage/app/chemba/single_images/'\n", " \n", @@ -216,33 +219,31 @@ "\n", " )\n", "\n", - "def get_true_color_request_week(time_interval):\n", - " base_path = '../laravel_app/storage/app/chemba/weekly_img/'\n", - " return SentinelHubRequest(\n", - " evalscript=evalscript_true_color,\n", - " input_data=[\n", - " SentinelHubRequest.input_data(\n", - " data_collection=DataCollection.planet_data2,\n", - " time_interval=time_interval\n", - " )\n", - " ],\n", - " responses=[\n", - " SentinelHubRequest.output_response('default', MimeType.TIFF)\n", - " ],\n", - " bbox=chemba_bbox,\n", - " size=chemba_size,\n", - " config=config,\n", - " data_folder=str(BASE_PATH_SINGLE_IMAGES / date),\n", - " )" + "#def get_true_color_request_week(time_interval):\n", + "# return SentinelHubRequest(\n", + "# evalscript=evalscript_true_color,\n", + "# input_data=[\n", + "# SentinelHubRequest.input_data(\n", + "# data_collection=DataCollection.planet_data2,\n", + "# time_interval=time_interval\n", + "# )\n", + "# ],\n", + "# responses=[\n", + "# SentinelHubRequest.output_response('default', MimeType.TIFF)\n", + "# ],\n", + "# bbox=chemba_bbox,\n", + "# size=chemba_size,\n", + "# config=config,\n", + "# data_folder='chemba_weekly_img/'+date,\n", + "#\n", + " # )" ] }, { "cell_type": "code", "execution_count": 7, "id": "5abb2cc0-5e2f-46cd-9676-3093d07b0624", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "\n", @@ -260,9 +261,35 @@ "cell_type": "code", "execution_count": 8, "id": "a4937240-27f9-44c3-ad9c-cec6f2ffe4c8", - "metadata": { - "tags": [] - }, + "metadata": {}, + "outputs": [], + "source": [ + "#end = datetime.date(2022, 8, 4) \n", + "#start = datetime.date(2023, 3, 1)\n", + "#days_needed = 6#\n", + "\n", + "#end = datetime.date.today() - datetime.timedelta(days=days_needed - 1)\n", + "#start = end - datetime.timedelta(days=1)\n", + "\n", + "\n", + "#n_chunks = days_needed + 1\n", + "#tdelta = datetime.timedelta(days=1)\n", + "#edges = [(start + i*tdelta).isoformat() for i in range(n_chunks)]\n", + "#slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", + "#slots = [(edges[i]) for i in range(len(edges))]\n", + "\n", + "#date = start.strftime(\"%Y-%m-%d\")\n", + "\n", + "#print('Monthly time windows:\\n')\n", + "#for slot in slots:\n", + "# print(slot)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "848dc773-70d6-4ae6-b05c-d6ebfb41624d", + "metadata": {}, "outputs": [ { "name": "stdout", @@ -270,37 +297,51 @@ "text": [ "Monthly time windows:\n", "\n", - "2023-09-30\n", - "2023-10-01\n", - "2023-10-02\n", - "2023-10-03\n", - "2023-10-04\n", - "2023-10-05\n", - "2023-10-06\n" + "2023-11-11\n", + "2023-11-12\n", + "2023-11-13\n", + "2023-11-14\n", + "2023-11-15\n", + "2023-11-16\n", + "2023-11-17\n", + "2023-11-18\n", + "2023-11-19\n", + "2023-11-20\n", + "2023-11-21\n", + "2023-11-22\n", + "2023-11-23\n", + "2023-11-24\n", + "2023-11-25\n", + "2023-11-26\n", + "2023-11-27\n", + "2023-11-28\n", + "2023-11-29\n", + "2023-11-30\n", + "2023-12-01\n", + "2023-12-02\n", + "2023-12-03\n", + "2023-12-04\n", + "2023-12-05\n", + "2023-12-06\n", + "2023-12-07\n", + "2023-12-08\n" ] } ], "source": [ - "#end = datetime.date(2022, 8, 4)\n", - "#start = datetime.date(2023, 3, 1)\n", - "days_needed = int(os.environ.get(\"DAYS\", 6))\n", - "print(\"Days needed:\", days_needed)\n", + "import datetime\n", "\n", - "end = datetime.date.today() - datetime.timedelta(days=days_needed - 1)\n", - "start = end - datetime.timedelta(days=1)\n", + "days_needed = int(os.environ.get(\"DAYS\", 28))\n", + " # Adjust the number of days needed\n", "\n", + "end = datetime.date.today()\n", + "start = end - datetime.timedelta(days=days_needed - 1)\n", "\n", - "n_chunks = days_needed + 1\n", - "tdelta = datetime.timedelta(days=1)\n", - "edges = [(start + i*tdelta).isoformat() for i in range(n_chunks)]\n", - "#slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", - "slots = [(edges[i]) for i in range(len(edges))]\n", - "\n", - "#date = start.strftime(\"%Y-%m-%d\")\n", + "slots = [(start + datetime.timedelta(days=i)).strftime('%Y-%m-%d') for i in range(days_needed)]\n", "\n", "print('Monthly time windows:\\n')\n", "for slot in slots:\n", - " print(slot)" + " print(slot)\n" ] }, { @@ -308,16 +349,14 @@ "id": "0c18e312-8421-47d7-84f9-ed7d5e47e7ee", "metadata": {}, "source": [ - "### Chemba east side" + "### Download images\n" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "2335139b-dfb1-4371-ae2c-c2b9c8cbf10c", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "chemba_east = [34.8830, -17.3516, 34.9380, -17.2917]\n", @@ -332,11 +371,9 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "id": "77513576-2fed-4d17-a665-d11267b42390", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [], "source": [ "def download_function(slot):\n", @@ -379,30 +416,101 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "id": "d5830b6e-da0a-416f-867e-cbca4bd434f5", - "metadata": { - "tags": [] - }, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " East downloaded 2023-09-30\n", - " West downloaded 2023-09-30\n", - " East downloaded 2023-10-01\n", - " West downloaded 2023-10-01\n", - " East downloaded 2023-10-02\n", - " West downloaded 2023-10-02\n", - " East downloaded 2023-10-03\n", - " West downloaded 2023-10-03\n", - " East downloaded 2023-10-04\n", - " West downloaded 2023-10-04\n", - " East downloaded 2023-10-05\n", - " West downloaded 2023-10-05\n", - " East downloaded 2023-10-06\n", - " West downloaded 2023-10-06\n" + " East downloaded 2023-11-11\n", + " West downloaded 2023-11-11\n", + " East downloaded 2023-11-12\n", + " West downloaded 2023-11-12\n", + " East downloaded 2023-11-13\n", + " West downloaded 2023-11-13\n", + " East downloaded 2023-11-14\n", + " West downloaded 2023-11-14\n", + " East downloaded 2023-11-15\n", + " West downloaded 2023-11-15\n", + " East downloaded 2023-11-16\n", + " West downloaded 2023-11-16\n", + " East downloaded 2023-11-17\n", + " West downloaded 2023-11-17\n", + " East downloaded 2023-11-18\n", + " West downloaded 2023-11-18\n", + " East downloaded 2023-11-19\n", + " West downloaded 2023-11-19\n", + " East downloaded 2023-11-20\n", + " West downloaded 2023-11-20\n", + " East downloaded 2023-11-21\n", + " West downloaded 2023-11-21\n", + " East downloaded 2023-11-22\n", + " West downloaded 2023-11-22\n", + " East downloaded 2023-11-23\n", + " West downloaded 2023-11-23\n", + " East downloaded 2023-11-24\n", + " West downloaded 2023-11-24\n", + " East downloaded 2023-11-25\n", + " West downloaded 2023-11-25\n", + " East downloaded 2023-11-26\n", + " West downloaded 2023-11-26\n", + " East downloaded 2023-11-27\n", + " West downloaded 2023-11-27\n", + " East downloaded 2023-11-28\n", + " West downloaded 2023-11-28\n", + " East downloaded 2023-11-29\n", + " West downloaded 2023-11-29\n", + " East downloaded 2023-11-30\n", + " West downloaded 2023-11-30\n", + " East downloaded 2023-12-01\n", + " West downloaded 2023-12-01\n", + " East downloaded 2023-12-02\n", + " West downloaded 2023-12-02\n", + " East downloaded 2023-12-03\n", + " West downloaded 2023-12-03\n", + " East downloaded 2023-12-04\n", + " West downloaded 2023-12-04\n", + " East downloaded 2023-12-05\n", + " West downloaded 2023-12-05\n" + ] + }, + { + "ename": "UnauthorizedClientError", + "evalue": "(unauthorized_client) Unexpected error when authenticating client", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mUnauthorizedClientError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[12], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m slot \u001b[38;5;129;01min\u001b[39;00m slots:\n\u001b[0;32m----> 2\u001b[0m download_function(slot)\n", + "Cell \u001b[0;32mIn[11], line 8\u001b[0m, in \u001b[0;36mdownload_function\u001b[0;34m(slot)\u001b[0m\n\u001b[1;32m 5\u001b[0m list_of_requests \u001b[38;5;241m=\u001b[39m [request\u001b[38;5;241m.\u001b[39mdownload_list[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m request \u001b[38;5;129;01min\u001b[39;00m list_of_requests]\n\u001b[1;32m 7\u001b[0m \u001b[38;5;66;03m# download data chemba east with multiple threads\u001b[39;00m\n\u001b[0;32m----> 8\u001b[0m data \u001b[38;5;241m=\u001b[39m SentinelHubDownloadClient(config\u001b[38;5;241m=\u001b[39mconfig)\u001b[38;5;241m.\u001b[39mdownload(list_of_requests, max_threads\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m15\u001b[39m)\n\u001b[1;32m 9\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m East downloaded \u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m+\u001b[39mslot)\n\u001b[1;32m 11\u001b[0m \u001b[38;5;66;03m### Chemba west side\u001b[39;00m\n\u001b[1;32m 12\u001b[0m \u001b[38;5;66;03m# create a list of requests\u001b[39;00m\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/sentinelhub_client.py:62\u001b[0m, in \u001b[0;36mSentinelHubDownloadClient.download\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlock \u001b[38;5;241m=\u001b[39m Lock()\n\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 62\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mdownload(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 63\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 64\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlock \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/client.py:101\u001b[0m, in \u001b[0;36mDownloadClient.download\u001b[0;34m(self, download_requests, max_threads, decode_data, show_progress)\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m future \u001b[38;5;129;01min\u001b[39;00m as_completed(download_list):\n\u001b[1;32m 100\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 101\u001b[0m results[future_order[future]] \u001b[38;5;241m=\u001b[39m future\u001b[38;5;241m.\u001b[39mresult()\n\u001b[1;32m 102\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m DownloadFailedException \u001b[38;5;28;01mas\u001b[39;00m download_exception:\n\u001b[1;32m 103\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mraise_download_errors:\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/concurrent/futures/_base.py:449\u001b[0m, in \u001b[0;36mFuture.result\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CancelledError()\n\u001b[1;32m 448\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state \u001b[38;5;241m==\u001b[39m FINISHED:\n\u001b[0;32m--> 449\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m__get_result()\n\u001b[1;32m 451\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_condition\u001b[38;5;241m.\u001b[39mwait(timeout)\n\u001b[1;32m 453\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_state \u001b[38;5;129;01min\u001b[39;00m [CANCELLED, CANCELLED_AND_NOTIFIED]:\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/concurrent/futures/_base.py:401\u001b[0m, in \u001b[0;36mFuture.__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 399\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception:\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 401\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_exception\n\u001b[1;32m 402\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m 403\u001b[0m \u001b[38;5;66;03m# Break a reference cycle with the exception in self._exception\u001b[39;00m\n\u001b[1;32m 404\u001b[0m \u001b[38;5;28mself\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/concurrent/futures/thread.py:58\u001b[0m, in \u001b[0;36m_WorkItem.run\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 55\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 58\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfn(\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mkwargs)\n\u001b[1;32m 59\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 exc:\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfuture\u001b[38;5;241m.\u001b[39mset_exception(exc)\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/client.py:117\u001b[0m, in \u001b[0;36mDownloadClient._single_download_decoded\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 115\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_single_download_decoded\u001b[39m(\u001b[38;5;28mself\u001b[39m, request: DownloadRequest) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Any:\n\u001b[1;32m 116\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Downloads a response and decodes it into data. By decoding a single response\"\"\"\u001b[39;00m\n\u001b[0;32m--> 117\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_single_download(request)\n\u001b[1;32m 118\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01mif\u001b[39;00m response \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m response\u001b[38;5;241m.\u001b[39mdecode()\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/client.py:130\u001b[0m, in \u001b[0;36mDownloadClient._single_download\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 128\u001b[0m no_local_data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mredownload \u001b[38;5;129;01mor\u001b[39;00m response_path \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mexists(response_path)\n\u001b[1;32m 129\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m no_local_data:\n\u001b[0;32m--> 130\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_execute_download(request)\n\u001b[1;32m 131\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 132\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m request\u001b[38;5;241m.\u001b[39mreturn_data \u001b[38;5;129;01mor\u001b[39;00m response_path \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/handlers.py:64\u001b[0m, in \u001b[0;36mretry_temporary_errors..new_download_func\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m attempt_idx \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(download_attempts):\n\u001b[1;32m 63\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 64\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m download_func(\u001b[38;5;28mself\u001b[39m, request)\n\u001b[1;32m 66\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m requests\u001b[38;5;241m.\u001b[39mRequestException \u001b[38;5;28;01mas\u001b[39;00m exception:\n\u001b[1;32m 67\u001b[0m attempts_left \u001b[38;5;241m=\u001b[39m download_attempts \u001b[38;5;241m-\u001b[39m (attempt_idx \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/handlers.py:37\u001b[0m, in \u001b[0;36mfail_user_errors..new_download_func\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(download_func)\n\u001b[1;32m 35\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnew_download_func\u001b[39m(\u001b[38;5;28mself\u001b[39m: Self, request: DownloadRequest) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 36\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 37\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m download_func(\u001b[38;5;28mself\u001b[39m, request)\n\u001b[1;32m 38\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m requests\u001b[38;5;241m.\u001b[39mHTTPError \u001b[38;5;28;01mas\u001b[39;00m exception:\n\u001b[1;32m 39\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[1;32m 40\u001b[0m exception\u001b[38;5;241m.\u001b[39mresponse\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m<\u001b[39m requests\u001b[38;5;241m.\u001b[39mstatus_codes\u001b[38;5;241m.\u001b[39mcodes\u001b[38;5;241m.\u001b[39mINTERNAL_SERVER_ERROR\n\u001b[1;32m 41\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m exception\u001b[38;5;241m.\u001b[39mresponse\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m!=\u001b[39m requests\u001b[38;5;241m.\u001b[39mstatus_codes\u001b[38;5;241m.\u001b[39mcodes\u001b[38;5;241m.\u001b[39mTOO_MANY_REQUESTS\n\u001b[1;32m 42\u001b[0m ):\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/sentinelhub_client.py:82\u001b[0m, in \u001b[0;36mSentinelHubDownloadClient._execute_download\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 75\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m sleep_time \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 76\u001b[0m LOGGER\u001b[38;5;241m.\u001b[39mdebug(\n\u001b[1;32m 77\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSending \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m request to \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m. Hash of sent request is \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 78\u001b[0m request\u001b[38;5;241m.\u001b[39mrequest_type\u001b[38;5;241m.\u001b[39mvalue,\n\u001b[1;32m 79\u001b[0m request\u001b[38;5;241m.\u001b[39murl,\n\u001b[1;32m 80\u001b[0m request\u001b[38;5;241m.\u001b[39mget_hashed_name(),\n\u001b[1;32m 81\u001b[0m )\n\u001b[0;32m---> 82\u001b[0m response \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_do_download(request)\n\u001b[1;32m 84\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_execute_thread_safe(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrate_limit\u001b[38;5;241m.\u001b[39mupdate, response\u001b[38;5;241m.\u001b[39mheaders)\n\u001b[1;32m 86\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m response\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m==\u001b[39m requests\u001b[38;5;241m.\u001b[39mstatus_codes\u001b[38;5;241m.\u001b[39mcodes\u001b[38;5;241m.\u001b[39mTOO_MANY_REQUESTS:\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/sentinelhub_client.py:115\u001b[0m, in \u001b[0;36mSentinelHubDownloadClient._do_download\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m request\u001b[38;5;241m.\u001b[39murl \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 109\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFaulty request \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrequest\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m, no URL specified.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 111\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m requests\u001b[38;5;241m.\u001b[39mrequest(\n\u001b[1;32m 112\u001b[0m request\u001b[38;5;241m.\u001b[39mrequest_type\u001b[38;5;241m.\u001b[39mvalue,\n\u001b[1;32m 113\u001b[0m url\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39murl,\n\u001b[1;32m 114\u001b[0m json\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39mpost_values,\n\u001b[0;32m--> 115\u001b[0m headers\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_prepare_headers(request),\n\u001b[1;32m 116\u001b[0m timeout\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39mdownload_timeout_seconds,\n\u001b[1;32m 117\u001b[0m )\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/sentinelhub_client.py:126\u001b[0m, in \u001b[0;36mSentinelHubDownloadClient._prepare_headers\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 124\u001b[0m session_headers: JsonDict \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 125\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m request\u001b[38;5;241m.\u001b[39muse_session:\n\u001b[0;32m--> 126\u001b[0m session_headers \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_execute_thread_safe(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_session_headers)\n\u001b[1;32m 128\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mSHConstants\u001b[38;5;241m.\u001b[39mHEADERS, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39msession_headers, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mrequest\u001b[38;5;241m.\u001b[39mheaders}\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/sentinelhub_client.py:104\u001b[0m, in \u001b[0;36mSentinelHubDownloadClient._execute_thread_safe\u001b[0;34m(self, thread_unsafe_function, *args, **kwargs)\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m thread_unsafe_function(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 103\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlock:\n\u001b[0;32m--> 104\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m thread_unsafe_function(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/sentinelhub_client.py:136\u001b[0m, in \u001b[0;36mSentinelHubDownloadClient._get_session_headers\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_get_session_headers\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m JsonDict:\n\u001b[1;32m 131\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Provides up-to-date session headers\u001b[39;00m\n\u001b[1;32m 132\u001b[0m \n\u001b[1;32m 133\u001b[0m \u001b[38;5;124;03m Note that calling session_headers property triggers update if session has expired therefore this has to be\u001b[39;00m\n\u001b[1;32m 134\u001b[0m \u001b[38;5;124;03m called in a thread-safe way\u001b[39;00m\n\u001b[1;32m 135\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 136\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mget_session()\u001b[38;5;241m.\u001b[39msession_headers\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/sentinelhub_client.py:152\u001b[0m, in \u001b[0;36mSentinelHubDownloadClient.get_session\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 150\u001b[0m session \u001b[38;5;241m=\u001b[39m SentinelHubDownloadClient\u001b[38;5;241m.\u001b[39m_CACHED_SESSIONS[SentinelHubDownloadClient\u001b[38;5;241m.\u001b[39m_UNIVERSAL_CACHE_KEY]\n\u001b[1;32m 151\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 152\u001b[0m session \u001b[38;5;241m=\u001b[39m SentinelHubSession(config\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig)\n\u001b[1;32m 153\u001b[0m SentinelHubDownloadClient\u001b[38;5;241m.\u001b[39m_CACHED_SESSIONS[cache_key] \u001b[38;5;241m=\u001b[39m session\n\u001b[1;32m 155\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m session\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/session.py:75\u001b[0m, in \u001b[0;36mSentinelHubSession.__init__\u001b[0;34m(self, config, refresh_before_expiry, _token)\u001b[0m\n\u001b[1;32m 68\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m token_fetching_required \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39msh_client_id \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39msh_client_secret):\n\u001b[1;32m 69\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[1;32m 70\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mConfiguration parameters \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msh_client_id\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m and \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msh_client_secret\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m have to be set in order \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 71\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mto authenticate with Sentinel Hub service. Check \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 72\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhttps://sentinelhub-py.readthedocs.io/en/latest/configure.html for more info.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 73\u001b[0m )\n\u001b[0;32m---> 75\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_token \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_collect_new_token() \u001b[38;5;28;01mif\u001b[39;00m _token \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m _token\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/session.py:129\u001b[0m, in \u001b[0;36mSentinelHubSession._collect_new_token\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Creates a download request and fetches a token from the service.\u001b[39;00m\n\u001b[1;32m 124\u001b[0m \n\u001b[1;32m 125\u001b[0m \u001b[38;5;124;03mNote that the `DownloadRequest` object is created only because retry decorators of `_fetch_token` method\u001b[39;00m\n\u001b[1;32m 126\u001b[0m \u001b[38;5;124;03mrequire it.\u001b[39;00m\n\u001b[1;32m 127\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 128\u001b[0m request \u001b[38;5;241m=\u001b[39m DownloadRequest(url\u001b[38;5;241m=\u001b[39m\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39msh_token_url\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 129\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fetch_token(request)\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/handlers.py:64\u001b[0m, in \u001b[0;36mretry_temporary_errors..new_download_func\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m attempt_idx \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(download_attempts):\n\u001b[1;32m 63\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 64\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m download_func(\u001b[38;5;28mself\u001b[39m, request)\n\u001b[1;32m 66\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m requests\u001b[38;5;241m.\u001b[39mRequestException \u001b[38;5;28;01mas\u001b[39;00m exception:\n\u001b[1;32m 67\u001b[0m attempts_left \u001b[38;5;241m=\u001b[39m download_attempts \u001b[38;5;241m-\u001b[39m (attempt_idx \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/handlers.py:37\u001b[0m, in \u001b[0;36mfail_user_errors..new_download_func\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(download_func)\n\u001b[1;32m 35\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mnew_download_func\u001b[39m(\u001b[38;5;28mself\u001b[39m: Self, request: DownloadRequest) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m T:\n\u001b[1;32m 36\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m---> 37\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m download_func(\u001b[38;5;28mself\u001b[39m, request)\n\u001b[1;32m 38\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m requests\u001b[38;5;241m.\u001b[39mHTTPError \u001b[38;5;28;01mas\u001b[39;00m exception:\n\u001b[1;32m 39\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[1;32m 40\u001b[0m exception\u001b[38;5;241m.\u001b[39mresponse\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m<\u001b[39m requests\u001b[38;5;241m.\u001b[39mstatus_codes\u001b[38;5;241m.\u001b[39mcodes\u001b[38;5;241m.\u001b[39mINTERNAL_SERVER_ERROR\n\u001b[1;32m 41\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m exception\u001b[38;5;241m.\u001b[39mresponse\u001b[38;5;241m.\u001b[39mstatus_code \u001b[38;5;241m!=\u001b[39m requests\u001b[38;5;241m.\u001b[39mstatus_codes\u001b[38;5;241m.\u001b[39mcodes\u001b[38;5;241m.\u001b[39mTOO_MANY_REQUESTS\n\u001b[1;32m 42\u001b[0m ):\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/sentinelhub/download/session.py:141\u001b[0m, in \u001b[0;36mSentinelHubSession._fetch_token\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 138\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m OAuth2Session(client\u001b[38;5;241m=\u001b[39moauth_client) \u001b[38;5;28;01mas\u001b[39;00m oauth_session:\n\u001b[1;32m 139\u001b[0m oauth_session\u001b[38;5;241m.\u001b[39mregister_compliance_hook(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124maccess_token_response\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_compliance_hook)\n\u001b[0;32m--> 141\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m oauth_session\u001b[38;5;241m.\u001b[39mfetch_token(\n\u001b[1;32m 142\u001b[0m token_url\u001b[38;5;241m=\u001b[39mrequest\u001b[38;5;241m.\u001b[39murl,\n\u001b[1;32m 143\u001b[0m client_id\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39msh_client_id,\n\u001b[1;32m 144\u001b[0m client_secret\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39msh_client_secret,\n\u001b[1;32m 145\u001b[0m headers\u001b[38;5;241m=\u001b[39m{\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mDEFAULT_HEADERS, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mSHConstants\u001b[38;5;241m.\u001b[39mHEADERS},\n\u001b[1;32m 146\u001b[0m )\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/requests_oauthlib/oauth2_session.py:366\u001b[0m, in \u001b[0;36mOAuth2Session.fetch_token\u001b[0;34m(self, token_url, code, authorization_response, body, auth, username, password, method, force_querystring, timeout, headers, verify, proxies, include_client_id, client_secret, cert, **kwargs)\u001b[0m\n\u001b[1;32m 363\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvoking hook \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m, hook)\n\u001b[1;32m 364\u001b[0m r \u001b[38;5;241m=\u001b[39m hook(r)\n\u001b[0;32m--> 366\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_client\u001b[38;5;241m.\u001b[39mparse_request_body_response(r\u001b[38;5;241m.\u001b[39mtext, scope\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mscope)\n\u001b[1;32m 367\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoken \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_client\u001b[38;5;241m.\u001b[39mtoken\n\u001b[1;32m 368\u001b[0m log\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mObtained token \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoken)\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/oauthlib/oauth2/rfc6749/clients/base.py:427\u001b[0m, in \u001b[0;36mClient.parse_request_body_response\u001b[0;34m(self, body, scope, **kwargs)\u001b[0m\n\u001b[1;32m 379\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Parse the JSON response body.\u001b[39;00m\n\u001b[1;32m 380\u001b[0m \n\u001b[1;32m 381\u001b[0m \u001b[38;5;124;03mIf the access token request is valid and authorized, the\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 424\u001b[0m \u001b[38;5;124;03m.. _`Section 7.1`: https://tools.ietf.org/html/rfc6749#section-7.1\u001b[39;00m\n\u001b[1;32m 425\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 426\u001b[0m scope \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mscope \u001b[38;5;28;01mif\u001b[39;00m scope \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m scope\n\u001b[0;32m--> 427\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoken \u001b[38;5;241m=\u001b[39m parse_token_response(body, scope\u001b[38;5;241m=\u001b[39mscope)\n\u001b[1;32m 428\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpopulate_token_attributes(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoken)\n\u001b[1;32m 429\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoken\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/oauthlib/oauth2/rfc6749/parameters.py:441\u001b[0m, in \u001b[0;36mparse_token_response\u001b[0;34m(body, scope)\u001b[0m\n\u001b[1;32m 438\u001b[0m params[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexpires_at\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m time\u001b[38;5;241m.\u001b[39mtime() \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mint\u001b[39m(params[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexpires_in\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m 440\u001b[0m params \u001b[38;5;241m=\u001b[39m OAuth2Token(params, old_scope\u001b[38;5;241m=\u001b[39mscope)\n\u001b[0;32m--> 441\u001b[0m validate_token_parameters(params)\n\u001b[1;32m 442\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m params\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/oauthlib/oauth2/rfc6749/parameters.py:448\u001b[0m, in \u001b[0;36mvalidate_token_parameters\u001b[0;34m(params)\u001b[0m\n\u001b[1;32m 446\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Ensures token presence, token type, expiration and scope in params.\"\"\"\u001b[39;00m\n\u001b[1;32m 447\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124merror\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m params:\n\u001b[0;32m--> 448\u001b[0m raise_from_error(params\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124merror\u001b[39m\u001b[38;5;124m'\u001b[39m), params)\n\u001b[1;32m 450\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124maccess_token\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;129;01min\u001b[39;00m params:\n\u001b[1;32m 451\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m MissingTokenError(description\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMissing access token parameter.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", + "File \u001b[0;32m/usr/local/anaconda3/lib/python3.11/site-packages/oauthlib/oauth2/rfc6749/errors.py:399\u001b[0m, in \u001b[0;36mraise_from_error\u001b[0;34m(error, params)\u001b[0m\n\u001b[1;32m 397\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _, \u001b[38;5;28mcls\u001b[39m \u001b[38;5;129;01min\u001b[39;00m inspect\u001b[38;5;241m.\u001b[39mgetmembers(sys\u001b[38;5;241m.\u001b[39mmodules[\u001b[38;5;18m__name__\u001b[39m], inspect\u001b[38;5;241m.\u001b[39misclass):\n\u001b[1;32m 398\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39merror \u001b[38;5;241m==\u001b[39m error:\n\u001b[0;32m--> 399\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mcls\u001b[39m(\u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CustomOAuth2Error(error\u001b[38;5;241m=\u001b[39merror, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n", + "\u001b[0;31mUnauthorizedClientError\u001b[0m: (unauthorized_client) Unexpected error when authenticating client" ] } ], @@ -413,599 +521,67 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "68db3c15-6f94-432e-b315-c329e4251b21", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['chemba_single_images/2023-09-30/369e30117c87ea5a93d4b1fdc1e200f5/response.tiff', 'chemba_single_images/2023-09-30/19f952f0b4dc03e82b31ddda504eca37/response.tiff']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning 1: chemba_single_images/2023-09-30/369e30117c87ea5a93d4b1fdc1e200f5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-09-30/19f952f0b4dc03e82b31ddda504eca37/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-09-30/369e30117c87ea5a93d4b1fdc1e200f5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-09-30/19f952f0b4dc03e82b31ddda504eca37/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-09-30/369e30117c87ea5a93d4b1fdc1e200f5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-09-30/19f952f0b4dc03e82b31ddda504eca37/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['chemba_single_images/2023-10-01/52579ecea6e4c674f3f15a70692b2470/response.tiff', 'chemba_single_images/2023-10-01/199af70a0a9bdf56a6938888f8ad073c/response.tiff']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning 1: chemba_single_images/2023-10-01/52579ecea6e4c674f3f15a70692b2470/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-01/199af70a0a9bdf56a6938888f8ad073c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-01/52579ecea6e4c674f3f15a70692b2470/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-01/199af70a0a9bdf56a6938888f8ad073c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-01/52579ecea6e4c674f3f15a70692b2470/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-01/199af70a0a9bdf56a6938888f8ad073c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['chemba_single_images/2023-10-02/131056d1de92580e74203e14cda16072/response.tiff', 'chemba_single_images/2023-10-02/f16e88a64ddff761b1c5b534c18588c5/response.tiff']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning 1: chemba_single_images/2023-10-02/131056d1de92580e74203e14cda16072/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-02/f16e88a64ddff761b1c5b534c18588c5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-02/131056d1de92580e74203e14cda16072/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-02/f16e88a64ddff761b1c5b534c18588c5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-02/131056d1de92580e74203e14cda16072/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-02/f16e88a64ddff761b1c5b534c18588c5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['chemba_single_images/2023-10-03/7a15a778f1bef721f997fc4c7071a022/response.tiff', 'chemba_single_images/2023-10-03/0cf952e5d972cd1b001c3ca1e0f286fc/response.tiff']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning 1: chemba_single_images/2023-10-03/7a15a778f1bef721f997fc4c7071a022/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-03/0cf952e5d972cd1b001c3ca1e0f286fc/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-03/7a15a778f1bef721f997fc4c7071a022/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-03/0cf952e5d972cd1b001c3ca1e0f286fc/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-03/7a15a778f1bef721f997fc4c7071a022/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-03/0cf952e5d972cd1b001c3ca1e0f286fc/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['chemba_single_images/2023-10-04/37292b2973437bbcd8164d4b0cb5ce09/response.tiff', 'chemba_single_images/2023-10-04/a3957aa1c1478fed498c3f1e94b8703a/response.tiff']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning 1: chemba_single_images/2023-10-04/37292b2973437bbcd8164d4b0cb5ce09/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-04/a3957aa1c1478fed498c3f1e94b8703a/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-04/37292b2973437bbcd8164d4b0cb5ce09/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-04/a3957aa1c1478fed498c3f1e94b8703a/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-04/37292b2973437bbcd8164d4b0cb5ce09/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-04/a3957aa1c1478fed498c3f1e94b8703a/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['chemba_single_images/2023-10-05/1ab274c42d49578ad25c592bc16c5c17/response.tiff', 'chemba_single_images/2023-10-05/ca219fceac18e287d129aaca803998f0/response.tiff']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning 1: chemba_single_images/2023-10-05/1ab274c42d49578ad25c592bc16c5c17/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-05/ca219fceac18e287d129aaca803998f0/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-05/1ab274c42d49578ad25c592bc16c5c17/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-05/ca219fceac18e287d129aaca803998f0/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-05/1ab274c42d49578ad25c592bc16c5c17/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-05/ca219fceac18e287d129aaca803998f0/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['chemba_single_images/2023-10-06/a1c4a82635c5b3379cac01c44428a46c/response.tiff', 'chemba_single_images/2023-10-06/cae35e70e26ce81aff15dcea89246b07/response.tiff']\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Warning 1: chemba_single_images/2023-10-06/a1c4a82635c5b3379cac01c44428a46c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-06/cae35e70e26ce81aff15dcea89246b07/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-06/a1c4a82635c5b3379cac01c44428a46c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-06/cae35e70e26ce81aff15dcea89246b07/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-06/a1c4a82635c5b3379cac01c44428a46c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: chemba_single_images/2023-10-06/cae35e70e26ce81aff15dcea89246b07/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", - "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" - ] - } - ], + "outputs": [], "source": [ "for slot in slots:\n", " merge_files(slot)" ] }, - { - "cell_type": "code", - "execution_count": 13, - "id": "4f80e84e-95b5-41dc-83d8-720cd699a79a", - "metadata": {}, - "outputs": [ - { - "ename": "SyntaxError", - "evalue": "invalid syntax (4067800170.py, line 1)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m Cell \u001b[0;32mIn[13], line 1\u001b[0;36m\u001b[0m\n\u001b[0;31m stop here\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" - ] - } - ], - "source": [ - "raise SystemExit(\"Stop right there!\")" - ] - }, { "cell_type": "code", "execution_count": null, - "id": "a8d367da-3eb5-419a-9a8a-d315f8ae8d89", + "id": "cb3fa856-a550-4899-844a-e69209bba3ad", "metadata": {}, "outputs": [], "source": [ - "days = 1\n", - "start = datetime.datetime(2021,3,12)\n", - "end = start + datetime.timedelta(days=days)\n", - "n_chunks = 1\n", - "tdelta = (end - start) / n_chunks\n", - "edges = [(start + i*tdelta).date().isoformat() for i in range(n_chunks)]\n", - "#slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", - "slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", "\n", - "date = start.strftime(\"%Y-%m-%d\")\n", + "import shutil\n", + " \n", + "# List of folder names\n", + "base_path = Path('../laravel_app/storage/app/chemba')\n", + "folders_to_empty = [str(base_path / 'merged_virtual'), str(base_path / 'single_images')]\n", + " \n", + "# Function to empty folders\n", "\n", - "print('Monthly time windows:\\n')\n", - "for slot in slots:\n", - " print(slot)" + "def empty_folders(folders):\n", + "\n", + " for folder in folders:\n", + "\n", + " try:\n", + "\n", + " for filename in os.listdir(folder):\n", + "\n", + " file_path = os.path.join(folder, filename)\n", + "\n", + " try:\n", + "\n", + " if os.path.isfile(file_path):\n", + "\n", + " os.unlink(file_path)\n", + "\n", + " elif os.path.isdir(file_path):\n", + "\n", + " shutil.rmtree(file_path)\n", + "\n", + " except Exception as e:\n", + "\n", + " print(f\"Error: {e}\")\n", + "\n", + " print(f\"Emptied folder: {folder}\")\n", + "\n", + " except OSError as e:\n", + "\n", + " print(f\"Error: {e}\")\n", + " \n", + "# Call the function to empty folders\n", + "\n", + "empty_folders(folders_to_empty)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "461cc3fa-4b7a-48aa-abee-25eb97689707", - "metadata": {}, - "outputs": [], - "source": [ - "days = 1\n", - "start = datetime.datetime(2022,4,27)\n", - "end = start + datetime.timedelta(days=days)\n", - "n_chunks = 1\n", - "tdelta = (end - start) / n_chunks\n", - "edges = [(start + i*tdelta).date().isoformat() for i in range(n_chunks)]\n", - "#slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", - "slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", - "\n", - "date = start.strftime(\"%Y-%m-%d\")\n", - "\n", - "### Chemba east side\n", - "chemba_east = [34.8830, -17.3516, 34.9380, -17.2917]\n", - "resolution = 3\n", - "chemba_bbox = BBox(bbox=chemba_east, crs=CRS.WGS84)\n", - "chemba_size = bbox_to_dimensions(chemba_bbox, resolution=resolution)\n", - "\n", - "# create a list of requests \n", - "list_of_requests = [get_true_color_request(slot) for slot in slots]\n", - "list_of_requests = [request.download_list[0] for request in list_of_requests]\n", - "\n", - "# download data with multiple threads\n", - "data = SentinelHubDownloadClient(config=config).download(list_of_requests, max_threads=15)\n", - "\n", - "\n", - "\n", - "### Chemba west side\n", - "chemba_west = [34.9460, -17.3500, 34.9839, -17.3110]\n", - "chemba_bbox = BBox(bbox=chemba_west, crs=CRS.WGS84)\n", - "chemba_size = bbox_to_dimensions(chemba_bbox, resolution=resolution)\n", - "\n", - "print(f'Image shape at {resolution} m resolution: {chemba_size} pixels')\n", - "\n", - "# create a list of requests\n", - "list_of_requests = [get_true_color_request(slot) for slot in slots]\n", - "list_of_requests = [request.download_list[0] for request in list_of_requests]\n", - "\n", - "# download data with multiple threads\n", - "data = SentinelHubDownloadClient(config=config).download(list_of_requests, max_threads=15)\n", - "print(f'data downloaded')\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "id": "52b5f742-3db0-4290-a467-688f8aec36d5", - "metadata": {}, - "source": [ - "### Chemba west side" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d14b7a1e-87a6-4344-859c-5e602bd2e006", - "metadata": {}, - "outputs": [], - "source": [ - "a" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e9daf5c9-39f6-44ea-92dd-dee355669b19", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b7f42def-21c2-439c-9e96-a24ca1eb2176", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6c5d6f71-e7af-450f-b6c2-151810220159", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5e6f8a1d-bb36-4e96-b06d-6967ea8f3d98", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4a3c9cc9-ad37-405a-b8bf-996fd474540e", - "metadata": {}, - "outputs": [], - "source": [ - "a " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d2c127e0-eaf6-46b8-af5d-6f8000bf3df3", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "3432ffcf-606f-4c34-8f8c-a21bee6326b4", - "metadata": {}, - "source": [ - "## Visualise the image" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0d6b8db8-a33b-45bc-80a9-877ee1b8b80c", - "metadata": {}, - "outputs": [], - "source": [ - "evalscript_true_color_png = \"\"\"\n", - " //VERSION=3\n", - "\n", - " function setup() {\n", - " return {\n", - " input: [{\n", - " bands: [\"B1\", \"B2\", \"B3\", \"UDM\"]\n", - " }],\n", - " output: {\n", - " bands: 3\n", - " }\n", - " };\n", - " }\n", - "\n", - " function evaluatePixel(sample) {\n", - " return [2.5 * sample.B1 / 10000, 2.5 * sample.B2 / 10000, 2.5 * sample.B3 / 10000, sample.UDM];\n", - " }\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e498acb8-8e14-41f4-84cd-54f4648c1716", - "metadata": {}, - "outputs": [], - "source": [ - "def get_true_color_request_png(time_interval):\n", - " return SentinelHubRequest(\n", - " evalscript=evalscript_true_color_png,\n", - " input_data=[\n", - " SentinelHubRequest.input_data(\n", - " data_collection=DataCollection.planet_data,\n", - " time_interval=('2022-02-10', '2022-02-17')\n", - " )\n", - " ],\n", - " responses=[\n", - " SentinelHubRequest.output_response('default', MimeType.PNG)\n", - " ],\n", - " bbox=chemba_bbox,\n", - " size=chemba_size,\n", - " config=config\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "19fd091a-dd67-484f-a1a7-3bce61bc9517", - "metadata": {}, - "outputs": [], - "source": [ - "# create a list of requests\n", - "list_of_requests_png = [get_true_color_request_png(slot) for slot in slots]\n", - "list_of_requests_png = [request.download_list[0] for request in list_of_requests_png]\n", - "\n", - "# download data with multiple threads\n", - "data_png = SentinelHubDownloadClient(config=config).download(list_of_requests_png, max_threads=5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6d8abc2e-e245-490a-83eb-36f6a5ec0418", - "metadata": {}, - "outputs": [], - "source": [ - "# some stuff for pretty plots\n", - "ncols = 4\n", - "nrows = 7\n", - "aspect_ratio = chemba_size[0] / chemba_size[1]\n", - "subplot_kw = {'xticks': [], 'yticks': [], 'frame_on': False}\n", - "\n", - "fig, axs = plt.subplots(ncols=ncols, nrows=nrows, figsize=(5 * ncols * aspect_ratio, 5 * nrows),\n", - " subplot_kw=subplot_kw)\n", - "\n", - "for idx, image in enumerate(data_png):\n", - " ax = axs[idx // ncols][idx % ncols]\n", - " ax.imshow(np.clip(image * 2.5/255, 0, 1))\n", - " ax.set_title(f'{slots[idx][0]} ', fontsize=10)\n", - "\n", - "plt.tight_layout()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7803cfac-ce53-4461-8702-88b872ef64aa", - "metadata": {}, - "outputs": [], - "source": [ - "evalscript_true_color = \"\"\"\n", - " //VERSION=3\n", - "\n", - " function setup() {\n", - " return {\n", - " input: [{\n", - " bands: [\"B1\", \"B2\", \"B3\"]\n", - " }],\n", - " output: {\n", - " bands: 3\n", - " }\n", - " };\n", - " }\n", - "\n", - " function evaluatePixel(sample) {\n", - " return [sample.B04, sample.B03, sample.B02];\n", - " }\n", - "\"\"\"\n", - "\n", - "request_true_color = SentinelHubRequest(\n", - " evalscript=evalscript_true_color,\n", - " input_data=[\n", - " SentinelHubRequest.input_data(\n", - " data_collection=DataCollection.planet_data2,\n", - " time_interval=('2022-02-01', '2022-02-10'),\n", - " )\n", - " ],\n", - " responses=[\n", - " SentinelHubRequest.output_response('default', MimeType.PNG)\n", - " ],\n", - " bbox=chemba_bbox,\n", - " size=chemba_size,\n", - " config=config\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ab26df2a-f780-4f6b-8d09-0eead9d6db2b", - "metadata": {}, - "outputs": [], - "source": [ - "true_color_imgs = request_true_color.get_data()\n" - ] - }, - { - "cell_type": "markdown", - "id": "a51f41f5-f5e1-4fa7-aef2-53371d1386ce", - "metadata": {}, - "source": [ - "## change file name\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "49a52f5b-2626-4dd2-9e57-6b44691f9952", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import glob\n", - "import json\n", - "import datetime as dt\n", - "from urllib.parse import unquote\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b3720a99-2906-41d9-ac1b-9c9993cd8308", - "metadata": {}, - "outputs": [], - "source": [ - "def get_request_dt(request_file):\n", - " with open(request_file, 'r') as req:\n", - " request = json.load(req)\n", - " url = unquote(request['url'])\n", - " time_parameter = [t for t in url.split('&') if t.startswith('TIME=')][0]\n", - " time = time_parameter.split('TIME=')[1].split('/')[0]\n", - " return dt.datetime.strptime(time, \"%Y-%m-%dT%H:%M:%S\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1f4e5844-34bc-4cb9-9365-46356b1db552", - "metadata": {}, - "outputs": [], - "source": [ - "if __name__ == \"__main__\":\n", - " folders = glob.glob('.\\\\test_dir2\\\\*')\n", - " dates = [get_request_dt(f'{folder}/request.json') for folder in folders]\n", - " df = pd.DataFrame(zip(folders, dates), columns=['folder', 'datetime'])\n", - " df.sort_values(by='datetime', ascending=True, inplace=True)\n", - " print(df.head().to_markdown())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4319580b-f0b7-4370-91f4-bc4fcf068bc3", - "metadata": {}, - "outputs": [], - "source": [ - "def get_request_dt(request_file):\n", - " with open(request_file, 'r') as req:\n", - " request = json.load(req)\n", - " url = unquote(request['url'])\n", - " return url.split('/')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "87580f26-0ccc-4061-a460-52d941a90b6a", - "metadata": {}, - "outputs": [], - "source": [ - "folders = glob.glob('.\\\\test_dir2\\\\*')\n", - "[get_request_dt(f'{folder}/request.json') for folder in folders]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6569956e-91c5-42c9-acfa-74fde22ee1ce", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "folders = glob.glob('.\\\\test_dir2\\\\*')\n", - "dates = [get_request_dt(f'{folder}/request.json') for folder in folders]\n", - "dates" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2608ac51-fa24-4fd6-8758-cf27bda8860e", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/python_app/Chemba_download_old.ipynb b/python_app/Chemba_download_old.ipynb new file mode 100644 index 0000000..d0bf350 --- /dev/null +++ b/python_app/Chemba_download_old.ipynb @@ -0,0 +1,1032 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "b7ca7102-5fd9-481f-90cd-3ba60e288649", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# $ pip install sentinelhub\n", + "# pip install gdal\n", + "\n", + "import os\n", + "import datetime\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from pathlib import Path\n", + "from osgeo import gdal\n", + "\n", + "from sentinelhub import MimeType, CRS, BBox, SentinelHubRequest, SentinelHubDownloadClient, \\\n", + " DataCollection, bbox_to_dimensions, DownloadRequest, SHConfig, BBoxSplitter, read_data\n", + "\n", + "config = SHConfig()\n", + "\n", + "import time" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "330c967c-2742-4a7a-9a61-28bfdaf8eeca", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#pip install pipreqs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8f2ec814-76b2-47e6-b74b-a4ffddd908f1", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "49f8496a-a267-4b74-9500-a168e031ed68", + "metadata": {}, + "outputs": [], + "source": [ + "#import pipreqs\n", + "#pipreqs Resilience BV/4002 CMD App - General/4002 CMD Team/4002 TechnicalData/04 WP2 technical/python/Chemba_download.ipynb" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "5491a840-779c-4f0c-8164-c3de738b3298", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "config.sh_client_id = '6e542a89-b040-40ca-8352-8b979ee3067a'\n", + "config.sh_client_secret = 'PiNaFQfP<.)59]rS.*}OF+hlrrzf#k~uqlhy-_F%'" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "eb1fb662-0e25-4ca9-8317-c6953290842b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "collection_id = 'c691479f-358c-46b1-b0f0-e12b70a9856c'\n", + "byoc = DataCollection.define_byoc(\n", + " collection_id,\n", + " name='planet_data2',\n", + " is_timeless=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "244b5752-4f02-4347-9278-f6a0a46b88f4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "\"\"\"\n", + "Utilities used by example notebooks\n", + "\"\"\"\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "\n", + "def plot_image(image, factor=1.0, clip_range=None, **kwargs):\n", + " \"\"\"\n", + " Utility function for plotting RGB images.\n", + " \"\"\"\n", + " fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(15, 15))\n", + " if clip_range is not None:\n", + " ax.imshow(np.clip(image * factor, *clip_range), **kwargs)\n", + " else:\n", + " ax.imshow(image * factor, **kwargs)\n", + " ax.set_xticks([])\n", + " ax.set_yticks([]) \n", + "\n", + "\n", + "#evalscript_true_color = \"\"\"\n", + "# //VERSION=3\n", + "#\n", + "# function setup() {\n", + "# return {\n", + "# input: [{\n", + "# bands: [\"B1\", \"B2\", \"B3\", \"B4\", \"UDM\"]\n", + "# }],\n", + "# output: {\n", + "# bands: 5\n", + "# }\n", + "# };\n", + "# }\n", + "#\n", + "# function evaluatePixel(sample) {\n", + "# return [2.5 * sample.B1 / 10000, 2.5 * sample.B2 / 10000, 2.5 * sample.B3 / 10000, 2.5 * sample.B4 / 10000, sample.UDM];\n", + "# }\n", + "#\"\"\"\n", + "\n", + "evalscript_true_color = \"\"\"\n", + " //VERSION=3\n", + "\n", + " function setup() {\n", + " return {\n", + " input: [{\n", + " bands: [\"Blue\", \"Green\", \"Red\", \"NIR\", \"UDM\"]\n", + " }],\n", + " output: {\n", + " bands: 5\n", + " }\n", + " };\n", + " }\n", + "\n", + " function evaluatePixel(sample) {\n", + " return [2.5 * sample.Blue / 10000, 2.5 * sample.Green / 10000, 2.5 * sample.Red / 10000, 2.5 * sample.NIR / 10000, sample.UDM];\n", + " }\n", + "\"\"\"\n", + "BASE_PATH_SINGLE_IMAGES = Path('../laravel_app/storage/app/chemba/single_images')\n", + "BASE_PATH_WEEKLY = Path('../laravel_app/storage/app/chemba/weekly_img')\n", + "\n", + "def get_true_color_request(time_interval): \n", + " return SentinelHubRequest(\n", + " evalscript=evalscript_true_color,\n", + " input_data=[\n", + " SentinelHubRequest.input_data(\n", + " data_collection=DataCollection.planet_data2,\n", + " time_interval=time_interval\n", + " )\n", + " ],\n", + " responses=[\n", + " SentinelHubRequest.output_response('default', MimeType.TIFF)\n", + " ],\n", + " bbox=chemba_bbox,\n", + " size=chemba_size,\n", + " config=config,\n", + " data_folder=str(BASE_PATH_SINGLE_IMAGES / date),\n", + "\n", + " )\n", + "\n", + "def get_true_color_request_day_east(time_interval):\n", + " base_path = '../laravel_app/storage/app/chemba/single_images/'\n", + " \n", + " return SentinelHubRequest(\n", + " evalscript=evalscript_true_color,\n", + " input_data=[\n", + " SentinelHubRequest.input_data(\n", + " data_collection=DataCollection.planet_data2,\n", + " time_interval=(time_interval, time_interval)\n", + " )\n", + " ],\n", + " responses=[\n", + " SentinelHubRequest.output_response('default', MimeType.TIFF)\n", + " ],\n", + " bbox=chemba_bbox_east,\n", + " size=chemba_size_east,\n", + " config=config,\n", + " data_folder=str(BASE_PATH_SINGLE_IMAGES / time_interval),\n", + "\n", + " )\n", + "\n", + "def get_true_color_request_day_west(time_interval):\n", + " base_path = '../laravel_app/storage/app/chemba/single_images/'\n", + " return SentinelHubRequest(\n", + " evalscript=evalscript_true_color,\n", + " input_data=[\n", + " SentinelHubRequest.input_data(\n", + " data_collection=DataCollection.planet_data2,\n", + " time_interval=(time_interval, time_interval)\n", + " )\n", + " ],\n", + " responses=[\n", + " SentinelHubRequest.output_response('default', MimeType.TIFF)\n", + " ],\n", + " bbox=chemba_bbox_west,\n", + " size=chemba_size_west,\n", + " config=config,\n", + " data_folder=str(BASE_PATH_SINGLE_IMAGES / time_interval),\n", + "\n", + " )\n", + "\n", + "def get_true_color_request_week(time_interval):\n", + " base_path = '../laravel_app/storage/app/chemba/weekly_img/'\n", + " return SentinelHubRequest(\n", + " evalscript=evalscript_true_color,\n", + " input_data=[\n", + " SentinelHubRequest.input_data(\n", + " data_collection=DataCollection.planet_data2,\n", + " time_interval=time_interval\n", + " )\n", + " ],\n", + " responses=[\n", + " SentinelHubRequest.output_response('default', MimeType.TIFF)\n", + " ],\n", + " bbox=chemba_bbox,\n", + " size=chemba_size,\n", + " config=config,\n", + " data_folder=str(BASE_PATH_SINGLE_IMAGES / date),\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5abb2cc0-5e2f-46cd-9676-3093d07b0624", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "\n", + "#end = datetime.date.today() - datetime.timedelta(days=1)\n", + "#start = end - datetime.timedelta(days=6)\n", + "\n", + "#end = datetime.date(2022, 7, 1)\n", + "#start = datetime.date(2022, 7, 21)\n", + "\n", + "#n_chunks = start - end\n", + "#n_chunks.days\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "a4937240-27f9-44c3-ad9c-cec6f2ffe4c8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Monthly time windows:\n", + "\n", + "2023-09-30\n", + "2023-10-01\n", + "2023-10-02\n", + "2023-10-03\n", + "2023-10-04\n", + "2023-10-05\n", + "2023-10-06\n" + ] + } + ], + "source": [ + "#end = datetime.date(2022, 8, 4)\n", + "#start = datetime.date(2023, 3, 1)\n", + "days_needed = int(os.environ.get(\"DAYS\", 6))\n", + "print(\"Days needed:\", days_needed)\n", + "\n", + "end = datetime.date.today() - datetime.timedelta(days=days_needed - 1)\n", + "start = end - datetime.timedelta(days=1)\n", + "\n", + "\n", + "n_chunks = days_needed + 1\n", + "tdelta = datetime.timedelta(days=1)\n", + "edges = [(start + i*tdelta).isoformat() for i in range(n_chunks)]\n", + "#slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", + "slots = [(edges[i]) for i in range(len(edges))]\n", + "\n", + "#date = start.strftime(\"%Y-%m-%d\")\n", + "\n", + "print('Monthly time windows:\\n')\n", + "for slot in slots:\n", + " print(slot)" + ] + }, + { + "cell_type": "markdown", + "id": "0c18e312-8421-47d7-84f9-ed7d5e47e7ee", + "metadata": {}, + "source": [ + "### Chemba east side" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "2335139b-dfb1-4371-ae2c-c2b9c8cbf10c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "chemba_east = [34.8830, -17.3516, 34.9380, -17.2917]\n", + "resolution = 3\n", + "chemba_bbox_east = BBox(bbox=chemba_east, crs=CRS.WGS84)\n", + "chemba_size_east = bbox_to_dimensions(chemba_bbox_east, resolution=resolution)\n", + "\n", + "chemba_west = [34.9460, -17.3500, 34.9839, -17.3110]\n", + "chemba_bbox_west = BBox(bbox=chemba_west, crs=CRS.WGS84)\n", + "chemba_size_west = bbox_to_dimensions(chemba_bbox_west, resolution=resolution)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "77513576-2fed-4d17-a665-d11267b42390", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def download_function(slot):\n", + " ### Chemba east side\n", + " # create a list of requests \n", + " list_of_requests = [get_true_color_request_day_east(slot)]\n", + " list_of_requests = [request.download_list[0] for request in list_of_requests]\n", + "\n", + " # download data chemba east with multiple threads\n", + " data = SentinelHubDownloadClient(config=config).download(list_of_requests, max_threads=15)\n", + " print(f' East downloaded ' +slot)\n", + "\n", + " ### Chemba west side\n", + " # create a list of requests\n", + " list_of_requests = [get_true_color_request_day_west(slot)]\n", + " list_of_requests = [request.download_list[0] for request in list_of_requests]\n", + "\n", + " # download data chemba west with multiple threads\n", + " data = SentinelHubDownloadClient(config=config).download(list_of_requests, max_threads=15)\n", + " print(f' West downloaded ' +slot)\n", + " \n", + " time.sleep(.5)\n", + "\n", + "def merge_files(slot):\n", + " base_path = Path('../laravel_app/storage/app/chemba')\n", + " # List the downloaded Tiffs in the different subfolders with pathlib (native library)\n", + " file_list = [f\"{x}/response.tiff\" for x in Path(base_path / 'single_images' / slot).iterdir()]\n", + " print(file_list)\n", + "\n", + " folder_for_merged_tifs = str(base_path / 'merged_tif' / f\"{slot}.tif\")\n", + " folder_for_virtual_raster = str(base_path / 'merged_virtual' / f\"merged{slot}.vrt\")\n", + "\n", + " # Create a virtual raster\n", + " vrt_all = gdal.BuildVRT(folder_for_virtual_raster, file_list)\n", + " vrt_all = gdal.BuildVRT(folder_for_virtual_raster, file_list)\n", + "\n", + " # Convert to JPEG\n", + " gdal.Translate(folder_for_merged_tifs,folder_for_virtual_raster)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "d5830b6e-da0a-416f-867e-cbca4bd434f5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " East downloaded 2023-09-30\n", + " West downloaded 2023-09-30\n", + " East downloaded 2023-10-01\n", + " West downloaded 2023-10-01\n", + " East downloaded 2023-10-02\n", + " West downloaded 2023-10-02\n", + " East downloaded 2023-10-03\n", + " West downloaded 2023-10-03\n", + " East downloaded 2023-10-04\n", + " West downloaded 2023-10-04\n", + " East downloaded 2023-10-05\n", + " West downloaded 2023-10-05\n", + " East downloaded 2023-10-06\n", + " West downloaded 2023-10-06\n" + ] + } + ], + "source": [ + "for slot in slots:\n", + " download_function(slot)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "68db3c15-6f94-432e-b315-c329e4251b21", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['chemba_single_images/2023-09-30/369e30117c87ea5a93d4b1fdc1e200f5/response.tiff', 'chemba_single_images/2023-09-30/19f952f0b4dc03e82b31ddda504eca37/response.tiff']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning 1: chemba_single_images/2023-09-30/369e30117c87ea5a93d4b1fdc1e200f5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-09-30/19f952f0b4dc03e82b31ddda504eca37/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-09-30/369e30117c87ea5a93d4b1fdc1e200f5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-09-30/19f952f0b4dc03e82b31ddda504eca37/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-09-30/369e30117c87ea5a93d4b1fdc1e200f5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-09-30/19f952f0b4dc03e82b31ddda504eca37/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['chemba_single_images/2023-10-01/52579ecea6e4c674f3f15a70692b2470/response.tiff', 'chemba_single_images/2023-10-01/199af70a0a9bdf56a6938888f8ad073c/response.tiff']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning 1: chemba_single_images/2023-10-01/52579ecea6e4c674f3f15a70692b2470/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-01/199af70a0a9bdf56a6938888f8ad073c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-01/52579ecea6e4c674f3f15a70692b2470/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-01/199af70a0a9bdf56a6938888f8ad073c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-01/52579ecea6e4c674f3f15a70692b2470/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-01/199af70a0a9bdf56a6938888f8ad073c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['chemba_single_images/2023-10-02/131056d1de92580e74203e14cda16072/response.tiff', 'chemba_single_images/2023-10-02/f16e88a64ddff761b1c5b534c18588c5/response.tiff']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning 1: chemba_single_images/2023-10-02/131056d1de92580e74203e14cda16072/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-02/f16e88a64ddff761b1c5b534c18588c5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-02/131056d1de92580e74203e14cda16072/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-02/f16e88a64ddff761b1c5b534c18588c5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-02/131056d1de92580e74203e14cda16072/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-02/f16e88a64ddff761b1c5b534c18588c5/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['chemba_single_images/2023-10-03/7a15a778f1bef721f997fc4c7071a022/response.tiff', 'chemba_single_images/2023-10-03/0cf952e5d972cd1b001c3ca1e0f286fc/response.tiff']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning 1: chemba_single_images/2023-10-03/7a15a778f1bef721f997fc4c7071a022/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-03/0cf952e5d972cd1b001c3ca1e0f286fc/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-03/7a15a778f1bef721f997fc4c7071a022/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-03/0cf952e5d972cd1b001c3ca1e0f286fc/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-03/7a15a778f1bef721f997fc4c7071a022/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-03/0cf952e5d972cd1b001c3ca1e0f286fc/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['chemba_single_images/2023-10-04/37292b2973437bbcd8164d4b0cb5ce09/response.tiff', 'chemba_single_images/2023-10-04/a3957aa1c1478fed498c3f1e94b8703a/response.tiff']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning 1: chemba_single_images/2023-10-04/37292b2973437bbcd8164d4b0cb5ce09/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-04/a3957aa1c1478fed498c3f1e94b8703a/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-04/37292b2973437bbcd8164d4b0cb5ce09/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-04/a3957aa1c1478fed498c3f1e94b8703a/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-04/37292b2973437bbcd8164d4b0cb5ce09/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-04/a3957aa1c1478fed498c3f1e94b8703a/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['chemba_single_images/2023-10-05/1ab274c42d49578ad25c592bc16c5c17/response.tiff', 'chemba_single_images/2023-10-05/ca219fceac18e287d129aaca803998f0/response.tiff']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning 1: chemba_single_images/2023-10-05/1ab274c42d49578ad25c592bc16c5c17/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-05/ca219fceac18e287d129aaca803998f0/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-05/1ab274c42d49578ad25c592bc16c5c17/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-05/ca219fceac18e287d129aaca803998f0/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-05/1ab274c42d49578ad25c592bc16c5c17/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-05/ca219fceac18e287d129aaca803998f0/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['chemba_single_images/2023-10-06/a1c4a82635c5b3379cac01c44428a46c/response.tiff', 'chemba_single_images/2023-10-06/cae35e70e26ce81aff15dcea89246b07/response.tiff']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Warning 1: chemba_single_images/2023-10-06/a1c4a82635c5b3379cac01c44428a46c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-06/cae35e70e26ce81aff15dcea89246b07/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-06/a1c4a82635c5b3379cac01c44428a46c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-06/cae35e70e26ce81aff15dcea89246b07/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-06/a1c4a82635c5b3379cac01c44428a46c/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: chemba_single_images/2023-10-06/cae35e70e26ce81aff15dcea89246b07/response.tiff: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n", + "Warning 1: TIFFReadDirectory:Sum of Photometric type-related color channels and ExtraSamples doesn't match SamplesPerPixel. Defining non-color channels as ExtraSamples.\n" + ] + } + ], + "source": [ + "for slot in slots:\n", + " merge_files(slot)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "4f80e84e-95b5-41dc-83d8-720cd699a79a", + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (4067800170.py, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m Cell \u001b[0;32mIn[13], line 1\u001b[0;36m\u001b[0m\n\u001b[0;31m stop here\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "raise SystemExit(\"Stop right there!\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a8d367da-3eb5-419a-9a8a-d315f8ae8d89", + "metadata": {}, + "outputs": [], + "source": [ + "days = 1\n", + "start = datetime.datetime(2021,3,12)\n", + "end = start + datetime.timedelta(days=days)\n", + "n_chunks = 1\n", + "tdelta = (end - start) / n_chunks\n", + "edges = [(start + i*tdelta).date().isoformat() for i in range(n_chunks)]\n", + "#slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", + "slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", + "\n", + "date = start.strftime(\"%Y-%m-%d\")\n", + "\n", + "print('Monthly time windows:\\n')\n", + "for slot in slots:\n", + " print(slot)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "461cc3fa-4b7a-48aa-abee-25eb97689707", + "metadata": {}, + "outputs": [], + "source": [ + "days = 1\n", + "start = datetime.datetime(2022,4,27)\n", + "end = start + datetime.timedelta(days=days)\n", + "n_chunks = 1\n", + "tdelta = (end - start) / n_chunks\n", + "edges = [(start + i*tdelta).date().isoformat() for i in range(n_chunks)]\n", + "#slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", + "slots = [(edges[i], edges[i]) for i in range(len(edges))]\n", + "\n", + "date = start.strftime(\"%Y-%m-%d\")\n", + "\n", + "### Chemba east side\n", + "chemba_east = [34.8830, -17.3516, 34.9380, -17.2917]\n", + "resolution = 3\n", + "chemba_bbox = BBox(bbox=chemba_east, crs=CRS.WGS84)\n", + "chemba_size = bbox_to_dimensions(chemba_bbox, resolution=resolution)\n", + "\n", + "# create a list of requests \n", + "list_of_requests = [get_true_color_request(slot) for slot in slots]\n", + "list_of_requests = [request.download_list[0] for request in list_of_requests]\n", + "\n", + "# download data with multiple threads\n", + "data = SentinelHubDownloadClient(config=config).download(list_of_requests, max_threads=15)\n", + "\n", + "\n", + "\n", + "### Chemba west side\n", + "chemba_west = [34.9460, -17.3500, 34.9839, -17.3110]\n", + "chemba_bbox = BBox(bbox=chemba_west, crs=CRS.WGS84)\n", + "chemba_size = bbox_to_dimensions(chemba_bbox, resolution=resolution)\n", + "\n", + "print(f'Image shape at {resolution} m resolution: {chemba_size} pixels')\n", + "\n", + "# create a list of requests\n", + "list_of_requests = [get_true_color_request(slot) for slot in slots]\n", + "list_of_requests = [request.download_list[0] for request in list_of_requests]\n", + "\n", + "# download data with multiple threads\n", + "data = SentinelHubDownloadClient(config=config).download(list_of_requests, max_threads=15)\n", + "print(f'data downloaded')\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "52b5f742-3db0-4290-a467-688f8aec36d5", + "metadata": {}, + "source": [ + "### Chemba west side" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d14b7a1e-87a6-4344-859c-5e602bd2e006", + "metadata": {}, + "outputs": [], + "source": [ + "a" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e9daf5c9-39f6-44ea-92dd-dee355669b19", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b7f42def-21c2-439c-9e96-a24ca1eb2176", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c5d6f71-e7af-450f-b6c2-151810220159", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e6f8a1d-bb36-4e96-b06d-6967ea8f3d98", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a3c9cc9-ad37-405a-b8bf-996fd474540e", + "metadata": {}, + "outputs": [], + "source": [ + "a " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2c127e0-eaf6-46b8-af5d-6f8000bf3df3", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "3432ffcf-606f-4c34-8f8c-a21bee6326b4", + "metadata": {}, + "source": [ + "## Visualise the image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d6b8db8-a33b-45bc-80a9-877ee1b8b80c", + "metadata": {}, + "outputs": [], + "source": [ + "evalscript_true_color_png = \"\"\"\n", + " //VERSION=3\n", + "\n", + " function setup() {\n", + " return {\n", + " input: [{\n", + " bands: [\"B1\", \"B2\", \"B3\", \"UDM\"]\n", + " }],\n", + " output: {\n", + " bands: 3\n", + " }\n", + " };\n", + " }\n", + "\n", + " function evaluatePixel(sample) {\n", + " return [2.5 * sample.B1 / 10000, 2.5 * sample.B2 / 10000, 2.5 * sample.B3 / 10000, sample.UDM];\n", + " }\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e498acb8-8e14-41f4-84cd-54f4648c1716", + "metadata": {}, + "outputs": [], + "source": [ + "def get_true_color_request_png(time_interval):\n", + " return SentinelHubRequest(\n", + " evalscript=evalscript_true_color_png,\n", + " input_data=[\n", + " SentinelHubRequest.input_data(\n", + " data_collection=DataCollection.planet_data,\n", + " time_interval=('2022-02-10', '2022-02-17')\n", + " )\n", + " ],\n", + " responses=[\n", + " SentinelHubRequest.output_response('default', MimeType.PNG)\n", + " ],\n", + " bbox=chemba_bbox,\n", + " size=chemba_size,\n", + " config=config\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19fd091a-dd67-484f-a1a7-3bce61bc9517", + "metadata": {}, + "outputs": [], + "source": [ + "# create a list of requests\n", + "list_of_requests_png = [get_true_color_request_png(slot) for slot in slots]\n", + "list_of_requests_png = [request.download_list[0] for request in list_of_requests_png]\n", + "\n", + "# download data with multiple threads\n", + "data_png = SentinelHubDownloadClient(config=config).download(list_of_requests_png, max_threads=5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d8abc2e-e245-490a-83eb-36f6a5ec0418", + "metadata": {}, + "outputs": [], + "source": [ + "# some stuff for pretty plots\n", + "ncols = 4\n", + "nrows = 7\n", + "aspect_ratio = chemba_size[0] / chemba_size[1]\n", + "subplot_kw = {'xticks': [], 'yticks': [], 'frame_on': False}\n", + "\n", + "fig, axs = plt.subplots(ncols=ncols, nrows=nrows, figsize=(5 * ncols * aspect_ratio, 5 * nrows),\n", + " subplot_kw=subplot_kw)\n", + "\n", + "for idx, image in enumerate(data_png):\n", + " ax = axs[idx // ncols][idx % ncols]\n", + " ax.imshow(np.clip(image * 2.5/255, 0, 1))\n", + " ax.set_title(f'{slots[idx][0]} ', fontsize=10)\n", + "\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7803cfac-ce53-4461-8702-88b872ef64aa", + "metadata": {}, + "outputs": [], + "source": [ + "evalscript_true_color = \"\"\"\n", + " //VERSION=3\n", + "\n", + " function setup() {\n", + " return {\n", + " input: [{\n", + " bands: [\"B1\", \"B2\", \"B3\"]\n", + " }],\n", + " output: {\n", + " bands: 3\n", + " }\n", + " };\n", + " }\n", + "\n", + " function evaluatePixel(sample) {\n", + " return [sample.B04, sample.B03, sample.B02];\n", + " }\n", + "\"\"\"\n", + "\n", + "request_true_color = SentinelHubRequest(\n", + " evalscript=evalscript_true_color,\n", + " input_data=[\n", + " SentinelHubRequest.input_data(\n", + " data_collection=DataCollection.planet_data2,\n", + " time_interval=('2022-02-01', '2022-02-10'),\n", + " )\n", + " ],\n", + " responses=[\n", + " SentinelHubRequest.output_response('default', MimeType.PNG)\n", + " ],\n", + " bbox=chemba_bbox,\n", + " size=chemba_size,\n", + " config=config\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab26df2a-f780-4f6b-8d09-0eead9d6db2b", + "metadata": {}, + "outputs": [], + "source": [ + "true_color_imgs = request_true_color.get_data()\n" + ] + }, + { + "cell_type": "markdown", + "id": "a51f41f5-f5e1-4fa7-aef2-53371d1386ce", + "metadata": {}, + "source": [ + "## change file name\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "49a52f5b-2626-4dd2-9e57-6b44691f9952", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import glob\n", + "import json\n", + "import datetime as dt\n", + "from urllib.parse import unquote\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b3720a99-2906-41d9-ac1b-9c9993cd8308", + "metadata": {}, + "outputs": [], + "source": [ + "def get_request_dt(request_file):\n", + " with open(request_file, 'r') as req:\n", + " request = json.load(req)\n", + " url = unquote(request['url'])\n", + " time_parameter = [t for t in url.split('&') if t.startswith('TIME=')][0]\n", + " time = time_parameter.split('TIME=')[1].split('/')[0]\n", + " return dt.datetime.strptime(time, \"%Y-%m-%dT%H:%M:%S\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1f4e5844-34bc-4cb9-9365-46356b1db552", + "metadata": {}, + "outputs": [], + "source": [ + "if __name__ == \"__main__\":\n", + " folders = glob.glob('.\\\\test_dir2\\\\*')\n", + " dates = [get_request_dt(f'{folder}/request.json') for folder in folders]\n", + " df = pd.DataFrame(zip(folders, dates), columns=['folder', 'datetime'])\n", + " df.sort_values(by='datetime', ascending=True, inplace=True)\n", + " print(df.head().to_markdown())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4319580b-f0b7-4370-91f4-bc4fcf068bc3", + "metadata": {}, + "outputs": [], + "source": [ + "def get_request_dt(request_file):\n", + " with open(request_file, 'r') as req:\n", + " request = json.load(req)\n", + " url = unquote(request['url'])\n", + " return url.split('/')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "87580f26-0ccc-4061-a460-52d941a90b6a", + "metadata": {}, + "outputs": [], + "source": [ + "folders = glob.glob('.\\\\test_dir2\\\\*')\n", + "[get_request_dt(f'{folder}/request.json') for folder in folders]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6569956e-91c5-42c9-acfa-74fde22ee1ce", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "folders = glob.glob('.\\\\test_dir2\\\\*')\n", + "dates = [get_request_dt(f'{folder}/request.json') for folder in folders]\n", + "dates" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2608ac51-fa24-4fd6-8758-cf27bda8860e", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/r_app/1_harvest_data_EcoFarm_v2.R b/r_app/1_harvest_data_EcoFarm_v2.R index 06e6771..85cc5b0 100644 --- a/r_app/1_harvest_data_EcoFarm_v2.R +++ b/r_app/1_harvest_data_EcoFarm_v2.R @@ -176,5 +176,4 @@ quadrants2 <- quadrants %>% ) -saveRDS(quadrants2, here(harvest_dir, "harvest_data_new")) - +saveRDS(quadrants2, here(harvest_dir, "harvest_data_new")) \ No newline at end of file diff --git a/r_app/2_CI_data_prep.R b/r_app/2_CI_data_prep.R index 5246c26..30d64c6 100644 --- a/r_app/2_CI_data_prep.R +++ b/r_app/2_CI_data_prep.R @@ -1,21 +1,22 @@ # activeer de renv omgeving; -renv::activate() +renv::activate('~/smartCane/r_app') renv::restore() library(here) library(sf) +library(terra) library(tidyverse) library(lubridate) -library(terra) library(exactextractr) library(CIprep) -laravel_storage_dir <- here("laravel_app/storage/app") +laravel_storage_dir <- here("../laravel_app/storage/app") #preparing directories planet_tif_folder <- here(laravel_storage_dir, "chemba/merged_tif") +merged_final <- here(laravel_storage_dir, "chemba/merged_final_tif") data_dir <- here(laravel_storage_dir, "Data") extracted_CI_dir <- here(data_dir, "extracted_ci") @@ -23,21 +24,24 @@ daily_CI_vals_dir <- here(extracted_CI_dir, "daily_vals") cumulative_CI_vals_dir <- here(extracted_CI_dir, "cumulative_vals") weekly_CI_mosaic <- here(data_dir, "weekly_mosaic") +daily_vrt <- here(data_dir, "vrt") harvest_dir <- here(data_dir, "HarvestData") dir.create(here(extracted_CI_dir)) dir.create(here(daily_CI_vals_dir)) dir.create(here(cumulative_CI_vals_dir)) dir.create(here(weekly_CI_mosaic)) +dir.create(here(daily_vrt)) +dir.create(merged_final) # Creating weekly mosaic -dates <- date_list(0) +dates <- date_list(3) #load pivot geojson -pivot_sf_q <- st_read(here("pivot_20210625.geojson")) %>% dplyr::select(pivot, pivot_quadrant) %>% vect() +pivot_sf_q <- st_read(here( "pivot_20210625.geojson")) %>% dplyr::select(pivot, pivot_quadrant) %>% vect() #load and filter raster files raster_files <- list.files(planet_tif_folder,full.names = T, pattern = ".tif") #use pattern = '.tif$' or something else if you have multiple files in this folder @@ -45,88 +49,163 @@ filtered_files <- map(dates$days_filter, ~ raster_files[grepl(pattern = .x, x = compact() %>% flatten_chr() -rasters_masked <- map(filtered_files, mask_raster, fields = pivot_sf_q) %>% set_names(filtered_files) +#rasters_masked <- map(filtered_files, mask_raster, fields = pivot_sf_q) %>% set_names(filtered_files) -rasters_masked[sapply(rasters_masked, is.null)] <- NULL -rasters_masked <- setNames(rasters_masked, map_chr(names(rasters_masked), date_extract)) +# rasters_masked <- list() # Creëer een lege lijst om de resultaten op te slaan -total_pix_area <- rast(filtered_files[1]) %>% terra::subset(1) %>% +# for (i in seq_along(filtered_files[1])) { +# file_name <- filtered_files[i] +# result <- mask_raster(file_name, fields = pivot_sf_q) +# rasters_masked[[file_name]] <- result +# } + +create_mask_and_crop <- function(file, pivot_sf_q) { +message("starting ", file) + CI <- rast(file) +# names(CI) <- c("green","nir") +message("raster loaded") +print(CI) + CI <- CI[[2]]/CI[[1]]-1 +# CI <- CI$nir/CI$green-1 +message("CI calculated") + CI <- terra::crop(CI, pivot_sf_q, mask = TRUE) #%>% CI_func() + + # v_crop[v_crop == 0] <- NA + # names(v_crop) <- c("red", "green", "blue","nir", "cloud" ,"CI") + # v_crop$CI <- v_crop$CI - 1 + new_file <- here(merged_final, paste0(tools::file_path_sans_ext(basename(file)), ".tif")) + writeRaster(CI, new_file, overwrite = TRUE) + + vrt_file <- here(daily_vrt, paste0(tools::file_path_sans_ext(basename(file)), ".vrt")) + terra::vrt(new_file, vrt_file, overwrite = TRUE) + + # v_crop <- mask_raster(v, pivot_sf_q) + return(CI) + +} + +# rasters_masked <- map(filtered_files, create_mask_and_crop, pivot_sf_q) +# list_global <- list() +vrt_list <- list() + +for (file in filtered_files) { + v_crop <- create_mask_and_crop(file, pivot_sf_q) + emtpy_or_full <- global(v_crop, "notNA") + + vrt_file <- here(daily_vrt, paste0(tools::file_path_sans_ext(basename(file)), ".vrt")) + + if(emtpy_or_full[1,] > 10000){ + # list_global[file] <- file + vrt_list[vrt_file] <- vrt_file + + }else{ + file.remove(vrt_file) + # file.remove(file) + # message(file, " removed") + } + + # Save the processed raster to a new file + # output_file <- here(data_dir, "vrt", paste0(basename(file), "_processed")) + # terra::writeRaster(v_crop, output_file, overwrite = TRUE) + message(file, " processed") + gc() +} + +# list_global <- list_global %>% flatten_chr() +vrt_list <- vrt_list %>% flatten_chr() + +#testing writing raster +# for(i in seq_along(filtered_files)){ +# message("starting ", i) +# x <- mask_raster(filtered_files[i], fields = pivot_sf_q) +# writeRaster(x, filtered_files[i], overwrite=TRUE) +# message("writing ", i) +# } + + +# rasters_masked[sapply(rasters_masked, is.null)] <- NULL + +# rasters_masked <- setNames(list_global, map_chr(names(list_global), date_extract)) + +# }) + + +total_pix_area <- rast(vrt_list[1]) %>% terra::subset(1) %>% setValues(1) %>% crop(pivot_sf_q, mask = TRUE) %>% global(., fun="notNA") #%>% # as.matrix() %>% # `[`(1, 1) -total_pix_area <- rast(filtered_files[1]) %>% subset(1) %>% crop(pivot_sf_q, mask = TRUE) %>% freq(., usenames = TRUE) +# total_pix_area <- rast(filtered_files[1]) %>% subset(1) %>% crop(pivot_sf_q, mask = TRUE) %>% freq(., usenames = TRUE) +# list_global +# rast(list_global[1])[[5]] %>% plot() +# vrt_files <- list.files(here(data_dir, "vrt"),full.names = T) +# vrt_days_filter <- tools::file_path_sans_ext(basename(list_global)) +# vrt_list <- map(vrt_days_filter, ~ vrt_files[grepl(pattern = .x, x = vrt_files)]) %>% +# compact() %>% +# flatten_chr() -layer_5_list <- purrr::map(rasters_masked, function(spatraster) { - spatraster[[5]] +layer_5_list <- purrr::map(vrt_list, function(vrt_list) { + rast(vrt_list[1]) %>% terra::subset(1) }) %>% rast() -cloud_perc_list <- freq(layer_5_list, usenames = TRUE) %>% - mutate(cloud_perc = (100 -((count/sum(total_pix_area$count))*100)), - cloud_thres_5perc = as.integer(cloud_perc < 5), - cloud_thres_40perc = as.integer(cloud_perc < 40)) %>% - rename(Date = layer) %>% select(-value, -count) +missing_pixels_count <- layer_5_list %>% global(., fun="notNA") %>% + mutate( + total_pixels = total_pix_area$notNA, + missing_pixels_percentage = round(100 -((notNA/total_pix_area$notNA)*100)), + thres_5perc = as.integer(missing_pixels_percentage < 5), + thres_40perc = as.integer(missing_pixels_percentage < 40) + ) -cloud_index_5perc <- which(cloud_perc_list$cloud_thres_5perc == max(cloud_perc_list$cloud_thres_5perc)) -cloud_index_40perc <- which(cloud_perc_list$cloud_thres_40perc == max(cloud_perc_list$cloud_thres_40perc)) +# cloud_perc_list <- freq(layer_5_list, usenames = TRUE) %>% +# mutate(cloud_perc = (100 -((count/sum(total_pix_area$notNA))*100)), +# cloud_thres_5perc = as.integer(cloud_perc < 5), +# cloud_thres_40perc = as.integer(cloud_perc < 40)) %>% +# rename(Date = layer) %>% select(-value, -count) +index_5perc <- which(missing_pixels_count$thres_5perc == max(missing_pixels_count$thres_5perc) ) +index_40perc <- which(missing_pixels_count$thres_40perc == max(missing_pixels_count$thres_40perc)) ## Create mosaic -if(sum(cloud_perc_list$cloud_thres_5perc)>1){ +if(sum(missing_pixels_count$thres_5perc)>1){ message("More than 1 raster without clouds (<5%), max composite made") - - cloudy_rasters_list <- rasters_masked[cloud_index_5perc] - raster_list_subset <- lapply(cloudy_rasters_list, function(r) { - subset(r, 6)}) - - rsrc <- sprc(raster_list_subset) + + cloudy_rasters_list <- vrt_list[index_5perc] + + rsrc <- sprc(cloudy_rasters_list) x <- mosaic(rsrc, fun = "max") - - # x <- rast(rasters_masked[cloud_index_5perc[1]]) + names(x) <- "CI" - # writeRaster(x, here(weekly_CI_mosaic ,paste0("week_", dates$week, "_", dates$year, ".tif")), overwrite=TRUE) - # message("raster exported") - -}else if(sum(cloud_perc_list$cloud_thres_5perc)==1){ + +}else if(sum(missing_pixels_count$thres_5perc)==1){ message("Only 1 raster without clouds (<5%)") - - x <- rast(rasters_masked[cloud_index_5perc[1]]) - names(x) <- c("red", "green", "blue","nir", "cloud" ,"CI") - - rsrc <- sprc(raster_list_subset) - x <- mosaic(rsrc, fun = "max") - - # x <- rast(rasters_masked[cloud_index_5perc[1]]) - names(x) <- "CI" - # writeRaster(x, here(weekly_CI_mosaic ,paste0("week_", dates$week, "_", dates$year, ".tif")), overwrite=TRUE) - # message("raster exported") - -}else if(sum(cloud_perc_list$cloud_thres_40perc)>1){ + + x <- rast(vrt_list[index_5perc[1]]) + names(x) <- c("CI") + +}else if(sum(missing_pixels_count$thres_40perc)>1){ message("More than 1 image contains clouds, composite made of <40% cloud cover images") - - cloudy_rasters_list <- rasters_masked[cloud_index_40perc] - raster_list_subset <- lapply(cloudy_rasters_list, function(r) { - subset(r, 6) - }) - - rsrc <- sprc(raster_list_subset) + + cloudy_rasters_list <- vrt_list[index_5perc] + + rsrc <- sprc(cloudy_rasters_list) x <- mosaic(rsrc, fun = "max") names(x) <- "CI" - # writeRaster(x, here(weekly_CI_mosaic ,paste0("week_", dates$week, "_", dates$year, ".tif")), overwrite=TRUE) - # message("raster exported") - + +}else if(sum(missing_pixels_count$thres_40perc)==1){ + message("Only 1 image available but contains clouds") + + x <- rast(vrt_list[index_5perc[1]]) + names(x) <- c("CI") + }else{ message("No cloud free images available") - x <- rast(rasters_masked[1]) - x[x] <- NA - names(x) <- c("red", "green", "blue","nir", "cloud" ,"CI") - # writeRaster(x, here(weekly_CI_mosaic ,paste0("week_", dates$week, "_", dates$year, ".tif")), overwrite=TRUE) - # message("raster exported") - + x <- rast(vrt_list[1]) %>% setValues(NA) + names(x) <- c("CI") + } plot(x$CI, main = paste("CI map", dates$week)) @@ -134,16 +213,33 @@ plot(x$CI, main = paste("CI map", dates$week)) # writeRaster(x, here(weekly_CI_mosaic ,paste0("week_", dates$week, "_", dates$year, ".tif")), overwrite=TRUE) writeRaster(x, here(weekly_CI_mosaic ,paste0("week_", dates$week, "_", dates$year, ".tif")), overwrite=TRUE) - +message("raster written/ made") # Extracting CI +extract_rasters_daily <- function(file, field_geojson, quadrants = TRUE, save_dir) { + # x <- rast(filtered_files[1])%>% CI_func(drop_layers = TRUE) + # date <- date_extract(filtered_files[1]) + # field_geojson <- sf::st_as_sf(pivot_sf_q) + field_geojson <- sf::st_as_sf(field_geojson) + x <- rast(file[1]) + date <- date_extract(file) + pivot_stats <- cbind(field_geojson, mean_CI = round(exactextractr::exact_extract(x, field_geojson, fun = "mean"), 2)) %>% + st_drop_geometry() %>% rename("{date}" := mean_CI) + save_suffix <- if (quadrants){"quadrant"} else {"whole_field"} + save_path <- here(save_dir, paste0("extracted_", date, "_", save_suffix, ".rds")) + saveRDS(pivot_stats, save_path) +} # pivot_sf_q <- st_read(here("..", "Data", "pivot_20210625.geojson")) %>% dplyr::select(pivot, pivot_quadrant) %>% vect() pivot_sf <- st_read(here(data_dir, "pivot_20210625.geojson")) %>% dplyr::select(pivot, pivot_quadrant) %>% group_by(pivot) %>% summarise() %>% vect() - +message("pivot loaded") +raster_files_NEW <- list.files(merged_final,full.names = T, pattern = ".tif") +filtered_files <- map(dates$days_filter, ~ raster_files_NEW[grepl(pattern = .x, x = raster_files_NEW)]) %>% + compact() %>% + flatten_chr() walk(filtered_files, extract_rasters_daily, field_geojson= pivot_sf_q, quadrants = TRUE, daily_CI_vals_dir) - +message("after walk") pivots_dates0 <- readRDS(here(harvest_dir, "harvest_data_new")) %>% filter( pivot %in% c("1.1", "1.2", "1.3", "1.4", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "1.12", "1.13", "1.14" , "1.16" , "1.17" , "1.18" ,"2.1", "2.2", "2.3" , "2.4", "2.5", "3.1", "3.2", "3.3", @@ -165,19 +261,30 @@ harvesting_data <- pivots_dates0 %>% # extracted_values <- list.files("C:\\Users\\timon\\Resilience BV\\4002 CMD App - General\\4002 CMD Team\\4002 TechnicalData\\04 WP2 technical\\DetectingSpotsR\\EcoFarm\\planet\\extracted", # pattern ="_quadrant", full.names = TRUE) extracted_values <- list.files(here(daily_CI_vals_dir), full.names = TRUE) +#get CI values for this week only +#extracted_values <- map(dates$days_filter, ~ extracted_values[grepl(pattern = .x, x = extracted_values)]) %>% +# compact() %>% +# flatten_chr() -head(extracted_values) - +#combine them into one df pivot_stats <- extracted_values %>% - map_dfr(readRDS) %>% + map(readRDS) %>% list_rbind() %>% group_by(pivot_quadrant) %>% summarise(across(everything(), ~ first(na.omit(.)))) + + saveRDS(pivot_stats, here(cumulative_CI_vals_dir,"combined_CI_data.rds")) #used to save the rest of the data into one file + + +#load historic CI data and update it with last week of CI data +combined_CI_data <- readRDS(here(cumulative_CI_vals_dir,"combined_CI_data.rds")) %>% drop_na(pivot_quadrant) +pivot_stats2 <- bind_rows(pivot_stats, combined_CI_data) + pivots_data_present <- unique(pivots_dates0$pivot_quadrant) quadrant_list <- pivots_data_present # gather data into long format for easier calculation and visualisation -pivot_stats_long <- pivot_stats %>% +pivot_stats_long <- pivot_stats2 %>% tidyr::gather("Date", value, -pivot_quadrant, -pivot ) %>% mutate(Date = right(Date, 8), Date = lubridate::ymd(Date) @@ -201,16 +308,15 @@ pivot_select_model_Data_2023 <- unique(pivots_dates_Data_2023$pivot_quadrant) #pivots_dates_Data_2024 <- pivots_dates0 %>% filter(!is.na(season_start_2024)) #pivot_select_model_Data_2024 <- unique(pivots_dates_Data_2024$pivot_quadrant) - ## Extracting the correct CI values - -Data_2021 <- map_dfr(pivot_select_model_Data_2021, ~ extract_CI_data(.x, harvesting_data = harvesting_data, field_CI_data = pivot_stats_long, season = 2021)) -Data_2022 <- map_dfr(pivot_select_model_Data_2022, ~ extract_CI_data(.x, harvesting_data = harvesting_data, field_CI_data = pivot_stats_long, season = 2022)) -Data_2023 <- map_dfr(pivot_select_model_Data_2023, ~ extract_CI_data(.x, harvesting_data = harvesting_data, field_CI_data = pivot_stats_long, season = 2023)) +# Data_2021 <- map(pivot_select_model_Data_2021, ~ extract_CI_data(.x, harvesting_data = harvesting_data, field_CI_data = pivot_stats_long, season = 2021)) %>% list_rbind() +#Data_2022 <- map(pivot_select_model_Data_2022, ~ extract_CI_data(.x, harvesting_data = harvesting_data, field_CI_data = pivot_stats_long, season = 2022)) %>% list_rbind() +Data_2023 <- map(pivot_select_model_Data_2023, ~ extract_CI_data(.x, harvesting_data = harvesting_data, field_CI_data = pivot_stats_long, season = 2023)) %>% list_rbind() #Data_2024 <- map_dfr(pivot_select_model_Data_2024, ~ extract_CI_data(.x, harvesting_data = harvesting_data, field_CI_data = pivot_stats_long, season = 2024)) -CI_all <- rbind(Data_2021, Data_2022, Data_2023) +#CI_all <- rbind(Data_2021, Data_2022, Data_2023) +CI_all <- Data_2023 CI_all <- CI_all %>% group_by(model) %>% mutate(CI_per_day = FitData - lag(FitData), cumulative_CI = cumsum(FitData)) @@ -219,5 +325,3 @@ head(CI_all) saveRDS(CI_all, here(cumulative_CI_vals_dir,"All_pivots_Cumulative_CI_quadrant_year_v2.rds")) - - diff --git a/r_app/CI_report_dashboard_planet.Rmd b/r_app/CI_report_dashboard_planet.Rmd index e485db8..ef577f3 100644 --- a/r_app/CI_report_dashboard_planet.Rmd +++ b/r_app/CI_report_dashboard_planet.Rmd @@ -6,7 +6,7 @@ output: word_document: reference_docx: !expr file.path("word-styles-reference-03.docx") # toc: true -editor_options: +editor_options: chunk_output_type: console --- @@ -50,10 +50,10 @@ s2_dir <- "C:/Users/timon/Resilience BV/4002 CMD App - General/4002 CMD Team/400 ```{r week, message=FALSE, warning=FALSE, include=FALSE} # week <- 5 - today = "2023-10-05" + today = "2023-10-08" week <- week(today) #today = "2022-08-18" - + #today = as.character(Sys.Date()) #week = lubridate::week(Sys.time()) ## week = 26 @@ -66,9 +66,9 @@ title: `r title_var` This PDF-dashboard shows the status of your fields on a weekly basis. We will show this in different ways: -1) The first way is with a general overview of field heterogeneity using ‘variation’ – a higher number indicates more differences between plants in the same field. -2) The second map shows a normal image of the latest week in colour, of the demo fields. -3) Then come the maps per field, which show the status for three weeks ago, two weeks ago, last week, and this week, as well as a percentage difference map between last week and this week. The percentage difference maps shows the relative difference in growth over the last week, with positive numbers showing growth, and negative numbers showing decline. +1) The first way is with a general overview of field heterogeneity using ‘variation’ – a higher number indicates more differences between plants in the same field. +2) The second map shows a normal image of the latest week in colour, of the demo fields. +3) Then come the maps per field, which show the status for three weeks ago, two weeks ago, last week, and this week, as well as a percentage difference map between last week and this week. The percentage difference maps shows the relative difference in growth over the last week, with positive numbers showing growth, and negative numbers showing decline. 4) Below the maps are graphs that show how each pivot quadrant is doing, measured through the chlorophyll index. @@ -84,26 +84,26 @@ today_minus_2 <- as.character(ymd(today) - 14) today_minus_3 <- as.character(ymd(today) - 21) # remove_pivots <- c("1.1", "1.12", "1.8", "1.9", "1.11", "1.14") -CI_quadrant <- readRDS(here(cumulative_CI_vals_dir,"All_pivots_Cumulative_CI_quadrant_year_v2.rds")) %>% - rename(pivot_quadrant = Field) +CI_quadrant <- readRDS(here(cumulative_CI_vals_dir,"All_pivots_Cumulative_CI_quadrant_year_v2.rds"))# %>% + # rename(pivot_quadrant = Field) message("STOP - check ci name in layer") CI <- brick(here(weekly_CI_mosaic, paste0("week_",week, "_2023.tif"))) %>% subset("CI") CI_m1 <- brick(here(weekly_CI_mosaic, paste0("week_",week_minus_1, "_2023.tif"))) %>% subset("CI") #%>% subset("CI") -CI_m2 <- brick(here(weekly_CI_mosaic, paste0("week_",week_minus_2, "_2023.tif"))) %>% subset(6) #%>% subset("CI") -CI_m3 <- brick(here(weekly_CI_mosaic, paste0("week_",week_minus_3, "_2023.tif"))) %>% subset(6) #%>% subset("CI") +CI_m2 <- brick(here(weekly_CI_mosaic, paste0("week_",week_minus_2, "_2023.tif"))) %>% subset("CI") #%>% subset("CI") +CI_m3 <- brick(here(weekly_CI_mosaic, paste0("week_",week_minus_3, "_2023.tif"))) %>% subset("CI") #%>% subset("CI") last_week_dif_raster <- ((CI - CI_m1) / CI_m1) * 100 last_week_dif_raster_abs <- (CI - CI_m1) two_week_dif_raster_abs <- (CI - CI_m2) -AllPivots0 <-st_read(here(data_dir, "pivot_20210625.geojson")) -joined_spans <-st_read(here(data_dir, "spans2.geojson")) %>% st_transform(crs(AllPivots0)) +AllPivots0 <-st_read(here(data_dir, "pivot_20210625.geojson")) +joined_spans <-st_read(here(data_dir, "spans2.geojson")) %>% st_transform(crs(AllPivots0)) pivots_dates <- readRDS(here(harvest_dir, "harvest_data_new")) %>% filter( - pivot %in% c("1.1", "1.2", "1.3", "1.4", "1.7", "1.8", "1.9", "1.10", "1.11", "1.12", "1.13", - "1.14" , "1.16" , "1.17" , "1.18" ,"2.1", "2.2", "2.3" , "2.4", "2.5", "3.1", "3.2", "3.3", + pivot %in% c("1.1", "1.2", "1.3", "1.4", "1.7", "1.8", "1.9", "1.10", "1.11", "1.12", "1.13", + "1.14" , "1.16" , "1.17" , "1.18" ,"2.1", "2.2", "2.3" , "2.4", "2.5", "3.1", "3.2", "3.3", "4.1", "4.2", "4.3", "4.4", "4.5", "4.6", "5.1" ,"5.2", "5.3", "5.4", "6.1", "6.2", "DL1.1", "DL1.3") #without 1.6 ) AllPivots <- merge(AllPivots0, pivots_dates, by = "pivot_quadrant") %>% @@ -112,10 +112,10 @@ AllPivots <- merge(AllPivots0, pivots_dates, by = "pivot_quadrant") %>% AllPivots_merged <- AllPivots %>% group_by(pivot) %>% summarise() -AllPivots_merged <- st_transform(AllPivots_merged, crs = proj4string(CI)) +AllPivots_merged <- st_transform(AllPivots_merged, crs = proj4string(CI)) AllPivots_merged$pivot <- as.factor(AllPivots_merged$pivot) -AllPivots_merged$pivot <- ordered(AllPivots_merged$pivot, levels = c("1.1", "1.2", "1.3", "1.4", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "1.12", "1.13", "1.14" , "1.16" , "1.17" , "1.18" ,"2.1", "2.2", "2.3" , "2.4", "2.5", "3.1", "3.2", "3.3", "4.1", "4.2", "4.3", "4.4", "4.5", "4.6", "5.1" ,"5.2", "5.3", "5.4", "6.1", "6.2", "DL1.1", "DL1.3")) +AllPivots_merged$pivot <- ordered(AllPivots_merged$pivot, levels = c("1.1", "1.2", "1.3", "1.4", "1.6", "1.7", "1.8", "1.9", "1.10", "1.11", "1.12", "1.13", "1.14" , "1.16" , "1.17" , "1.18" ,"2.1", "2.2", "2.3" , "2.4", "2.5", "3.1", "3.2", "3.3", "4.1", "4.2", "4.3", "4.4", "4.5", "4.6", "5.1" ,"5.2", "5.3", "5.4", "6.1", "6.2", "DL1.1", "DL1.3")) pivot_names <- unique(CI_quadrant$pivot) @@ -152,7 +152,7 @@ hetero_plot <- function(data){ tm_layout(main.title=paste0("Homogeneity of pivot quadrants, week ", week, " 2022"),main.title.position = "center")+ tm_compass(position = c("center", "top")) + tm_scale_bar(position = c("center", "top")) - + # print(map, width = 20, units = "cm") } @@ -170,15 +170,15 @@ subchunkify <- function(g, fig_height=7, fig_width=5) { g_deparsed <- paste0(deparse( function() {g} ), collapse = '') - + sub_chunk <- paste0(" `","``{r sub_chunk_", floor(runif(1) * 10000), ", fig.height=", fig_height, ", fig.width=", fig_width, ", echo=FALSE}", - "\n(", + "\n(", g_deparsed , ")()", "\n`","`` ") - + cat(knitr::knit(text = knitr::knit_expand(text = sub_chunk), quiet = TRUE)) } @@ -186,101 +186,101 @@ subchunkify <- function(g, fig_height=7, fig_width=5) { ci_plot <- function(pivotName){ # pivotName = "2.1" - pivotShape <- AllPivots_merged %>% terra::subset(pivot %in% pivotName) %>% st_transform(crs(CI)) + pivotShape <- AllPivots_merged %>% terra::subset(pivot %in% pivotName) %>% st_transform(crs(CI)) age <- AllPivots %>% dplyr::filter(pivot %in% pivotName) %>% st_drop_geometry() %>% dplyr::select(Age) %>% unique() AllPivots2 <- AllPivots %>% dplyr::filter(pivot %in% pivotName) - + singlePivot <- CI %>% crop(., pivotShape) %>% mask(., pivotShape) - + singlePivot_m1 <- CI_m1 %>% crop(., pivotShape) %>% mask(., pivotShape) singlePivot_m2 <- CI_m2 %>% crop(., pivotShape) %>% mask(., pivotShape) singlePivot_m3 <- CI_m3 %>% crop(., pivotShape) %>% mask(., pivotShape) - + abs_CI_last_week <- last_week_dif_raster_abs %>% crop(., pivotShape) %>% mask(., pivotShape) abs_CI_two_week <- two_week_dif_raster_abs %>% crop(., pivotShape) %>% mask(., pivotShape) planting_date <- pivots_dates %>% dplyr::filter(pivot %in% pivotName) %>% ungroup() %>% dplyr::select(planting_date) %>% unique() - + joined_spans2 <- joined_spans %>% st_transform(crs(pivotShape)) %>% dplyr::filter(pivot %in% pivotName) %>% st_crop(., pivotShape) - + CImap_m2 <- create_CI_map(singlePivot_m2, AllPivots2, joined_spans2, show_legend= T, legend_is_portrait = T, week = week_minus_2, age = age -2) CImap_m1 <- create_CI_map(singlePivot_m1, AllPivots2, joined_spans2, show_legend= F, legend_is_portrait = F, week = week_minus_1, age = age -1) CImap <- create_CI_map(singlePivot_m1, AllPivots2, joined_spans2, show_legend= F, legend_is_portrait = F, week = week_minus_1, age = age ) - + CI_max_abs_last_week <- create_CI_diff_map(abs_CI_last_week,AllPivots2, joined_spans2, show_legend = T, legend_is_portrait = T, week_1 = week, week_2 = week_minus_1, age = age) CI_max_abs_two_week <- create_CI_diff_map(abs_CI_last_week, AllPivots2, joined_spans2, show_legend = T, legend_is_portrait = T, week_1 = week, week_2 = week_minus_2, age = age) - + tst <- tmap_arrange(CImap_m2, CImap_m1, CImap,CI_max_abs_last_week, CI_max_abs_two_week, nrow = 1) cat('

Pivot', pivotName, '- week', week, '-', age$Age, 'weeks after planting/harvest

') print(tst) - + } create_CI_map <- function(pivot_raster, pivot_shape, pivot_spans, show_legend = F, legend_is_portrait = F, week, age){ tm_shape(pivot_raster, unit = "m")+ - tm_raster(breaks = c(0,0.5,1,2,3,4,5,6,7,Inf), palette = "RdYlGn",legend.is.portrait = legend_is_portrait ,midpoint = NA) + - tm_layout(main.title = paste0("\nMax CI week ", week,"\n", age, " weeks old"), + tm_raster(breaks = c(0,0.5,1,2,3,4,5,6,7,Inf), palette = "RdYlGn",legend.is.portrait = legend_is_portrait ,midpoint = NA) + + tm_layout(main.title = paste0("\nMax CI week ", week,"\n", age, " weeks old"), main.title.size = 0.7, legend.show = show_legend) + tm_shape(pivot_shape) + tm_borders(lwd = 3) + tm_text("pivot_quadrant", size = 1/2) + - tm_shape(pivot_spans) + tm_borders(lwd = 0.5, alpha=0.5) -} + tm_shape(pivot_spans) + tm_borders(lwd = 0.5, alpha=0.5) +} create_CI_diff_map <- function(pivot_raster, pivot_shape, pivot_spans, show_legend = F, legend_is_portrait = F, week_1, week_2, age){ tm_shape(pivot_raster, unit = "m")+ - tm_raster(breaks = c(-3,-2,-1,0,1,2, 3), palette = "RdYlGn",legend.is.portrait = legend_is_portrait ,midpoint = 0, title = "CI difference") + - tm_layout(main.title = paste0("CI change week ", week_1, "- week ",week_2, "\n", age," weeks old"), + tm_raster(breaks = c(-3,-2,-1,0,1,2, 3), palette = "RdYlGn",legend.is.portrait = legend_is_portrait ,midpoint = 0, title = "CI difference") + + tm_layout(main.title = paste0("CI change week ", week_1, "- week ",week_2, "\n", age," weeks old"), main.title.size = 0.7, legend.show = show_legend) + tm_shape(pivot_shape) + tm_borders(lwd = 3) + tm_text("pivot_quadrant", size = 1/2) + - tm_shape(pivot_spans) + tm_borders(lwd = 0.5, alpha=0.5) + tm_shape(pivot_spans) + tm_borders(lwd = 0.5, alpha=0.5) } cum_ci_plot <- function(pivotName){ # pivotName = "1.17" - data_ci <- CI_quadrant %>% filter(pivot == pivotName) + data_ci <- CI_quadrant %>% filter(pivot == pivotName) data_ci2 <- data_ci %>% mutate(CI_rate = cumulative_CI/DOY, - week = week(Date))%>% group_by(pivot_quadrant) %>% + week = week(Date))%>% group_by(Field) %>% mutate(mean_rolling10 = rollapplyr(CI_rate , width = 10, FUN = mean, partial = TRUE)) #%>% date_preperation_perfect_pivot <- data_ci2 %>% group_by(season) %>% summarise(min_date = min(Date), max_date = max(Date), days = max_date - min_date) - + perfect_pivot_raw <- CI_quadrant %>% group_by(pivot) %>% filter(pivot == "5.1" & season == "2022") %>% group_by(DOY) %>% summarise(cumulative_CI = mean(cumulative_CI)) %>% mutate(CI_rate = cumulative_CI/DOY) %>% mutate(mean_rolling10 = rollapplyr(CI_rate , width = 10, FUN = mean, partial = TRUE)) - + unique_seasons <- unique(date_preperation_perfect_pivot$season) - + if(length(unique_seasons) == 3) { unique_seasons <- unique_seasons[c(2,3)] } else { unique_seasons <- unique_seasons } - + perfect_pivot <- perfect_pivot_raw - + for (s in unique_seasons) { season_dates <- seq(from = date_preperation_perfect_pivot$min_date[date_preperation_perfect_pivot$season == s], - to = date_preperation_perfect_pivot$min_date[date_preperation_perfect_pivot$season == s] + nrow(perfect_pivot_raw) - 1, + to = date_preperation_perfect_pivot$min_date[date_preperation_perfect_pivot$season == s] + nrow(perfect_pivot_raw) - 1, by = "1 day") col_name <- as.character(s) perfect_pivot <- dplyr::bind_cols(perfect_pivot, tibble(!!col_name := season_dates)) } - + perfect_pivot <- perfect_pivot %>% - pivot_longer(cols = -c("DOY", "cumulative_CI", "CI_rate", "mean_rolling10"), + pivot_longer(cols = -c("DOY", "cumulative_CI", "CI_rate", "mean_rolling10"), names_to = "season", values_to = "Date") - g <- ggplot() + + g <- ggplot() + facet_wrap(~season, scales = "free_x") + geom_line(data= data_ci2 %>% filter(season %in% unique_seasons), aes(Date, mean_rolling10, col = pivot_quadrant)) + geom_line(data= perfect_pivot, aes(Date , mean_rolling10, col = "Model CI (p5.1 Data 2022, \n date x axis is fictive)"), lty="11",size=1) + @@ -290,7 +290,7 @@ cum_ci_plot <- function(pivotName){ theme(axis.text.x = element_text(angle = 60, hjust = 1)) # options(repr.plot.width = 2, repr.plot.height = 2) subchunkify(g, 3.2, 10) - + } ``` @@ -299,8 +299,8 @@ cum_ci_plot <- function(pivotName){ RGB_raster <- list.files(paste0(s2_dir,week),full.names = T, pattern = ".tiff", recursive = TRUE)[1] #use pattern = '.tif$' or something else if you have multiple files in this folder -RGB_raster <- brick(RGB_raster) -# RGB_raster <- brick(here("planet", paste0("week_",week, ".tif"))) +RGB_raster <- brick(RGB_raster) +# RGB_raster <- brick(here("planet", paste0("week_",week, ".tif"))) tm_shape(RGB_raster, unit = "m") + tm_rgb(r=1, g=2, b=3, max.value = 255) + tm_layout(main.title = paste0("RGB image of the fields - week ", week), main.title.position = 'center') + @@ -315,7 +315,7 @@ tm_shape(RGB_raster, unit = "m") + tm_rgb(r=1, g=2, b=3, max.value = 255) + ```{r eval=FALSE, fig.height=7.2, fig.width=10, message=FALSE, warning=FALSE, include=FALSE} tm_shape(CI, unit = "m")+ - tm_raster(breaks = c(0,0.5,1,2,3,4,5,6,7,Inf), palette = "RdYlGn", midpoint = NA,legend.is.portrait = F) + + tm_raster(breaks = c(0,0.5,1,2,3,4,5,6,7,Inf), palette = "RdYlGn", midpoint = NA,legend.is.portrait = F) + tm_layout(legend.outside = TRUE,legend.outside.position = "bottom",legend.show = T, main.title = "Overview all fields (CI)")+ tm_scale_bar(position = c("right", "top"), text.color = "black") + @@ -326,7 +326,7 @@ tm_shape(CI, unit = "m")+ tm_shape(last_week_dif_raster_abs, unit = "m")+ - tm_raster(breaks = c(-3,-2,-1,0,1,2, 3), palette = "RdYlGn", midpoint = NA,legend.is.portrait = F) + + tm_raster(breaks = c(-3,-2,-1,0,1,2, 3), palette = "RdYlGn", midpoint = NA,legend.is.portrait = F) + tm_layout(legend.outside = TRUE,legend.outside.position = "bottom",legend.show = F, main.title = "Overview all fields - CI difference")+ tm_scale_bar(position = c("right", "top"), text.color = "black") + @@ -337,7 +337,7 @@ tm_shape(last_week_dif_raster_abs, unit = "m")+ tm_shape(last_week_dif_raster, unit = "m")+ - tm_raster(breaks = c(-Inf,-50,-25,-5,5,25, Inf), palette = "RdYlGn", midpoint = NA,legend.is.portrait = T) + + tm_raster(breaks = c(-Inf,-50,-25,-5,5,25, Inf), palette = "RdYlGn", midpoint = NA,legend.is.portrait = T) + tm_layout(legend.outside = TRUE,legend.outside.position = "right",legend.show = F, main.title = "Overview all fields - CI difference %")+ tm_scale_bar(position = c("right", "top"), text.color = "black") + @@ -359,7 +359,7 @@ pivots <- AllPivots_merged %>% filter(pivot != "1.17") for(i in pivots$pivot) { ci_plot(i) - cum_ci_plot(i) + #cum_ci_plot(i) } # lapply(pivots, function(pivot) { @@ -390,16 +390,16 @@ latest_model <- CI_all2 %>% group_by(pivot) %>% filter(season =="Data_2022") # latest_model <- CI_all2 %>% group_by(pivot) %>% arrange(season, desc(DOY)) %>% slice(1) # CI_all2 <- CI_all %>% group_by(pivot, DOY ) %>% mutate(pivot_cumulative_CI = mean(cumulative_CI)) -# label_data <- CI_all2 %>% group_by(pivot) %>% arrange(season, desc(cumulative_CI)) %>% slice(1) %>% mutate(label = paste(pivot, " - ", round(cumulative_CI))) -label_data <- latest_model %>% arrange(season, desc(cumulative_CI)) %>% slice(1) %>% mutate(label = paste(pivot, " - ", round(cumulative_CI))) +# label_data <- CI_all2 %>% group_by(pivot) %>% arrange(season, desc(cumulative_CI)) %>% slice(1) %>% mutate(label = paste(pivot, " - ", round(cumulative_CI))) +label_data <- latest_model %>% arrange(season, desc(cumulative_CI)) %>% slice(1) %>% mutate(label = paste(pivot, " - ", round(cumulative_CI))) max_day <- label_data %>% group_by(pivot) %>% summarise(max_day = max(DOY)) -ggplot(data= CI_all2%>% filter(season =="Data_2022"), aes(DOY, cumulative_CI, col = pivot)) + +ggplot(data= CI_all2%>% filter(season =="Data_2022"), aes(DOY, cumulative_CI, col = pivot)) + facet_wrap(~month) + geom_line() + # scale_y_continuous(breaks = seq(0, max(label_data$cumulative_CI) + 100, by = 100)) + - labs(title = "Cumulative CI values over the year per pivot, split per 2-month age (rounded down)", x = "Days after harvest/planting (scale is per 2 weeks)", y = "Cumulative CI value", + labs(title = "Cumulative CI values over the year per pivot, split per 2-month age (rounded down)", x = "Days after harvest/planting (scale is per 2 weeks)", y = "Cumulative CI value", color = "Line") + geom_label_repel(data = label_data %>% filter(model %in% latest_model$model), aes(DOY, cumulative_CI, label = label), box.padding = 1, # ylim = c(1300, NA), @@ -408,11 +408,11 @@ ggplot(data= CI_all2%>% filter(season =="Data_2022"), aes(DOY, cumulative_CI, co # segment.curvature = -1e-20, # arrow = arrow(length = unit(0.015, "npc")) - ) + + ) + theme(legend.position="right", legend.text = element_text(size=8), legend.title = element_text(size = 8), plot.title = element_text(size=19)) + # geom_smooth()+ - guides(fill = guide_legend(nrow=2,byrow=TRUE)) + + guides(fill = guide_legend(nrow=2,byrow=TRUE)) + scale_y_continuous(breaks=seq(0,max(label_data$cumulative_CI),100)) + scale_x_continuous(breaks=seq(0,max(max_day$max_day),30)) + theme(axis.text.x = element_text(angle = 90)) + labs(x = "Weeks")+ @@ -425,13 +425,13 @@ The below table shows estimates of the biomass if you would harvest them now. CI_quadrant <- readRDS(here(cumulative_CI_vals_dir,"All_pivots_Cumulative_CI_quadrant_year_v2.rds")) %>% rename( pivot_quadrant = Field)#All_pivots_Cumulative_CI.rds -pivots_dates0 <- readRDS(here(harvest_dir, "harvest_data_new")) %>% ungroup() %>% unique() %>% - dplyr::select(pivot, pivot_quadrant, Tcha_2021, Tcha_2022 ) %>% +pivots_dates0 <- readRDS(here(harvest_dir, "harvest_data_new")) %>% ungroup() %>% unique() %>% + dplyr::select(pivot, pivot_quadrant, Tcha_2021, Tcha_2022 ) %>% pivot_longer(cols = c("Tcha_2021", "Tcha_2022"), names_to = "Tcha_Year", values_to = "Tcha") %>% filter(Tcha > 50) CI_and_yield <- left_join(CI_quadrant , pivots_dates0, by = c("pivot", "pivot_quadrant")) %>% filter(!is.na(Tcha)) %>% - group_by(pivot_quadrant) %>% slice(which.max(DOY)) %>% + group_by(pivot_quadrant) %>% slice(which.max(DOY)) %>% dplyr::select(pivot, pivot_quadrant, Tcha_Year, Tcha, cumulative_CI, DOY) %>% mutate(CI_per_day = cumulative_CI/ DOY) @@ -445,7 +445,7 @@ predictors <- c( "cumulative_CI" , "DOY" ,"CI_per_day" ) response <- "Tcha" CI_and_yield_test <- as.data.frame(CI_and_yield_test) -ctrl <- trainControl(method="cv", +ctrl <- trainControl(method="cv", savePredictions = TRUE, allowParallel= TRUE, number = 5, @@ -473,7 +473,7 @@ pred_ffs_rf <- left_join(., CI_and_yield_validation, by = c("pivot", "pivot_quadrant")) %>% filter(Age_days > 250) -ggplot(pred_ffs_rf, aes(y = predicted_Tcha , x = Tcha , col = pivot )) + +ggplot(pred_ffs_rf, aes(y = predicted_Tcha , x = Tcha , col = pivot )) + geom_point() +geom_abline() + scale_x_continuous(limits = c(50, 160))+ scale_y_continuous(limits = c(50, 160)) + @@ -492,7 +492,7 @@ pred_rf_2023 <- predict(model_ffs_rf, newdata=prediction_2023) %>% dplyr::select(pivot ,pivot_quadrant, Age_days, total_CI, predicted_Tcha_2023)%>% mutate(CI_per_day = round(total_CI/ Age_days, 1)) -ggplot(pred_rf_2023, aes(total_CI , predicted_Tcha_2023 , col = pivot )) + +ggplot(pred_rf_2023, aes(total_CI , predicted_Tcha_2023 , col = pivot )) + geom_point() + labs(title = "2023 data (still to be harvested) - Fields over 300 days old") knitr::kable(pred_rf_2023) @@ -506,17 +506,17 @@ model_CI <-lm( ) pivot_ = "4.4" df4 = data.frame(pivot_, 365, NA) -names(df4)=c("pivot", "DOY", "cumulative_CI") -a <- CI_all %>% filter(season == "Data_2022", pivot == pivot_) %>% ungroup() %>% select(pivot, DOY, cumulative_CI) %>% +names(df4)=c("pivot", "DOY", "cumulative_CI") +a <- CI_all %>% filter(season == "Data_2022", pivot == pivot_) %>% ungroup() %>% select(pivot, DOY, cumulative_CI) %>% complete(DOY = seq.int(max(DOY), 365, 1), pivot = pivot_) %>% arrange(DOY) # complete(DOY = seq.int(max(DOY), 365, 1)) # rbind(.,df4) -b <- predict(model_CI, a) %>% +b <- predict(model_CI, a) %>% as.data.frame() %>% slice(which.max(.)) %>% rename(cumulative_CI = ".") %>% mutate(DOY = 365) -pred_CI_2022 <- predict(model, newdata=b ) %>% - as.data.frame() %>% rename(predicted_Tcha_365 = ".") %>% mutate(pivot = df4$pivot, +pred_CI_2022 <- predict(model, newdata=b ) %>% + as.data.frame() %>% rename(predicted_Tcha_365 = ".") %>% mutate(pivot = df4$pivot, predicted_Tcha_365 = round(predicted_Tcha_365, 0), - Age_days = df4$DOY) + Age_days = df4$DOY) pred_CI_2022 ``` diff --git a/r_app/Rplots.pdf b/r_app/Rplots.pdf new file mode 100644 index 0000000000000000000000000000000000000000..61ffeb0ca9fa782dac7554a0c7c235466b1162ed GIT binary patch literal 162782 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

Y()hDtyunX1qaH{HVl%+x8)m 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Ⓢz4>^>+cO!)79Ui>)8y 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 J> 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 Od|-T5Rz+