SmartCane/python_app/Chemba_download.ipynb
2024-03-01 16:32:53 +01:00

609 lines
21 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "b7ca7102-5fd9-481f-90cd-3ba60e288649",
"metadata": {},
"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": {},
"outputs": [],
"source": [
"#pip install pipreqs"
]
},
{
"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": {},
"outputs": [],
"source": [
"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": {},
"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": {},
"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",
"# nodataValue: NA\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: [\"Red\", \"Green\", \"Blue\", \"NIR\", \"UDM\"]\n",
" }],\n",
" output: {\n",
" bands: 2 \n",
" //sampleType: \"FLOAT32\"\n",
" }\n",
" };\n",
" }\n",
"\n",
" function evaluatePixel(sample) {\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",
"\n",
"BASE_PATH = Path('../laravel_app/storage/app') / os.getenv('PROJECT_DIR','chemba') \n",
"BASE_PATH_SINGLE_IMAGES = Path(BASE_PATH / 'single_images')\n",
"def get_true_color_request_day_east(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, 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",
" 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",
"# 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": {},
"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": {},
"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",
"output_type": "stream",
"text": [
"Monthly time windows:\n",
"\n",
"2024-02-03\n",
"2024-02-04\n",
"2024-02-05\n",
"2024-02-06\n",
"2024-02-07\n",
"2024-02-08\n",
"2024-02-09\n",
"2024-02-10\n",
"2024-02-11\n",
"2024-02-12\n",
"2024-02-13\n",
"2024-02-14\n",
"2024-02-15\n",
"2024-02-16\n",
"2024-02-17\n",
"2024-02-18\n",
"2024-02-19\n",
"2024-02-20\n",
"2024-02-21\n",
"2024-02-22\n",
"2024-02-23\n",
"2024-02-24\n",
"2024-02-25\n",
"2024-02-26\n",
"2024-02-27\n",
"2024-02-28\n",
"2024-02-29\n",
"2024-03-01\n"
]
}
],
"source": [
"import datetime\n",
"\n",
"days_needed = int(os.environ.get(\"DAYS\", 28))\n",
" # Adjust the number of days needed\n",
" \n",
"date_str = os.environ.get(\"DATE\")\n",
"if date_str:\n",
" # Parse de datumstring naar een datetime.date object\n",
" end = datetime.datetime.strptime(date_str, \"%Y-%m-%d\").date()\n",
"else:\n",
" # Gebruik de huidige datum als fallback\n",
" end = datetime.date.today() \n",
"\n",
"\n",
"#end = datetime.datetime(2023, 11, 10)\n",
"#start = datetime.datetime(2023, 10, 19)\n",
"start = end - datetime.timedelta(days=days_needed - 1)\n",
"\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)\n"
]
},
{
"cell_type": "markdown",
"id": "0c18e312-8421-47d7-84f9-ed7d5e47e7ee",
"metadata": {},
"source": [
"### Download images\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "2335139b-dfb1-4371-ae2c-c2b9c8cbf10c",
"metadata": {},
"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": 11,
"id": "77513576-2fed-4d17-a665-d11267b42390",
"metadata": {},
"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",
" \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": 12,
"id": "d5830b6e-da0a-416f-867e-cbca4bd434f5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" East downloaded 2024-02-03\n",
" West downloaded 2024-02-03\n",
" East downloaded 2024-02-04\n",
" West downloaded 2024-02-04\n",
" East downloaded 2024-02-05\n",
" West downloaded 2024-02-05\n",
" East downloaded 2024-02-06\n",
" West downloaded 2024-02-06\n",
" East downloaded 2024-02-07\n",
" West downloaded 2024-02-07\n",
" East downloaded 2024-02-08\n",
" West downloaded 2024-02-08\n",
" East downloaded 2024-02-09\n",
" West downloaded 2024-02-09\n",
" East downloaded 2024-02-10\n",
" West downloaded 2024-02-10\n",
" East downloaded 2024-02-11\n",
" West downloaded 2024-02-11\n",
" East downloaded 2024-02-12\n",
" West downloaded 2024-02-12\n",
" East downloaded 2024-02-13\n",
" West downloaded 2024-02-13\n",
" East downloaded 2024-02-14\n",
" West downloaded 2024-02-14\n",
" East downloaded 2024-02-15\n",
" West downloaded 2024-02-15\n",
" East downloaded 2024-02-16\n",
" West downloaded 2024-02-16\n",
" East downloaded 2024-02-17\n",
" West downloaded 2024-02-17\n",
" East downloaded 2024-02-18\n",
" West downloaded 2024-02-18\n",
" East downloaded 2024-02-19\n",
" West downloaded 2024-02-19\n",
" East downloaded 2024-02-20\n",
" West downloaded 2024-02-20\n",
" East downloaded 2024-02-21\n",
" West downloaded 2024-02-21\n",
" East downloaded 2024-02-22\n",
" West downloaded 2024-02-22\n",
" East downloaded 2024-02-23\n",
" West downloaded 2024-02-23\n",
" East downloaded 2024-02-24\n",
" West downloaded 2024-02-24\n",
" East downloaded 2024-02-25\n",
" West downloaded 2024-02-25\n",
" East downloaded 2024-02-26\n",
" West downloaded 2024-02-26\n",
" East downloaded 2024-02-27\n",
" West downloaded 2024-02-27\n",
" East downloaded 2024-02-28\n",
" West downloaded 2024-02-28\n",
" East downloaded 2024-02-29\n",
" West downloaded 2024-02-29\n",
" East downloaded 2024-03-01\n",
" West downloaded 2024-03-01\n"
]
}
],
"source": [
"for slot in slots:\n",
" download_function(slot)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "68db3c15-6f94-432e-b315-c329e4251b21",
"metadata": {
"tags": []
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['..\\\\laravel_app\\\\storage\\\\app\\\\chemba\\\\single_images\\\\2024-02-03\\\\ad6499018e56b5e1924aa019ccfc6419/response.tiff', '..\\\\laravel_app\\\\storage\\\\app\\\\chemba\\\\single_images\\\\2024-02-03\\\\d402cfafa9a6ae7d7d658652bf0efc8b/response.tiff']\n"
]
},
{
"ename": "ValueError",
"evalue": "Received a NULL pointer.",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn [13], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m slot \u001b[38;5;129;01min\u001b[39;00m slots:\n\u001b[1;32m----> 2\u001b[0m \u001b[43mmerge_files\u001b[49m\u001b[43m(\u001b[49m\u001b[43mslot\u001b[49m\u001b[43m)\u001b[49m\n",
"Cell \u001b[1;32mIn [11], line 36\u001b[0m, in \u001b[0;36mmerge_files\u001b[1;34m(slot)\u001b[0m\n\u001b[0;32m 33\u001b[0m vrt_all \u001b[38;5;241m=\u001b[39m gdal\u001b[38;5;241m.\u001b[39mBuildVRT(folder_for_virtual_raster, file_list)\n\u001b[0;32m 35\u001b[0m \u001b[38;5;66;03m# Convert to JPEG\u001b[39;00m\n\u001b[1;32m---> 36\u001b[0m \u001b[43mgdal\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mTranslate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfolder_for_merged_tifs\u001b[49m\u001b[43m,\u001b[49m\u001b[43mfolder_for_virtual_raster\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[1;32m~\\anaconda3\\lib\\site-packages\\osgeo\\gdal.py:491\u001b[0m, in \u001b[0;36mTranslate\u001b[1;34m(destName, srcDS, **kwargs)\u001b[0m\n\u001b[0;32m 488\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(srcDS, \u001b[38;5;28mstr\u001b[39m):\n\u001b[0;32m 489\u001b[0m srcDS \u001b[38;5;241m=\u001b[39m Open(srcDS)\n\u001b[1;32m--> 491\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mTranslateInternal\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdestName\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msrcDS\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mopts\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallback\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcallback_data\u001b[49m\u001b[43m)\u001b[49m\n",
"File \u001b[1;32m~\\anaconda3\\lib\\site-packages\\osgeo\\gdal.py:4674\u001b[0m, in \u001b[0;36mTranslateInternal\u001b[1;34m(*args)\u001b[0m\n\u001b[0;32m 4672\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mTranslateInternal\u001b[39m(\u001b[38;5;241m*\u001b[39margs):\n\u001b[0;32m 4673\u001b[0m \u001b[38;5;124;03m\"\"\"TranslateInternal(char const * dest, Dataset dataset, GDALTranslateOptions translateOptions, GDALProgressFunc callback=0, void * callback_data=None) -> Dataset\"\"\"\u001b[39;00m\n\u001b[1;32m-> 4674\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_gdal\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mTranslateInternal\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n",
"\u001b[1;31mValueError\u001b[0m: Received a NULL pointer."
]
}
],
"source": [
"for slot in slots:\n",
" merge_files(slot)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "cb3fa856-a550-4899-844a-e69209bba3ad",
"metadata": {},
"outputs": [],
"source": [
"\n",
"import shutil\n",
" \n",
"# List of folder names\n",
"\n",
"folders_to_empty = [BASE_PATH / 'merged_virtual', BASE_PATH_SINGLE_IMAGES]\n",
" \n",
"# Function to empty folders\n",
"\n",
"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)"
]
}
],
"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.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}