diff --git a/README.md b/README.md
index fdfae66..502347a 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,8 @@ enhanced using support from the UK Space Agency.
In this repository:
* [scripts](scripts) ... Contains the core tasks for creating flood maps.
* [tutorial](tutorial) ... End-to-end instructions on using FloodMapper.
- * [resources](resources) ... Files used by the pipeline.
+ * [deploy_boulia](deploy_boulia) ... Minimal FloodMapper deployment example.
+ * [resources](resources) ... Files used by the pipeline and tutorial.
* [flood-activations](flood-activations) ... Local flooding event files.
diff --git a/deploy_boulia/01_Define_AoI_Grid.ipynb b/deploy_boulia/01_Define_AoI_Grid.ipynb
new file mode 100644
index 0000000..09d769d
--- /dev/null
+++ b/deploy_boulia/01_Define_AoI_Grid.ipynb
@@ -0,0 +1,1072 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "41295a98",
+ "metadata": {},
+ "source": [
+ "# Split Chosen AoI Shapes into Grid Patches\n",
+ "\n",
+ "The FloodMapper system requires area-of-interest (AoI) shapes that have been resampled by the fixed grid of processing 'patches' defined in the database. This notebook demonstrates how transform arbitrary AoI shapes into a GeoJSON file suitable for use with FloodMapper."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "ef00587a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Necessary Python modules\n",
+ "import sys\n",
+ "import os\n",
+ "os.environ['USE_PYGEOS'] = '0'\n",
+ "\n",
+ "import pandas as pd\n",
+ "import geopandas as gpd\n",
+ "import folium\n",
+ "\n",
+ "from dotenv import load_dotenv\n",
+ "from db_utils import DB\n",
+ "from ml4floods.data import utils\n",
+ "\n",
+ "# Set bucket will not be requester pays\n",
+ "utils.REQUESTER_PAYS_DEFAULT = False"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fe28b382",
+ "metadata": {},
+ "source": [
+ "## Load environment and project details\n",
+ "\n",
+ "As with the other notebooks, we load credentials and project details from a hidden ```.env``` file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "8f0e02bc",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[INFO] Successfully loaded FloodMapper environment.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Load environment variables (including path to credentials) from '.env' file\n",
+ "env_file_path = \"../.env\" \n",
+ "\n",
+ "# Uncomment for alternative version for Windows (r\"\" indicates raw string)\n",
+ "#env_file_path = r\"C:/Users/User/floodmapper/.env\"\n",
+ "\n",
+ "assert load_dotenv(dotenv_path=env_file_path) == True, \"[ERR] Failed to load environment!\"\n",
+ "assert \"GOOGLE_APPLICATION_CREDENTIALS\" in os.environ, \"[ERR] Missing $GOOGLE_APPLICATION_CREDENTIAL!\"\n",
+ "assert \"GS_USER_PROJECT\" in os.environ, \"[ERR] Missing $GS_USER_PROJECT!\"\n",
+ "key_file_path = os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"]\n",
+ "assert os.path.exists(key_file_path), f\"[ERR] Google credential key file does not exist: \\n{key_file_path} \"\n",
+ "assert \"ML4FLOODS_BASE_DIR\" in os.environ, \"[ERR] Missing $ML4FLOODS_BASE_DIR!\"\n",
+ "base_path = os.environ[\"ML4FLOODS_BASE_DIR\"]\n",
+ "assert os.path.exists(base_path), f\"[ERR] Base path does not exist: \\n{base_path} \"\n",
+ "bucket_name = os.environ[\"BUCKET_URI\"]\n",
+ "assert bucket_name is not None and bucket_name != \"\", f\"Bucket name not defined {bucket_name}\"\n",
+ "\n",
+ "print(\"[INFO] Successfully loaded FloodMapper environment.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "66eae6d7",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[INFO] Connecting to DB 'floodmapper-db'.\n",
+ "[INFO] Connection successfully established.\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Connect to the database (point to the .env file for credentials)\n",
+ "db_conn = DB(env_file_path)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0f314c5e",
+ "metadata": {},
+ "source": [
+ "## Select LGA shapes from the database\n",
+ "\n",
+ "Define a list of LGA names to map and execute the cells below to load their shapes from the database."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "518f1780",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# EDIT THIS CELL\n",
+ "\n",
+ "# Set the list of LGA names to query\n",
+ "lga_names_lst = [\"Boulia\"]\n",
+ "\n",
+ "# Set a session name\n",
+ "session_name = \"boulia_test\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "04f55d47",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[INFO] Returned 1 rows.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " lga_name22 | \n",
+ " geometry | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Boulia | \n",
+ " POLYGON ((137.99802 -22.76750, 137.99802 -22.7... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " lga_name22 geometry\n",
+ "0 Boulia POLYGON ((137.99802 -22.76750, 137.99802 -22.7..."
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Define and execute the query\n",
+ "query = (f\"SELECT lga_name22, ST_AsText(geometry_col) \"\n",
+ " f\"FROM lgas_info \"\n",
+ " f\"WHERE lga_name22 IN %s;\")\n",
+ "data = (tuple(lga_names_lst),)\n",
+ "aoi_df = db_conn.run_query(query, data, fetch=True)\n",
+ "print(f\"[INFO] Returned {len(aoi_df)} rows.\")\n",
+ "\n",
+ "# Format the results into a correct GeoDataFrame\n",
+ "aoi_df['geometry'] = gpd.GeoSeries.from_wkt(aoi_df['st_astext'])\n",
+ "aoi_df.drop(['st_astext'], axis=1, inplace = True)\n",
+ "aoi_gdf = gpd.GeoDataFrame(aoi_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "aoi_gdf.head(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "509f2054",
+ "metadata": {},
+ "source": [
+ "## Visualise the AoIs to be mapped\n",
+ "\n",
+ "The ```aoi_gdf``` dataframe contains a 'geometry' column with the boundaries of the LGAs, which we can visualise to confirm that they correspond to our previous selection."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "58a3826a",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Make this Notebook Trusted to load map: File -> Trust Notebook
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Plot the boundaries over OpenStreetMap layer\n",
+ "aoi_gdf.explore()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "614cf7b5",
+ "metadata": {},
+ "source": [
+ "## Load the pre-defined grid of processing patches\n",
+ "\n",
+ "Next we load the pre-defined grid of square processing patches from the FloodMapper database. To do this we define a Strutured Query Language (SQL - 'sequel') query to fetch the information."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "id": "702f342d",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[INFO] Returned 23834 rows.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " patch_name | \n",
+ " geometry | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " GRID02419 | \n",
+ " POLYGON ((115.91000 -33.60516, 115.91000 -33.3... | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " GRID02420 | \n",
+ " POLYGON ((115.91000 -33.40516, 115.91000 -33.1... | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " GRID02420 | \n",
+ " POLYGON ((115.91000 -33.40516, 115.91000 -33.1... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " patch_name geometry\n",
+ "0 GRID02419 POLYGON ((115.91000 -33.60516, 115.91000 -33.3...\n",
+ "1 GRID02420 POLYGON ((115.91000 -33.40516, 115.91000 -33.1...\n",
+ "2 GRID02420 POLYGON ((115.91000 -33.40516, 115.91000 -33.1..."
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Define and execute the query\n",
+ "query = (f\"SELECT patch_name, ST_AsText(geometry) \"\n",
+ " f\"FROM grid_loc\")\n",
+ "grid_df = db_conn.run_query(query, fetch= True)\n",
+ "print(f\"[INFO] Returned {len(grid_df)} rows.\")\n",
+ "\n",
+ "# Format the results into a correct GeoDataFrame\n",
+ "grid_df['geometry'] = gpd.GeoSeries.from_wkt(grid_df['st_astext'])\n",
+ "grid_df.drop(['st_astext'], axis=1, inplace = True)\n",
+ "grid_gdf = gpd.GeoDataFrame(grid_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "grid_gdf.head(3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "290fdc42",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdEAAAGdCAYAAABNWUmMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9WYwk6XUdfCL3fV8qs7asrat640xzRvaMKAOiZVADCDb8YAKEIFkERBKCSBgwRcOmKchcMCAMkU80REiAQOnBwP/kF4kvhEUCMjlDznC6mzNdvVVXV9eateQauVdmRvwPyXv7y8ilMmvN6o4LDHK6MiJjj/ud7557jqSqqgo99NBDDz300GPoMFz0Duihhx566KHHZQ09ieqhhx566KHHMUNPonrooYceeuhxzNCTqB566KGHHnocM/Qkqoceeuihhx7HDD2J6qGHHnrooccxQ0+ieuihhx566HHM0JOoHnrooYceehwzTBe9AycNRVGws7MDt9sNSZIuenf00EMPPfS4JKGqKgqFAuLxOAyG42HKS59Ed3Z2MDk5edG7oYceeuihxyWNzc1NTExMHGvdS59E3W43gNZJ8Hg8F7w3euihhx56XJaQZRmTk5OcR44Tlz6J0hSux+PRk6geeuihhx5Dx0lKgTqxSA899NBDDz2OGXoS1UMPPfTQQ49jhp5E9dBDDz300OOYoSdRPfTQQw899Dhm6ElUDz300EMPPY4ZehLVQw899NBDj2OGnkT10EMPPfTQ45hxpkn07bffxm/+5m/C4XDA5/N1XWZjYwP/9t/+WzidToRCIfyn//SfcHh4eJa7pYceeuihhx6nEmcqtnB4eIhPf/rTePPNN/G3f/u3Hd83m0383u/9HsLhMH76058inU7jj/7oj6CqKr73ve+d5a7poYceeuihx4njTJPoN77xDQDA3/3d33X9/kc/+hHu37+Pzc1NxONxAMB3v/tdfPazn8Xbb7+tKxDpoYceeugx0nGhNdF3330XN27c4AQKAL/7u7+LWq2GDz744AL3TA899NBDDz2OjgvVzt3d3UU0Gm37m9/vh8Viwe7ubtd1arUaarUa/1uW5TPdRz300EMPPfToFUMj0a9//euQJKnvf7/85S8H/r1uwr+qqvYUBP72t78Nr9fL/+k2aHroocdph6IoWF1dxZMnT5BKpZDJZKCq6kXv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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Plot the grid as a sanity check\n",
+ "grid_gdf.plot(facecolor=\"none\", lw=0.1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3c1a3551",
+ "metadata": {},
+ "source": [
+ "## Use the AoIs to choose the grid patches to process\n",
+ "\n",
+ "The next step is to filter the grid patches to be processed by choosing only those that overlap with the selected AoIs. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "id": "43f62caf",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " patch_name | \n",
+ " geometry | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 12198 | \n",
+ " GRID21228 | \n",
+ " POLYGON ((138.11000 -23.60516, 138.11000 -23.3... | \n",
+ "
\n",
+ " \n",
+ " 12199 | \n",
+ " GRID21228 | \n",
+ " POLYGON ((138.11000 -23.60516, 138.11000 -23.3... | \n",
+ "
\n",
+ " \n",
+ " 12200 | \n",
+ " GRID21228 | \n",
+ " POLYGON ((138.11000 -23.60516, 138.11000 -23.3... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " patch_name geometry\n",
+ "12198 GRID21228 POLYGON ((138.11000 -23.60516, 138.11000 -23.3...\n",
+ "12199 GRID21228 POLYGON ((138.11000 -23.60516, 138.11000 -23.3...\n",
+ "12200 GRID21228 POLYGON ((138.11000 -23.60516, 138.11000 -23.3..."
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Do a spatial join to choose grid patches that overlap with AoIs\n",
+ "valid_names = grid_gdf.sjoin(aoi_gdf, how=\"inner\")[\"patch_name\"]\n",
+ "grid_selected_gdf = grid_gdf[grid_gdf.patch_name.isin(valid_names)]\n",
+ "grid_selected_gdf.drop_duplicates()\n",
+ "grid_selected_gdf.head(3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "id": "de575993",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "Make this Notebook Trusted to load map: File -> Trust Notebook
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Overplot the grid on the selected AOIs\n",
+ "m = aoi_gdf.explore(style_kwds={\"fillOpacity\": 0.1}, name=\"Selected AoIs\")\n",
+ "grid_selected_gdf.explore(m=m, style_kwds={\"fillOpacity\": 0.0}, color=\"red\", name=\"Grid\")\n",
+ "folium.LayerControl(collapsed=False).add_to(m)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "07d81ca6",
+ "metadata": {},
+ "source": [
+ "## Save the gridded AoIs to the GCP bucket\n",
+ "\n",
+ "The Floodmapper system (including the three main scripts) is driven by a saved version of these selected grid patches. The final step is to save the the selection to a GeoJSON format file on the GCP bucket."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "id": "ffa217a9",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[INFO] Will save selected grid patches to:\n",
+ "\tgs://floodmapper-demo/0_DEV/1_Staging/operational/boulia_test/patches_to_map.geojson\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Output filename\n",
+ "outfile = \"patches_to_map.geojson\"\n",
+ "\n",
+ "# Form the session path and output path on the GCP bucket\n",
+ "session_path = os.path.join(bucket_name, \"0_DEV/1_Staging/operational\", \n",
+ " session_name).replace(\"\\\\\", \"/\")\n",
+ "outfile_path = os.path.join(session_path, outfile).replace(\"\\\\\", \"/\")\n",
+ "print(f\"[INFO] Will save selected grid patches to:\\n\\t{outfile_path}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fb604ded",
+ "metadata": {},
+ "source": [
+ "**Note down this path - the FloodMapper scripts will need to read this file on the command line.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "id": "f00036c3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# ML4Floods provides a utility to write to the GCP bucket\n",
+ "utils.write_geojson_to_gcp(outfile_path, grid_selected_gdf)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "id": "0b07f285",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[INFO] Was file written successfully to GCP? -> True\n"
+ ]
+ }
+ ],
+ "source": [
+ "# We can also check if the file was written successfully\n",
+ "fs = utils.get_filesystem(outfile_path)\n",
+ "success = fs.exists(outfile_path)\n",
+ "print(f\"[INFO] Was file written successfully to GCP? -> {success}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2ed60688",
+ "metadata": {},
+ "source": [
+ "Finally, we can also write the selection to a GeoJSON file on our local disk."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "id": "0ec3a1cf",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[INFO] Selected grid patches writen to:\n",
+ "\t/Users/cpurcell/Documents/PROJECT_FLOODS/ML4Floods_DEVELOPMENT/ML4Floods_Enhanced/FloodMapper_Deploy/flood-activations/boulia_test/patches_to_map.geojson\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Write the selected grid patches to local disk\n",
+ "folder_path = os.path.join(base_path, \"flood-activations\", session_name).replace(\"\\\\\", \"/\")\n",
+ "outfile_path = os.path.join(folder_path, outfile).replace(\"\\\\\", \"/\")\n",
+ "os.makedirs(folder_path, exist_ok=True)\n",
+ "grid_selected_gdf.to_file(outfile_path, driver=\"GeoJSON\")\n",
+ "print(f\"[INFO] Selected grid patches writen to:\\n\\t{outfile_path}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "id": "c2c0da4a",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "total 184\r\n",
+ "-rw-r--r-- 1 cpurcell staff 93149 14 Apr 11:11 patches_to_map.geojson\r\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Check that the file is on our local disk\n",
+ "!ls -l {folder_path}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "bc17eaf8",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python (floodmapper)",
+ "language": "python",
+ "name": "floodmapper"
+ },
+ "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.16"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/deploy_boulia/02_Query_Available_Data.ipynb b/deploy_boulia/02_Query_Available_Data.ipynb
new file mode 100644
index 0000000..ea6c8c7
--- /dev/null
+++ b/deploy_boulia/02_Query_Available_Data.ipynb
@@ -0,0 +1,403 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "75b42678",
+ "metadata": {},
+ "source": [
+ "# Query and Visualise Available Satellite Data\n",
+ "\n",
+ "This notebook presents a workflow to query and visualise the Sentinel-2 and Landsat data available in Google Earth Engine under an area of interest (AOI) and over a specified time range."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c223c4d3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Necessary Python modules\n",
+ "import sys\n",
+ "import os\n",
+ "os.environ['USE_PYGEOS'] = '0'\n",
+ "\n",
+ "from ml4floods.data import utils\n",
+ "import geopandas as gpd\n",
+ "from georeader.readers import ee_query, scihubcopernicus_query\n",
+ "import folium\n",
+ "from datetime import datetime, timezone, timedelta\n",
+ "import ee\n",
+ "import geopandas as gpd\n",
+ "import pandas as pd\n",
+ "import folium\n",
+ "from zoneinfo import ZoneInfo\n",
+ "import geemap.foliumap as geemap\n",
+ "from georeader.readers import query_utils\n",
+ "import folium\n",
+ "from georeader.readers import S2_SAFE_reader\n",
+ "\n",
+ "# Set bucket will not be requester pays\n",
+ "utils.REQUESTER_PAYS_DEFAULT = False\n",
+ "\n",
+ "from dotenv import load_dotenv"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d7087918",
+ "metadata": {},
+ "source": [
+ "## Load environment and project details\n",
+ "\n",
+ "As with the other notebooks, we load credentials and project details from a hidden ```.env``` file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e447a084",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load environment variables (including path to credentials) from '.env' file\n",
+ "env_file_path = \"../.env\"\n",
+ "\n",
+ "# Uncomment for alternative version for Windows (r\"\" indicates raw string)\n",
+ "#env_file_path = r\"C:/Users/User/floodmapper/.env\"\n",
+ "\n",
+ "assert load_dotenv(dotenv_path=env_file_path) == True, \"[ERR] Failed to load environment!\"\n",
+ "assert \"GOOGLE_APPLICATION_CREDENTIALS\" in os.environ, \"[ERR] Missing $GOOGLE_APPLICATION_CREDENTIAL!\"\n",
+ "assert \"GS_USER_PROJECT\" in os.environ, \"[ERR] Missing $GS_USER_PROJECT!\"\n",
+ "key_file_path = os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"]\n",
+ "assert os.path.exists(key_file_path), f\"[ERR] Google credential key file does not exist: \\n{key_file_path} \"\n",
+ "assert \"ML4FLOODS_BASE_DIR\" in os.environ, \"[ERR] Missing $ML4FLOODS_BASE_DIR!\"\n",
+ "base_path = os.environ[\"ML4FLOODS_BASE_DIR\"]\n",
+ "assert os.path.exists(base_path), f\"[ERR] Base path does not exist: \\n{base_path} \"\n",
+ "bucket_name = os.environ[\"BUCKET_URI\"]\n",
+ "assert bucket_name is not None and bucket_name != \"\", f\"Bucket name not defined {bucket_name}\"\n",
+ "\n",
+ "print(\"[INFO] Successfully loaded FloodMapper environment.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "3a072aec",
+ "metadata": {},
+ "source": [
+ "**Set the details of the event and mapping session here**."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a48e8f29",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# All work is conducted under a unique session name\n",
+ "session_name = \"boulia_test\"\n",
+ "\n",
+ "# Flooding date range (UTC)\n",
+ "# May need to start day or two earlier\n",
+ "flood_start_date = \"2023-03-08\"\n",
+ "flood_end_date = \"2023-03-30\"\n",
+ "\n",
+ "# Pre-flood date range\n",
+ "# This is a time period before the flood event to inspect reference data\n",
+ "preflood_start_date = \"2022-12-10\"\n",
+ "preflood_end_date = \"2022-12-23\""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "044edc9e",
+ "metadata": {},
+ "source": [
+ "## Parse and check date information\n",
+ "\n",
+ "We assume the UTC timezone for all date queries."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "11cfa944",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# First parse the pre- and post-flood dates\n",
+ "tz = ZoneInfo(\"UTC\")\n",
+ "\n",
+ "_start = datetime.strptime(flood_start_date,\"%Y-%m-%d\").replace(tzinfo=tz)\n",
+ "_end = datetime.strptime(flood_end_date,\"%Y-%m-%d\").replace(tzinfo=tz)\n",
+ "flood_start_period, flood_end_period = sorted([_start, _end])\n",
+ "flood_duration = flood_end_period - flood_start_period\n",
+ "print(f\"[INFO] Flood search period: \\n\\t{flood_start_period} to \\n\\t{flood_end_period}\")\n",
+ "print(f\"[INFO] Flood duration = {flood_duration}\\n\")\n",
+ "\n",
+ "_start = datetime.strptime(preflood_start_date,\"%Y-%m-%d\").replace(tzinfo=tz)\n",
+ "_end = datetime.strptime(preflood_end_date,\"%Y-%m-%d\").replace(tzinfo=tz)\n",
+ "preflood_start_period, preflood_end_period = sorted([_start, _end])\n",
+ "preflood_duration = preflood_end_period - preflood_start_period\n",
+ "print(f\"[INFO] Pre-flood search period: \\n\\t{preflood_start_period} to \\n\\t{preflood_end_period}\")\n",
+ "print(f\"[INFO] Pre-flood duration = {preflood_duration}\\n\")\n",
+ "margin = flood_start_period - preflood_end_period\n",
+ "print(f\"[INFO] Margin before flood = {margin}\\n\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ff2436f2",
+ "metadata": {},
+ "source": [
+ "## Load the gridded AOIs to be mapped\n",
+ "\n",
+ "Here we load the gridded AoIs from the GCP bucket. We created this file in the previous notebook."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "ef185b04",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Gridded AoI filename\n",
+ "grid_aoi_file = \"patches_to_map.geojson\"\n",
+ "\n",
+ "# Form the session path and output path on the GCP bucket\n",
+ "session_path = os.path.join(bucket_name, \"0_DEV/1_Staging/operational\", session_name).replace(\"\\\\\", \"/\")\n",
+ "grid_aoi_path = os.path.join(session_path, grid_aoi_file).replace(\"\\\\\", \"/\")\n",
+ "grid_aois = utils.read_geojson_from_gcp(grid_aoi_path)\n",
+ "grid_aois.drop_duplicates(inplace=True)\n",
+ "print(f\"[INFO] Loaded gridded_aois from the following file:\\n\\t{grid_aoi_path}\")\n",
+ "grid_aois"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "3797f827-b517-402c-a48c-090ae85bfe72",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "# Merge the grid patches to form an outline (MultiPolygon)\n",
+ "aoi_outline_df = grid_aois.geometry.unary_union\n",
+ "aoi_outline_gdf = gpd.GeoDataFrame(geometry=[aoi_outline_df], crs=\"EPSG:4326\")\n",
+ "\n",
+ "# Plot the grid and outline on a Leaflet map\n",
+ "m = grid_aois.explore(style_kwds={\"fillOpacity\": 0.3, \"weight\": 0.0}, name=\"Grid Patches\")\n",
+ "aoi_outline_gdf.explore(m=m, color=\"red\", style_kwds={\"fillOpacity\": 0.0, \"weight\": 2.0}, \n",
+ " name=\"AoI Outline\", highlight=False)\n",
+ "folium.LayerControl(collapsed=False).add_to(m)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b3492168-d98d-461a-bdc1-6e02807c51ec",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Check if any grid patches are duplicates\n",
+ "are_duplicates = grid_aois.duplicated().any()\n",
+ "print(f\"Are any grid names duplicates? -> {are_duplicates}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2f342705",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Drop any duplicates now\n",
+ "grid_aois.drop_duplicates(inplace=True)\n",
+ "grid_aois.duplicated().any()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "91e30343-ae97-40c3-be24-0eaab44ce69a",
+ "metadata": {},
+ "source": [
+ "## Query what images are available in Google Earth Engine"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "704f98a8-01ec-4c7c-8a8b-776b03f5308a",
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "%%time\n",
+ "\n",
+ "# Run a GEE query for Landsat and Sentinel-2 data.\n",
+ "# producttype can be 'both', 'S2', \"Landsat\", \"L8\" or \"L9\".\n",
+ "# add_s2cloudless adds a column that indicates if the s2cloudless image is available .\n",
+ "flood_images_gee, flood_collection = ee_query.query(\n",
+ " area=aoi_outline_df, \n",
+ " date_start=flood_start_period, \n",
+ " date_end=flood_end_period, \n",
+ " producttype=\"both\", \n",
+ " return_collection=True, \n",
+ " add_s2cloudless=True)\n",
+ "\n",
+ "# Print data about the available images\n",
+ "num_images = flood_images_gee.shape[0]\n",
+ "print(f\"[INFO] Found {num_images} flooding images on archive.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "089bdee0",
+ "metadata": {},
+ "source": [
+ "Show selected columns from the table for context."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d87c7b80",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Run the same query for the pre-flood period\n",
+ "preflood_images_gee, preflood_collection = ee_query.query(\n",
+ " area=aoi_outline_df, \n",
+ " date_start=preflood_start_period, \n",
+ " date_end=preflood_end_period, \n",
+ " producttype=\"both\", \n",
+ " return_collection=True, \n",
+ " add_s2cloudless=True)\n",
+ "num_images = preflood_images_gee.shape[0]\n",
+ "print(f\"[INFO] Found {num_images} pre-flood images on archive.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "ab75ef41",
+ "metadata": {},
+ "source": [
+ "Show selected columns from the table for context."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fff2b6c9-0210-4e7a-ae42-a00063e91393",
+ "metadata": {},
+ "source": [
+ "## Visualise the available Landsat and S2 imagery\n",
+ "\n",
+ "Here we can directly visualise the imagery for each satellite overpass. This will help make a selection on which days to include in the flood mapping operation.\n",
+ "\n",
+ "Once the map loads, click on individual Satellite + Date combinations to show the imagery. \n",
+ "\n",
+ "**Note: the map and imagery can take a few seconds to load.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "6fa231b1-bc16-4f9b-9eef-91ccbf52f89a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%%time\n",
+ "# Intialise the OpenStreetMap base layer\n",
+ "m = geemap.Map(location=aoi_outline_df.centroid.coords[0][-1::-1], zoom_start=8)\n",
+ "\n",
+ "# Add the pre-flood data\n",
+ "for (day, satellite), images_day in preflood_images_gee.groupby([\"solarday\", \"satellite\"]): \n",
+ " image_col_day_sat = preflood_collection.filter(ee.Filter.inList(\"title\", images_day.index.tolist())) \n",
+ " bands = [\"B11\",\"B8\",\"B4\"] if satellite.startswith(\"S2\") else [\"B6\",\"B5\",\"B4\"] \n",
+ " m.addLayer(image_col_day_sat, \n",
+ " {\"min\":0, \"max\":3000 if satellite.startswith(\"S2\") else 0.3, \"bands\": bands},\n",
+ " f\"{satellite}: {day}\",\n",
+ " False)\n",
+ " \n",
+ "# Add the flooding data\n",
+ "for (day, satellite), images_day in flood_images_gee.groupby([\"solarday\", \"satellite\"]): \n",
+ " image_col_day_sat = flood_collection.filter(ee.Filter.inList(\"title\", images_day.index.tolist())) \n",
+ " bands = [\"B11\",\"B8\",\"B4\"] if satellite.startswith(\"S2\") else [\"B6\",\"B5\",\"B4\"]\n",
+ " m.addLayer(image_col_day_sat, \n",
+ " {\"min\":0, \"max\":3000 if satellite.startswith(\"S2\") else 0.3, \"bands\": bands},\n",
+ " f\"{satellite}: {day}\",\n",
+ " False)\n",
+ "\n",
+ "aoi_outline_gdf.explore(style_kwds={\"fillOpacity\": 0.1}, color=\"black\", name=\"AoI\", highlight=False, m=m)\n",
+ "folium.LayerControl(collapsed=False).add_to(m)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "5eb894ce",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Show the map\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "7a33f3d9",
+ "metadata": {},
+ "source": [
+ "For the Boulia flood, we can see the following days provide good imagery:\n",
+ "\n",
+ "**Reference Period:**\n",
+ " * S2A: 2022-12-10\n",
+ " * S2A: 2022-12-13\n",
+ " * LC08: 2022-12-16\n",
+ " \n",
+ "**Flood Period:**\n",
+ " * LC09: 2023-03-12\n",
+ " * LC08: 2023-03-13\n",
+ " * S2A: 2023-03-13\n",
+ " * LC09: 2023-03-14\n",
+ " * LC08: 2023-03-15\n",
+ " * S2B: 2023-03-15\n",
+ " * S2B: 2023-03-18\n",
+ " * LC08: 2023-03-20\n",
+ " * S2A: 2023-03-20\n",
+ " * LC09: 2023-03-21\n",
+ " * LC08: 2023-03-22\n",
+ " * S2A: 2023-03-23\n",
+ " * S2B: 2023-03-25\n",
+ "\n",
+ "Water can be seen to flow across the landscape up until the end of March."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python (floodmapper)",
+ "language": "python",
+ "name": "floodmapper"
+ },
+ "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.16"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/deploy_boulia/04_Monitor_Downloads.ipynb b/deploy_boulia/04_Monitor_Downloads.ipynb
new file mode 100644
index 0000000..18d97d0
--- /dev/null
+++ b/deploy_boulia/04_Monitor_Downloads.ipynb
@@ -0,0 +1,392 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "707bb7bc-2991-4d25-8261-dede3fd111c3",
+ "metadata": {},
+ "source": [
+ "# Monitor download state and task progress\n",
+ "Run this notebook to visualise download state and monitor download tasks in progress on Google Earth Engine."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9d92f667-1d95-43e8-b47f-a928cdce5907",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Necessary imports\n",
+ "import os\n",
+ "os.environ['USE_PYGEOS'] = '0'\n",
+ "import pandas as pd\n",
+ "import geopandas as gpd\n",
+ "import time\n",
+ "import folium\n",
+ "import geemap.foliumap as geemap\n",
+ "import branca.colormap\n",
+ "from tqdm.notebook import tqdm\n",
+ "from datetime import datetime\n",
+ "\n",
+ "from db_utils import DB\n",
+ "from dotenv import load_dotenv"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5d30dd68",
+ "metadata": {},
+ "source": [
+ "## Load environment and project details\n",
+ "\n",
+ "As with the other notebooks, we load credentials and project details from a hidden ```.env``` file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e57b7c05",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load environment variables (including path to credentials) from '.env' file\n",
+ "env_file_path = \"../.env\"\n",
+ "\n",
+ "# Uncomment for alternative version for Windows (r\"\" indicates raw string)\n",
+ "#env_file_path = r\"C:/Users/User/floodmapper/.env\"\n",
+ "\n",
+ "assert load_dotenv(dotenv_path=env_file_path) == True, \"[ERR] Failed to load environment!\"\n",
+ "assert \"GOOGLE_APPLICATION_CREDENTIALS\" in os.environ, \"[ERR] Missing $GOOGLE_APPLICATION_CREDENTIAL!\"\n",
+ "assert \"GS_USER_PROJECT\" in os.environ, \"[ERR] Missing $GS_USER_PROJECT!\"\n",
+ "key_file_path = os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"]\n",
+ "assert os.path.exists(key_file_path), f\"[ERR] Google credential key file does not exist: \\n{key_file_path} \"\n",
+ "assert \"ML4FLOODS_BASE_DIR\" in os.environ, \"[ERR] Missing $ML4FLOODS_BASE_DIR!\"\n",
+ "base_path = os.environ[\"ML4FLOODS_BASE_DIR\"]\n",
+ "assert os.path.exists(base_path), f\"[ERR] Base path does not exist: \\n{base_path} \"\n",
+ "print(\"[INFO] Successfully loaded FloodMapper environment.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "21371a78",
+ "metadata": {},
+ "source": [
+ "## Query the download state from the database\n",
+ "\n",
+ "**Set the name of the session here and run all remaining cells in order.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e1aebf3c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# EDIT THE NAME OF THE SESSION\n",
+ "session_name = \"boulia_test\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b404539e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Connect to the database (point to the .env file for credentials)\n",
+ "db_conn = DB(env_file_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cf803cdd",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Query the geometry of the selected area\n",
+ "query = (f\"SELECT DISTINCT sp.patch_name, ST_AsText(gr.geometry) \"\n",
+ " f\"FROM session_patches sp \"\n",
+ " f\"INNER JOIN grid_loc gr \"\n",
+ " f\"ON sp.patch_name = gr.patch_name \"\n",
+ " f\"WHERE sp.session = %s ;\")\n",
+ "data = (session_name,)\n",
+ "grid_sel_df = db_conn.run_query(query, data, fetch=True)\n",
+ "print(f\"[INFO] Returned {len(grid_sel_df)} rows.\")\n",
+ "\n",
+ "# Format the results into a correct GeoDataFrame\n",
+ "grid_sel_df['geometry'] = gpd.GeoSeries.from_wkt(grid_sel_df['st_astext'])\n",
+ "grid_sel_df.drop(['st_astext'], axis=1, inplace = True)\n",
+ "grid_sel_gdf = gpd.GeoDataFrame(grid_sel_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "print(grid_sel_gdf.head(3))\n",
+ "\n",
+ "# Create an outline of the map area\n",
+ "aoi_outline = grid_sel_gdf.geometry.unary_union\n",
+ "aoi_outline_gdf = gpd.GeoDataFrame(geometry=[aoi_outline], crs=\"EPSG:4326\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "91d1737e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Query the patches and their download status\n",
+ "query = (f\"SELECT DISTINCT im.image_id, im.satellite, \"\n",
+ " f\"im.patch_name, im.status, ST_AsText(gr.geometry) \"\n",
+ " f\"FROM image_downloads im \"\n",
+ " f\"INNER JOIN grid_loc gr \"\n",
+ " f\"ON im.patch_name = gr.patch_name \"\n",
+ " f\"INNER JOIN session_patches sp \"\n",
+ " f\"ON im.patch_name = sp.patch_name \"\n",
+ " f\"WHERE sp.session = %s ;\")\n",
+ "data = (session_name,)\n",
+ "grid_df = db_conn.run_query(query, data, fetch=True)\n",
+ "print(f\"[INFO] Returned {len(grid_df)} rows.\")\n",
+ "\n",
+ "# Stop execution if no patches returned\n",
+ "if len(grid_df) == 0:\n",
+ " print(f\"[INFO] No patches for session '{session_name}'.\")\n",
+ " raise KeyboardInterrupt\n",
+ "\n",
+ "# Format the results into a correct GeoDataFrame\n",
+ "grid_df['geometry'] = gpd.GeoSeries.from_wkt(grid_df['st_astext'])\n",
+ "grid_df.drop(['st_astext'], axis=1, inplace = True)\n",
+ "grid_gdf = gpd.GeoDataFrame(grid_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "grid_gdf.head(3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8b754f2b",
+ "metadata": {},
+ "source": [
+ "## Parse number of downloads and skipped files in each patch"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "23f569d8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Extract the patch polygons\n",
+ "geom = grid_gdf[[\"patch_name\", \"geometry\"]].drop_duplicates()\n",
+ "geom = geom.set_index(\"patch_name\")\n",
+ "\n",
+ "# Count the downloaded and skipped files\n",
+ "grid_dl_gdf = grid_gdf.loc[grid_gdf.status == 1]\n",
+ "downloads = grid_dl_gdf.groupby(\"patch_name\").image_id.count()\n",
+ "grid_skip_gdf = grid_gdf.loc[grid_gdf.status == 0]\n",
+ "skipped = grid_skip_gdf.groupby(\"patch_name\").image_id.count()\n",
+ "skipped = skipped.rename({\"image_id\": \"count\"})\n",
+ "\n",
+ "# Create a downloads gdf\n",
+ "downloads_df = pd.concat([downloads, geom], axis = 1)\n",
+ "downloads_df = downloads_df.rename(columns={\"image_id\": \"count\"})\n",
+ "downloads_gdf = gpd.GeoDataFrame(downloads_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "downloads_gdf = downloads_gdf.fillna(0)\n",
+ "\n",
+ "# Create a skipped gdf\n",
+ "skipped_df = pd.concat([skipped, geom], axis = 1)\n",
+ "skipped_df = skipped_df.rename(columns={\"image_id\": \"count\"})\n",
+ "skipped_gdf = gpd.GeoDataFrame(skipped_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "skipped_gdf = skipped_gdf.fillna(0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fa446f38",
+ "metadata": {},
+ "source": [
+ "## Plot the number of downloaded files"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "65a7b63e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define a style function to set the colours\n",
+ "#cm = branca.colormap.LinearColormap(\n",
+ "# ['red', 'orange', 'yellow', 'cyan', 'blue', 'darkblue'],\n",
+ "cm = branca.colormap.linear.YlOrRd_07.scale(\n",
+ " vmin=downloads_gdf[\"count\"].min(), \n",
+ " vmax=downloads_gdf[\"count\"].max())\n",
+ "def style_fn(feature):\n",
+ " return {\n",
+ " 'fillColor': cm(feature['properties']['count']),\n",
+ " 'color': cm(feature['properties']['count']),\n",
+ " 'weight': 0.5,\n",
+ " \"fillOpacity\": 0.5\n",
+ " }\n",
+ "\n",
+ "# Plot the patches colour-coded by number of downloads\n",
+ "m = aoi_outline_gdf.explore(color=\"black\", style_kwds={\"fillOpacity\": 0.0, \"weight\": 3}, \n",
+ " name=\"AoI Outline\", highlight=False)\n",
+ "folium.GeoJson(downloads_gdf, \n",
+ " style_function=style_fn,\n",
+ " name=\"Downloaded Images\",\n",
+ " tooltip=folium.features.GeoJsonTooltip([\"count\"]),\n",
+ " ).add_to(m)\n",
+ "\n",
+ "# Add the colourmap, layer control and show\n",
+ "m.add_child(cm)\n",
+ "folium.LayerControl(collapsed=False).add_to(m)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "809c4889",
+ "metadata": {},
+ "source": [
+ "## Plot the number of skipped files"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d51a7fa3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define a style function to set the colours\n",
+ "#cm = branca.colormap.LinearColormap(\n",
+ "# ['red', 'yellow', 'green'],\n",
+ "cm = branca.colormap.linear.YlOrRd_07.scale(\n",
+ " vmin=skipped_gdf[\"count\"].min(), \n",
+ " vmax=skipped_gdf[\"count\"].max())\n",
+ "def style_fn(feature):\n",
+ " return {\n",
+ " 'fillColor': cm(feature['properties']['count']),\n",
+ " 'color': cm(feature['properties']['count']),\n",
+ " 'weight': 0.5,\n",
+ " \"fillOpacity\": 0.5\n",
+ " }\n",
+ "\n",
+ "# Plot the patches colour-coded by number of downloads\n",
+ "m = aoi_outline_gdf.explore(color=\"black\", style_kwds={\"fillOpacity\": 0.0, \"weight\": 3}, \n",
+ " name=\"AoI Outline\", highlight=False)\n",
+ "folium.GeoJson(skipped_gdf, \n",
+ " style_function=style_fn,\n",
+ " name=\"Skipped Images\",\n",
+ " tooltip=folium.features.GeoJsonTooltip([\"count\"]),\n",
+ " ).add_to(m)\n",
+ "\n",
+ "# Add the colourmap, layer control and show\n",
+ "m.add_child(cm)\n",
+ "folium.LayerControl(collapsed=False).add_to(m)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8e004463",
+ "metadata": {},
+ "source": [
+ "## Monitor the task count and progress\n",
+ "\n",
+ "The cell below can be run to check the number of tasks being tracked by the database. Note that the ```01_download_images.py``` script must remain running for this notebook to work correctly.\n",
+ "\n",
+ "Individual tasks can also be viewed on this GEE [task tracking page](https://code.earthengine.google.com/tasks), provided you are logged Google Earth Engine via your web browser. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "944750ad-bab7-422e-9714-e49522d2e029",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Function to query the task status in the database\n",
+ "def query_tasks():\n",
+ " query = (f\"SELECT description, state_code \"\n",
+ " f\"FROM gee_task_tracker \"\n",
+ " f\"WHERE session = %s;\")\n",
+ " data = (session_name,)\n",
+ " tasks_df = db_conn.run_query(query, data, fetch=True)\n",
+ " tasks_grp = tasks_df.groupby(\"state_code\")\n",
+ " \n",
+ " # Get the total number of tasks\n",
+ " num_tasks = len(tasks_df)\n",
+ " \n",
+ " # Get the number completed\n",
+ " num_completed = 0\n",
+ " if \"COMPLETED\" in tasks_grp.groups.keys():\n",
+ " num_completed = tasks_grp.count().loc[\"COMPLETED\"][0]\n",
+ "\n",
+ " return num_tasks, num_completed\n",
+ "\n",
+ "# Query the total number of tasks being tracked\n",
+ "num_tasks_old, _ = query_tasks()\n",
+ "print(f\"[INFO] There are currently {num_tasks_old} tasks being tracked.\")\n",
+ "\n",
+ "# Initialise a progress bar\n",
+ "pbar = tqdm(total=num_tasks_old,\n",
+ " dynamic_ncols=True,\n",
+ " leave=False,\n",
+ " position=0,\n",
+ " desc=\"Task Progress\")\n",
+ "\n",
+ "# Query the status every and update bar\n",
+ "interval_s = 1\n",
+ "num_completed_old = 0\n",
+ "while True:\n",
+ " num_tasks, num_completed = query_tasks()\n",
+ " if num_tasks > num_tasks_old:\n",
+ " print(f\"[WARN] Total number of tasks has changed!\\n\"\n",
+ " f\" Restart cell after all tasks have been submitted.\")\n",
+ " break\n",
+ " num_increment = num_completed - num_completed_old\n",
+ " num_completed_old = num_completed\n",
+ " pbar.update(num_increment)\n",
+ " now = datetime.now()\n",
+ " poll_time = now.strftime(\"%H:%M:%S\")\n",
+ " print(f\"[INFO] Last polling time: {poll_time}\", end=\"\\r\")\n",
+ " \n",
+ " # Exit if all tasks completed\n",
+ " if num_tasks == 0 or num_completed == num_tasks:\n",
+ " print(f\"[INFO] No active tasks remaining.\")\n",
+ " break\n",
+ " \n",
+ " # Increment after interval\n",
+ " time.sleep(interval_s)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "298a3d56",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python (floodmapper)",
+ "language": "python",
+ "name": "floodmapper"
+ },
+ "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.16"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/deploy_boulia/05_Monitor_Mapping.ipynb b/deploy_boulia/05_Monitor_Mapping.ipynb
new file mode 100644
index 0000000..f5ae7c9
--- /dev/null
+++ b/deploy_boulia/05_Monitor_Mapping.ipynb
@@ -0,0 +1,434 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "707bb7bc-2991-4d25-8261-dede3fd111c3",
+ "metadata": {},
+ "source": [
+ "# Monitor progress of mapping tasks\n",
+ "\n",
+ "Run this notebook to visualise the progress of mapping tasks."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9d92f667-1d95-43e8-b47f-a928cdce5907",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Necessary imports\n",
+ "import os\n",
+ "os.environ['USE_PYGEOS'] = '0'\n",
+ "import pandas as pd\n",
+ "import geopandas as gpd\n",
+ "import time\n",
+ "import folium\n",
+ "import geemap.foliumap as geemap\n",
+ "import branca.colormap\n",
+ "from tqdm.notebook import tqdm\n",
+ "from datetime import datetime\n",
+ "\n",
+ "from db_utils import DB\n",
+ "from dotenv import load_dotenv"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5d30dd68",
+ "metadata": {},
+ "source": [
+ "## Load environment and project details\n",
+ "\n",
+ "As with the other notebooks, we load credentials and project details from a hidden ```.env``` file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e57b7c05",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load environment variables (including path to credentials) from '.env' file\n",
+ "env_file_path = \"../.env\"\n",
+ "\n",
+ "# Uncomment for alternative version for Windows (r\"\" indicates raw string)\n",
+ "#env_file_path = r\"C:/Users/User/floodmapper/.env\"\n",
+ "\n",
+ "assert load_dotenv(dotenv_path=env_file_path) == True, \"[ERR] Failed to load environment!\"\n",
+ "assert \"GOOGLE_APPLICATION_CREDENTIALS\" in os.environ, \"[ERR] Missing $GOOGLE_APPLICATION_CREDENTIAL!\"\n",
+ "assert \"GS_USER_PROJECT\" in os.environ, \"[ERR] Missing $GS_USER_PROJECT!\"\n",
+ "key_file_path = os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"]\n",
+ "assert os.path.exists(key_file_path), f\"[ERR] Google credential key file does not exist: \\n{key_file_path} \"\n",
+ "assert \"ML4FLOODS_BASE_DIR\" in os.environ, \"[ERR] Missing $ML4FLOODS_BASE_DIR!\"\n",
+ "base_path = os.environ[\"ML4FLOODS_BASE_DIR\"]\n",
+ "assert os.path.exists(base_path), f\"[ERR] Base path does not exist: \\n{base_path} \"\n",
+ "print(\"[INFO] Successfully loaded FloodMapper environment.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "21371a78",
+ "metadata": {},
+ "source": [
+ "## Retrieve the session parameters\n",
+ "\n",
+ "**Set the name of the session here and run all remaining cells in order.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e1aebf3c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# EDIT THE NAME OF THE SESSION\n",
+ "session_name = \"boulia_test\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b404539e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Connect to the database (point to the .env file for credentials)\n",
+ "db_conn = DB(env_file_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a753763a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Fetch the session parameters from the database\n",
+ "query = (f\"SELECT flood_date_start, flood_date_end, \"\n",
+ " f\"ref_date_start, ref_date_end, bucket_uri \"\n",
+ " f\"FROM session_info \"\n",
+ " f\"WHERE session = %s\")\n",
+ "data = (session_name,)\n",
+ "session_df = db_conn.run_query(query, data, fetch=True)\n",
+ "flood_start_date = session_df.iloc[0][\"flood_date_start\"]\n",
+ "flood_end_date = session_df.iloc[0][\"flood_date_end\"]\n",
+ "ref_start_date = session_df.iloc[0][\"ref_date_start\"]\n",
+ "ref_end_date = session_df.iloc[0][\"ref_date_end\"]\n",
+ "bucket_uri = session_df.iloc[0][\"bucket_uri\"]\n",
+ "\n",
+ "# Fetch the AoI grid patches from the database\n",
+ "query = (f\"SELECT DISTINCT patch_name \"\n",
+ " f\"FROM session_patches \"\n",
+ " f\"WHERE session = %s\")\n",
+ "data = (session_name,)\n",
+ "aois_df = db_conn.run_query(query, data, fetch=True)\n",
+ "num_patches = len(aois_df)\n",
+ "print(f\"[INFO] Found {num_patches} grid patches in map.\")\n",
+ "aois_list = aois_df.patch_name.to_list()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "2677b209",
+ "metadata": {},
+ "source": [
+ "## Query the progress of inference from database"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2e97d59e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Query the inference status and geometry of each image\n",
+ "query = (f\"SELECT DISTINCT dl.image_id, dl.patch_name, inf.status, ST_AsText(gr.geometry) \"\n",
+ " f\"FROM image_downloads dl \"\n",
+ " f\"LEFT JOIN grid_loc gr \"\n",
+ " f\"ON dl.patch_name = gr.patch_name \"\n",
+ " f\"LEFT JOIN (SELECT * FROM inference WHERE mode='vect') AS inf \"\n",
+ " f\"ON dl.image_id = inf.image_id \"\n",
+ " f\"WHERE dl.patch_name IN %s \"\n",
+ " f\"AND dl.status = 1 \"\n",
+ " f\"AND ((dl.date >= %s \"\n",
+ " f\"AND dl.date <= %s) \")\n",
+ "data = [tuple(aois_list), flood_start_date, flood_end_date]\n",
+ "if ref_start_date is not None and ref_end_date is not None:\n",
+ " query += (f\"OR (dl.date >= %s \"\n",
+ " f\"AND dl.date <= %s));\")\n",
+ " data += [ref_start_date, ref_end_date]\n",
+ "else:\n",
+ " query += (f\");\")\n",
+ "inf_df = db_conn.run_query(query, data, fetch = True)\n",
+ "num_rows = len(inf_df)\n",
+ "print(f\"[INFO] Entries for {num_rows} images in the DB.\")\n",
+ "\n",
+ "# Format the results into a correct GeoDataFrame\n",
+ "inf_df['geometry'] = gpd.GeoSeries.from_wkt(inf_df['st_astext'])\n",
+ "inf_df.drop(['st_astext'], axis=1, inplace = True)\n",
+ "inf_gdf = gpd.GeoDataFrame(inf_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "inf_gdf = inf_gdf.fillna(0)\n",
+ "\n",
+ "# Create an outline of the map area\n",
+ "aoi_outline = inf_gdf.geometry.unary_union\n",
+ "aoi_outline_gdf = gpd.GeoDataFrame(geometry=[aoi_outline], crs=\"EPSG:4326\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8b754f2b",
+ "metadata": {},
+ "source": [
+ "## Parse the number of inference processed files in each grid patch"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "23f569d8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Extract the patch polygons\n",
+ "geom = inf_gdf[[\"patch_name\", \"geometry\"]].drop_duplicates()\n",
+ "geom = geom.set_index(\"patch_name\")\n",
+ "\n",
+ "# Count the processed and unprocessed files\n",
+ "grid_inf_gdf = inf_gdf.loc[inf_gdf.status == 1]\n",
+ "processed = grid_inf_gdf.groupby(\"patch_name\").image_id.count()\n",
+ "grid_not_gdf = inf_gdf.loc[inf_gdf.status == 0]\n",
+ "unprocessed = grid_not_gdf.groupby(\"patch_name\").image_id.count()\n",
+ "\n",
+ "# Create a processed gdf\n",
+ "processed_df = pd.concat([processed, geom], axis = 1)\n",
+ "processed_df = processed_df.rename(columns={\"image_id\": \"count\"})\n",
+ "processed_gdf = gpd.GeoDataFrame(processed_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "processed_gdf = processed_gdf.fillna(0)\n",
+ "\n",
+ "# Create an unprocessed gdf\n",
+ "unprocessed_df = pd.concat([unprocessed, geom], axis = 1)\n",
+ "unprocessed_df = unprocessed_df.rename(columns={\"image_id\": \"count\"})\n",
+ "unprocessed_gdf = gpd.GeoDataFrame(unprocessed_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "unprocessed_gdf = unprocessed_gdf.fillna(0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fa446f38",
+ "metadata": {},
+ "source": [
+ "## Plot the number of inference processed files"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "65a7b63e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define a style function to set the colours\n",
+ "#cm = branca.colormap.LinearColormap(\n",
+ "# ['red', 'orange', 'yellow', 'cyan', 'blue', 'darkblue'],\n",
+ "cm = branca.colormap.linear.YlOrRd_07.scale(\n",
+ " vmin=processed_gdf[\"count\"].min(), \n",
+ " vmax=processed_gdf[\"count\"].max())\n",
+ "def style_fn(feature):\n",
+ " return {\n",
+ " 'fillColor': cm(feature['properties']['count']),\n",
+ " 'color': cm(feature['properties']['count']),\n",
+ " 'weight': 0.5,\n",
+ " \"fillOpacity\": 0.5\n",
+ " }\n",
+ "\n",
+ "# Plot the patches colour-coded by number of downloads\n",
+ "m = aoi_outline_gdf.explore(color=\"black\", style_kwds={\"fillOpacity\": 0.0, \"weight\": 3}, \n",
+ " name=\"AoI Outline\", highlight=False)\n",
+ "folium.GeoJson(processed_gdf, \n",
+ " style_function=style_fn,\n",
+ " name=\"Processed Images\",\n",
+ " tooltip=folium.features.GeoJsonTooltip([\"count\"]),\n",
+ " ).add_to(m)\n",
+ "\n",
+ "# Add the colourmap, layer control and show\n",
+ "m.add_child(cm)\n",
+ "folium.LayerControl(collapsed=False).add_to(m)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "809c4889",
+ "metadata": {},
+ "source": [
+ "## Plot the number of inference unprocessed files"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d51a7fa3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define a style function to set the colours\n",
+ "#cm = branca.colormap.LinearColormap(\n",
+ "# ['red', 'yellow', 'green'],\n",
+ "cm = branca.colormap.linear.YlOrRd_07.scale(\n",
+ " vmin=unprocessed_gdf[\"count\"].min(), \n",
+ " vmax=unprocessed_gdf[\"count\"].max())\n",
+ "def style_fn(feature):\n",
+ " return {\n",
+ " 'fillColor': cm(feature['properties']['count']),\n",
+ " 'color': cm(feature['properties']['count']),\n",
+ " 'weight': 0.5,\n",
+ " \"fillOpacity\": 0.5\n",
+ " }\n",
+ "\n",
+ "# Plot the patches colour-coded by number of downloads\n",
+ "m = aoi_outline_gdf.explore(color=\"black\", style_kwds={\"fillOpacity\": 0.0, \"weight\": 3}, \n",
+ " name=\"AoI Outline\", highlight=False)\n",
+ "folium.GeoJson(unprocessed_gdf, \n",
+ " style_function=style_fn,\n",
+ " name=\"Unprocessed Images\",\n",
+ " tooltip=folium.features.GeoJsonTooltip([\"count\"]),\n",
+ " ).add_to(m)\n",
+ "\n",
+ "# Add the colourmap, layer control and show\n",
+ "m.add_child(cm)\n",
+ "folium.LayerControl(collapsed=False).add_to(m)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "f1d8fa3c",
+ "metadata": {},
+ "source": [
+ "## Calculate the percentage processed (inference)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "00455f07",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "num_processed = inf_gdf[inf_gdf.status==1].status.count()\n",
+ "num_files = len(inf_gdf)\n",
+ "num_unprocessed = inf_gdf[inf_gdf.status==0].status.count()\n",
+ "percent_processed = round(num_processed*100 / num_files, 2)\n",
+ "print(f\"[INFO] Inference is {percent_processed}% processed ({num_processed}/{num_files} files).\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fc2085c2",
+ "metadata": {},
+ "source": [
+ "## Query the progress of the temporal aggregation step"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "c1fc2517",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Query the inference status and geometry of each image\n",
+ "query = (f\"SELECT DISTINCT s.patch_name, t.status, ST_AsText(gr.geometry) \"\n",
+ " f\"FROM session_patches s \"\n",
+ " f\"LEFT JOIN grid_loc gr \"\n",
+ " f\"ON s.patch_name = gr.patch_name \"\n",
+ " f\"LEFT JOIN (SELECT * FROM postproc_temporal WHERE mode='flood' AND session = %s) AS t \"\n",
+ " f\"ON s.patch_name = t.patch_name \"\n",
+ " f\"WHERE s.session = %s ;\")\n",
+ "data = [session_name, session_name]\n",
+ "tmp_df = db_conn.run_query(query, data, fetch = True)\n",
+ "num_rows = len(tmp_df)\n",
+ "print(f\"[INFO] Entries for {num_rows} patches in the DB.\")\n",
+ "\n",
+ "# Format the results into a correct GeoDataFrame\n",
+ "tmp_df['geometry'] = gpd.GeoSeries.from_wkt(tmp_df['st_astext'])\n",
+ "tmp_df.drop(['st_astext'], axis=1, inplace = True)\n",
+ "tmp_gdf = gpd.GeoDataFrame(tmp_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "tmp_gdf = tmp_gdf.fillna(0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6c0d0c91",
+ "metadata": {},
+ "source": [
+ "## Plot the progress of temporal aggregation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "655b56dd",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define a style function to set the colours\n",
+ "cm = branca.colormap.LinearColormap(['red', 'blue'])\n",
+ "def style_fn(feature):\n",
+ " return {\n",
+ " 'fillColor': cm(feature['properties']['status']),\n",
+ " 'color': cm(feature['properties']['status']),\n",
+ " 'weight': 0.5,\n",
+ " \"fillOpacity\": 0.5\n",
+ " }\n",
+ "\n",
+ "# Plot the patches colour-coded by number of downloads\n",
+ "m = aoi_outline_gdf.explore(color=\"black\", style_kwds={\"fillOpacity\": 0.0, \"weight\": 3}, \n",
+ " name=\"AoI Outline\", highlight=False)\n",
+ "folium.GeoJson(tmp_gdf, \n",
+ " style_function=style_fn,\n",
+ " name=\"Temporal Aggregation Done\",\n",
+ " tooltip=folium.features.GeoJsonTooltip([\"status\"]),\n",
+ " ).add_to(m)\n",
+ "\n",
+ "# Add the colourmap, layer control and show\n",
+ "m.add_child(cm)\n",
+ "folium.LayerControl(collapsed=False).add_to(m)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "f205f099",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python (floodmapper)",
+ "language": "python",
+ "name": "floodmapper"
+ },
+ "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.16"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/deploy_boulia/README.md b/deploy_boulia/README.md
new file mode 100644
index 0000000..b2fe363
--- /dev/null
+++ b/deploy_boulia/README.md
@@ -0,0 +1,53 @@
+# Example FloodMapper Deployment
+
+This directory contains the minimum set of notebooks and instructions
+to deploy FloodMapper on a new event. The example here is flooding in
+the Boulia LGA during March 2023.
+
+## 1. Define the gridded AoI to map
+
+ * [01_Define_AoI_Grid.ipynb](01_Define_AoI_Grid.ipynb)
+
+## 2. Query and visualise available data
+
+ * [02_Query_Available_Data.ipynb](02_Query_Available_Data.ipynb)
+
+## 3. Download data and create maps
+
+Based on the quick-look analysis in the previous notebook, the
+following download and mapping commands should be run in a terminal:
+
+```
+# Change to the scripts directory
+cd ../scripts
+
+# Download data by specifying a list of LGA names
+python 01_download_images.py \
+ --lga-names Boulia \
+ --session-code boulia_test \
+ --flood-start-date 2023-03-12 \
+ --flood-end-date 2023-03-25 \
+ --ref-start-date 2022-12-10 \
+ --ref-end-date 2022-12-16 \
+ --path-env-file ../.env
+
+# Start the inference process
+python 02_run_inference.py \
+ --session-code boulia_test \
+ --path-env-file ../.env \
+ --collection-name both \
+ --distinguish-flood-traces
+
+# Aggregate and merge the predictions into a final flood map
+python 03_run_postprocessing.py \
+ --session-code boulia_test \
+ --path-env-file ../.env
+```
+
+After the postprocessingscript has completed, the final maps will be
+available on the GCP bucket under the ```operational/boulia_test```
+folder.
+
+## 4. Monitor mapping progress
+
+ * [04_Monitor_Downloads.ipynb](04_Monitor_Downloads.ipynb)
diff --git a/deploy_boulia/db_utils.py b/deploy_boulia/db_utils.py
new file mode 100644
index 0000000..63a0594
--- /dev/null
+++ b/deploy_boulia/db_utils.py
@@ -0,0 +1,97 @@
+import psycopg2
+import psycopg2.extras as extras
+import os
+import glob
+import warnings
+import pandas as pd
+from dotenv import load_dotenv
+
+
+class DB:
+ """
+ Class to define an interface to a Postgress database running on a
+ remote server. Connection details of the database are loaded from a
+ ".env" file with an entry like:
+
+ # Database access credentials
+ ML4FLOODS_DB_HOST="127.0.0.1"
+ ML4FLOODS_DB_NAME="database_name"
+ ML4FLOODS_DB_USER="db_user"
+ ML4FLOODS_DB_PWD=""
+
+ """
+
+ def __init__(self, dotenv_path=".env"):
+ """
+ Load the DB connection details and initialise a DB cursor.
+ """
+
+ success_load = load_dotenv(dotenv_path, override=True)
+ if not success_load:
+ e = "[ERR] Failed to load the '{}' file.".format(dotenv_path)
+ raise Exception(e)
+ db_details_available = self._check_credentials_env()
+ if not db_details_available:
+ e = "[ERR] DB details missing from '{}' file.".format(dotenv_path)
+ raise Exception(e)
+ print("[INFO] Connecting to DB '{}'.".format(
+ os.environ["ML4FLOODS_DB_NAME"]))
+ self.conn = psycopg2.connect(
+ host=os.environ["ML4FLOODS_DB_HOST"],
+ database=os.environ["ML4FLOODS_DB_NAME"],
+ user=os.environ["ML4FLOODS_DB_USER"],
+ password=os.environ["ML4FLOODS_DB_PWD"])
+ self.conn.autocommit = True
+ self.cur = self.conn.cursor()
+ print("[INFO] Connection successfully established.")
+
+ def run_query(self, query, data=None, fetch=False):
+ """
+ Runs a SQL query on the DB and returns a DataFrame with results.
+ """
+ cur = self.conn.cursor()
+ try:
+ cur.execute(query, data)
+ if fetch:
+ df = pd.DataFrame(cur.fetchall(),
+ columns=[desc[0] for desc in cur.description])
+ cur.close()
+ return df
+ else:
+ cur.close()
+ return
+ except Exception as e:
+ print("[ERR] SQL query failed: \n")
+ print(e)
+ return False
+
+ def run_batch_insert(self, query, data=None, page_size=100):
+ """
+ Insert multiple rows into the database in a single query.
+ """
+ cur = self.conn.cursor()
+ try:
+ extras.execute_batch(cur, query, data)
+ cur.close()
+ return
+ except Exception as e:
+ print("[ERR] SQL query failed: \n")
+ print(e)
+ return False
+
+ def close_connection(self):
+ """
+ Close the DB connection cleanly.
+ """
+ self.conn.close()
+
+ def _check_credentials_env(self):
+ """
+ Check the DB credential environment variables exist.
+ """
+ required_keys = ["ML4FLOODS_DB_HOST",
+ "ML4FLOODS_DB_NAME",
+ "ML4FLOODS_DB_USER",
+ "ML4FLOODS_DB_PWD"]
+ env_keys = list(os.environ.keys())
+ return all(k in env_keys for k in required_keys)
diff --git a/flood-activations/boulia_test/patches_to_map.geojson b/flood-activations/boulia_test/patches_to_map.geojson
new file mode 100644
index 0000000..af47071
--- /dev/null
+++ b/flood-activations/boulia_test/patches_to_map.geojson
@@ -0,0 +1,268 @@
+{
+"type": "FeatureCollection",
+"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
+"features": [
+{ "type": "Feature", "properties": { "patch_name": "GRID21228" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -23.605160441383681 ], [ 138.110000000000383, -23.39516044138368 ], [ 137.900000000000375, -23.39516044138368 ], [ 137.900000000000375, -23.605160441383681 ], [ 138.110000000000383, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21228" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -23.605160441383681 ], [ 138.110000000000383, -23.39516044138368 ], [ 137.900000000000375, -23.39516044138368 ], [ 137.900000000000375, -23.605160441383681 ], [ 138.110000000000383, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21228" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -23.605160441383681 ], [ 138.110000000000383, -23.39516044138368 ], [ 137.900000000000375, -23.39516044138368 ], [ 137.900000000000375, -23.605160441383681 ], [ 138.110000000000383, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21229" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -23.405160441383678 ], [ 138.110000000000383, -23.195160441383678 ], [ 137.900000000000375, -23.195160441383678 ], [ 137.900000000000375, -23.405160441383678 ], [ 138.110000000000383, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21229" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -23.405160441383678 ], [ 138.110000000000383, -23.195160441383678 ], [ 137.900000000000375, -23.195160441383678 ], [ 137.900000000000375, -23.405160441383678 ], [ 138.110000000000383, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21230" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -23.205160441383676 ], [ 138.110000000000383, -22.995160441383675 ], [ 137.900000000000375, -22.995160441383675 ], [ 137.900000000000375, -23.205160441383676 ], [ 138.110000000000383, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21230" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -23.205160441383676 ], [ 138.110000000000383, -22.995160441383675 ], [ 137.900000000000375, -22.995160441383675 ], [ 137.900000000000375, -23.205160441383676 ], [ 138.110000000000383, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21231" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -23.005160441383673 ], [ 138.110000000000383, -22.795160441383672 ], [ 137.900000000000375, -22.795160441383672 ], [ 137.900000000000375, -23.005160441383673 ], [ 138.110000000000383, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21231" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -23.005160441383673 ], [ 138.110000000000383, -22.795160441383672 ], [ 137.900000000000375, -22.795160441383672 ], [ 137.900000000000375, -23.005160441383673 ], [ 138.110000000000383, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21232" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.80516044138367 ], [ 138.110000000000383, -22.595160441383669 ], [ 137.900000000000375, -22.595160441383669 ], [ 137.900000000000375, -22.80516044138367 ], [ 138.110000000000383, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21232" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.80516044138367 ], [ 138.110000000000383, -22.595160441383669 ], [ 137.900000000000375, -22.595160441383669 ], [ 137.900000000000375, -22.80516044138367 ], [ 138.110000000000383, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21233" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.605160441383667 ], [ 138.110000000000383, -22.395160441383666 ], [ 137.900000000000375, -22.395160441383666 ], [ 137.900000000000375, -22.605160441383667 ], [ 138.110000000000383, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21233" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.605160441383667 ], [ 138.110000000000383, -22.395160441383666 ], [ 137.900000000000375, -22.395160441383666 ], [ 137.900000000000375, -22.605160441383667 ], [ 138.110000000000383, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21234" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.405160441383664 ], [ 138.110000000000383, -22.195160441383663 ], [ 137.900000000000375, -22.195160441383663 ], [ 137.900000000000375, -22.405160441383664 ], [ 138.110000000000383, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21234" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.405160441383664 ], [ 138.110000000000383, -22.195160441383663 ], [ 137.900000000000375, -22.195160441383663 ], [ 137.900000000000375, -22.405160441383664 ], [ 138.110000000000383, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21235" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.205160441383661 ], [ 138.110000000000383, -21.995160441383661 ], [ 137.900000000000375, -21.995160441383661 ], [ 137.900000000000375, -22.205160441383661 ], [ 138.110000000000383, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21235" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.205160441383661 ], [ 138.110000000000383, -21.995160441383661 ], [ 137.900000000000375, -21.995160441383661 ], [ 137.900000000000375, -22.205160441383661 ], [ 138.110000000000383, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21236" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.005160441383659 ], [ 138.110000000000383, -21.795160441383658 ], [ 137.900000000000375, -21.795160441383658 ], [ 137.900000000000375, -22.005160441383659 ], [ 138.110000000000383, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21236" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.005160441383659 ], [ 138.110000000000383, -21.795160441383658 ], [ 137.900000000000375, -21.795160441383658 ], [ 137.900000000000375, -22.005160441383659 ], [ 138.110000000000383, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21236" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -22.005160441383659 ], [ 138.110000000000383, -21.795160441383658 ], [ 137.900000000000375, -21.795160441383658 ], [ 137.900000000000375, -22.005160441383659 ], [ 138.110000000000383, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21237" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -21.805160441383656 ], [ 138.110000000000383, -21.595160441383655 ], [ 137.900000000000375, -21.595160441383655 ], [ 137.900000000000375, -21.805160441383656 ], [ 138.110000000000383, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21237" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -21.805160441383656 ], [ 138.110000000000383, -21.595160441383655 ], [ 137.900000000000375, -21.595160441383655 ], [ 137.900000000000375, -21.805160441383656 ], [ 138.110000000000383, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21238" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -21.605160441383653 ], [ 138.110000000000383, -21.395160441383652 ], [ 137.900000000000375, -21.395160441383652 ], [ 137.900000000000375, -21.605160441383653 ], [ 138.110000000000383, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21238" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -21.605160441383653 ], [ 138.110000000000383, -21.395160441383652 ], [ 137.900000000000375, -21.395160441383652 ], [ 137.900000000000375, -21.605160441383653 ], [ 138.110000000000383, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21239" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -21.40516044138365 ], [ 138.110000000000383, -21.195160441383649 ], [ 137.900000000000375, -21.195160441383649 ], [ 137.900000000000375, -21.40516044138365 ], [ 138.110000000000383, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21239" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -21.40516044138365 ], [ 138.110000000000383, -21.195160441383649 ], [ 137.900000000000375, -21.195160441383649 ], [ 137.900000000000375, -21.40516044138365 ], [ 138.110000000000383, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21240" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -21.205160441383647 ], [ 138.110000000000383, -20.995160441383646 ], [ 137.900000000000375, -20.995160441383646 ], [ 137.900000000000375, -21.205160441383647 ], [ 138.110000000000383, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21240" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -21.205160441383647 ], [ 138.110000000000383, -20.995160441383646 ], [ 137.900000000000375, -20.995160441383646 ], [ 137.900000000000375, -21.205160441383647 ], [ 138.110000000000383, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21240" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.110000000000383, -21.205160441383647 ], [ 138.110000000000383, -20.995160441383646 ], [ 137.900000000000375, -20.995160441383646 ], [ 137.900000000000375, -21.205160441383647 ], [ 138.110000000000383, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21397" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -23.605160441383681 ], [ 138.310000000000372, -23.39516044138368 ], [ 138.100000000000364, -23.39516044138368 ], [ 138.100000000000364, -23.605160441383681 ], [ 138.310000000000372, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21397" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -23.605160441383681 ], [ 138.310000000000372, -23.39516044138368 ], [ 138.100000000000364, -23.39516044138368 ], [ 138.100000000000364, -23.605160441383681 ], [ 138.310000000000372, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21398" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -23.405160441383678 ], [ 138.310000000000372, -23.195160441383678 ], [ 138.100000000000364, -23.195160441383678 ], [ 138.100000000000364, -23.405160441383678 ], [ 138.310000000000372, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21399" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -23.205160441383676 ], [ 138.310000000000372, -22.995160441383675 ], [ 138.100000000000364, -22.995160441383675 ], [ 138.100000000000364, -23.205160441383676 ], [ 138.310000000000372, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21400" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -23.005160441383673 ], [ 138.310000000000372, -22.795160441383672 ], [ 138.100000000000364, -22.795160441383672 ], [ 138.100000000000364, -23.005160441383673 ], [ 138.310000000000372, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21401" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -22.80516044138367 ], [ 138.310000000000372, -22.595160441383669 ], [ 138.100000000000364, -22.595160441383669 ], [ 138.100000000000364, -22.80516044138367 ], [ 138.310000000000372, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21402" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -22.605160441383667 ], [ 138.310000000000372, -22.395160441383666 ], [ 138.100000000000364, -22.395160441383666 ], [ 138.100000000000364, -22.605160441383667 ], [ 138.310000000000372, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21403" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -22.405160441383664 ], [ 138.310000000000372, -22.195160441383663 ], [ 138.100000000000364, -22.195160441383663 ], [ 138.100000000000364, -22.405160441383664 ], [ 138.310000000000372, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21404" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -22.205160441383661 ], [ 138.310000000000372, -21.995160441383661 ], [ 138.100000000000364, -21.995160441383661 ], [ 138.100000000000364, -22.205160441383661 ], [ 138.310000000000372, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21405" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -22.005160441383659 ], [ 138.310000000000372, -21.795160441383658 ], [ 138.100000000000364, -21.795160441383658 ], [ 138.100000000000364, -22.005160441383659 ], [ 138.310000000000372, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21406" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -21.805160441383656 ], [ 138.310000000000372, -21.595160441383655 ], [ 138.100000000000364, -21.595160441383655 ], [ 138.100000000000364, -21.805160441383656 ], [ 138.310000000000372, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21407" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -21.605160441383653 ], [ 138.310000000000372, -21.395160441383652 ], [ 138.100000000000364, -21.395160441383652 ], [ 138.100000000000364, -21.605160441383653 ], [ 138.310000000000372, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21408" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -21.40516044138365 ], [ 138.310000000000372, -21.195160441383649 ], [ 138.100000000000364, -21.195160441383649 ], [ 138.100000000000364, -21.40516044138365 ], [ 138.310000000000372, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21409" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -21.205160441383647 ], [ 138.310000000000372, -20.995160441383646 ], [ 138.100000000000364, -20.995160441383646 ], [ 138.100000000000364, -21.205160441383647 ], [ 138.310000000000372, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21409" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -21.205160441383647 ], [ 138.310000000000372, -20.995160441383646 ], [ 138.100000000000364, -20.995160441383646 ], [ 138.100000000000364, -21.205160441383647 ], [ 138.310000000000372, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21410" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -21.005160441383644 ], [ 138.310000000000372, -20.795160441383644 ], [ 138.100000000000364, -20.795160441383644 ], [ 138.100000000000364, -21.005160441383644 ], [ 138.310000000000372, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21410" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.310000000000372, -21.005160441383644 ], [ 138.310000000000372, -20.795160441383644 ], [ 138.100000000000364, -20.795160441383644 ], [ 138.100000000000364, -21.005160441383644 ], [ 138.310000000000372, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21566" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -23.605160441383681 ], [ 138.51000000000036, -23.39516044138368 ], [ 138.300000000000352, -23.39516044138368 ], [ 138.300000000000352, -23.605160441383681 ], [ 138.51000000000036, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21566" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -23.605160441383681 ], [ 138.51000000000036, -23.39516044138368 ], [ 138.300000000000352, -23.39516044138368 ], [ 138.300000000000352, -23.605160441383681 ], [ 138.51000000000036, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21567" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -23.405160441383678 ], [ 138.51000000000036, -23.195160441383678 ], [ 138.300000000000352, -23.195160441383678 ], [ 138.300000000000352, -23.405160441383678 ], [ 138.51000000000036, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21568" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -23.205160441383676 ], [ 138.51000000000036, -22.995160441383675 ], [ 138.300000000000352, -22.995160441383675 ], [ 138.300000000000352, -23.205160441383676 ], [ 138.51000000000036, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21569" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -23.005160441383673 ], [ 138.51000000000036, -22.795160441383672 ], [ 138.300000000000352, -22.795160441383672 ], [ 138.300000000000352, -23.005160441383673 ], [ 138.51000000000036, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21570" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -22.80516044138367 ], [ 138.51000000000036, -22.595160441383669 ], [ 138.300000000000352, -22.595160441383669 ], [ 138.300000000000352, -22.80516044138367 ], [ 138.51000000000036, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21571" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -22.605160441383667 ], [ 138.51000000000036, -22.395160441383666 ], [ 138.300000000000352, -22.395160441383666 ], [ 138.300000000000352, -22.605160441383667 ], [ 138.51000000000036, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21572" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -22.405160441383664 ], [ 138.51000000000036, -22.195160441383663 ], [ 138.300000000000352, -22.195160441383663 ], [ 138.300000000000352, -22.405160441383664 ], [ 138.51000000000036, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21573" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -22.205160441383661 ], [ 138.51000000000036, -21.995160441383661 ], [ 138.300000000000352, -21.995160441383661 ], [ 138.300000000000352, -22.205160441383661 ], [ 138.51000000000036, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21574" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -22.005160441383659 ], [ 138.51000000000036, -21.795160441383658 ], [ 138.300000000000352, -21.795160441383658 ], [ 138.300000000000352, -22.005160441383659 ], [ 138.51000000000036, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21575" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -21.805160441383656 ], [ 138.51000000000036, -21.595160441383655 ], [ 138.300000000000352, -21.595160441383655 ], [ 138.300000000000352, -21.805160441383656 ], [ 138.51000000000036, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21576" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -21.605160441383653 ], [ 138.51000000000036, -21.395160441383652 ], [ 138.300000000000352, -21.395160441383652 ], [ 138.300000000000352, -21.605160441383653 ], [ 138.51000000000036, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21577" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -21.40516044138365 ], [ 138.51000000000036, -21.195160441383649 ], [ 138.300000000000352, -21.195160441383649 ], [ 138.300000000000352, -21.40516044138365 ], [ 138.51000000000036, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21577" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -21.40516044138365 ], [ 138.51000000000036, -21.195160441383649 ], [ 138.300000000000352, -21.195160441383649 ], [ 138.300000000000352, -21.40516044138365 ], [ 138.51000000000036, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21578" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -21.205160441383647 ], [ 138.51000000000036, -20.995160441383646 ], [ 138.300000000000352, -20.995160441383646 ], [ 138.300000000000352, -21.205160441383647 ], [ 138.51000000000036, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21578" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -21.205160441383647 ], [ 138.51000000000036, -20.995160441383646 ], [ 138.300000000000352, -20.995160441383646 ], [ 138.300000000000352, -21.205160441383647 ], [ 138.51000000000036, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21579" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.51000000000036, -21.005160441383644 ], [ 138.51000000000036, -20.795160441383644 ], [ 138.300000000000352, -20.795160441383644 ], [ 138.300000000000352, -21.005160441383644 ], [ 138.51000000000036, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21735" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -23.605160441383681 ], [ 138.710000000000377, -23.39516044138368 ], [ 138.500000000000369, -23.39516044138368 ], [ 138.500000000000369, -23.605160441383681 ], [ 138.710000000000377, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21735" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -23.605160441383681 ], [ 138.710000000000377, -23.39516044138368 ], [ 138.500000000000369, -23.39516044138368 ], [ 138.500000000000369, -23.605160441383681 ], [ 138.710000000000377, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21736" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -23.405160441383678 ], [ 138.710000000000377, -23.195160441383678 ], [ 138.500000000000369, -23.195160441383678 ], [ 138.500000000000369, -23.405160441383678 ], [ 138.710000000000377, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21737" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -23.205160441383676 ], [ 138.710000000000377, -22.995160441383675 ], [ 138.500000000000369, -22.995160441383675 ], [ 138.500000000000369, -23.205160441383676 ], [ 138.710000000000377, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21738" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -23.005160441383673 ], [ 138.710000000000377, -22.795160441383672 ], [ 138.500000000000369, -22.795160441383672 ], [ 138.500000000000369, -23.005160441383673 ], [ 138.710000000000377, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21739" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -22.80516044138367 ], [ 138.710000000000377, -22.595160441383669 ], [ 138.500000000000369, -22.595160441383669 ], [ 138.500000000000369, -22.80516044138367 ], [ 138.710000000000377, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21740" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -22.605160441383667 ], [ 138.710000000000377, -22.395160441383666 ], [ 138.500000000000369, -22.395160441383666 ], [ 138.500000000000369, -22.605160441383667 ], [ 138.710000000000377, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21741" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -22.405160441383664 ], [ 138.710000000000377, -22.195160441383663 ], [ 138.500000000000369, -22.195160441383663 ], [ 138.500000000000369, -22.405160441383664 ], [ 138.710000000000377, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21742" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -22.205160441383661 ], [ 138.710000000000377, -21.995160441383661 ], [ 138.500000000000369, -21.995160441383661 ], [ 138.500000000000369, -22.205160441383661 ], [ 138.710000000000377, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21743" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -22.005160441383659 ], [ 138.710000000000377, -21.795160441383658 ], [ 138.500000000000369, -21.795160441383658 ], [ 138.500000000000369, -22.005160441383659 ], [ 138.710000000000377, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21744" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -21.805160441383656 ], [ 138.710000000000377, -21.595160441383655 ], [ 138.500000000000369, -21.595160441383655 ], [ 138.500000000000369, -21.805160441383656 ], [ 138.710000000000377, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21745" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -21.605160441383653 ], [ 138.710000000000377, -21.395160441383652 ], [ 138.500000000000369, -21.395160441383652 ], [ 138.500000000000369, -21.605160441383653 ], [ 138.710000000000377, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21746" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -21.40516044138365 ], [ 138.710000000000377, -21.195160441383649 ], [ 138.500000000000369, -21.195160441383649 ], [ 138.500000000000369, -21.40516044138365 ], [ 138.710000000000377, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21746" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -21.40516044138365 ], [ 138.710000000000377, -21.195160441383649 ], [ 138.500000000000369, -21.195160441383649 ], [ 138.500000000000369, -21.40516044138365 ], [ 138.710000000000377, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21747" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -21.205160441383647 ], [ 138.710000000000377, -20.995160441383646 ], [ 138.500000000000369, -20.995160441383646 ], [ 138.500000000000369, -21.205160441383647 ], [ 138.710000000000377, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21747" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.710000000000377, -21.205160441383647 ], [ 138.710000000000377, -20.995160441383646 ], [ 138.500000000000369, -20.995160441383646 ], [ 138.500000000000369, -21.205160441383647 ], [ 138.710000000000377, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21904" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -23.605160441383681 ], [ 138.910000000000394, -23.39516044138368 ], [ 138.700000000000387, -23.39516044138368 ], [ 138.700000000000387, -23.605160441383681 ], [ 138.910000000000394, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21904" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -23.605160441383681 ], [ 138.910000000000394, -23.39516044138368 ], [ 138.700000000000387, -23.39516044138368 ], [ 138.700000000000387, -23.605160441383681 ], [ 138.910000000000394, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21905" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -23.405160441383678 ], [ 138.910000000000394, -23.195160441383678 ], [ 138.700000000000387, -23.195160441383678 ], [ 138.700000000000387, -23.405160441383678 ], [ 138.910000000000394, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21906" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -23.205160441383676 ], [ 138.910000000000394, -22.995160441383675 ], [ 138.700000000000387, -22.995160441383675 ], [ 138.700000000000387, -23.205160441383676 ], [ 138.910000000000394, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21907" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -23.005160441383673 ], [ 138.910000000000394, -22.795160441383672 ], [ 138.700000000000387, -22.795160441383672 ], [ 138.700000000000387, -23.005160441383673 ], [ 138.910000000000394, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21908" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -22.80516044138367 ], [ 138.910000000000394, -22.595160441383669 ], [ 138.700000000000387, -22.595160441383669 ], [ 138.700000000000387, -22.80516044138367 ], [ 138.910000000000394, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21909" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -22.605160441383667 ], [ 138.910000000000394, -22.395160441383666 ], [ 138.700000000000387, -22.395160441383666 ], [ 138.700000000000387, -22.605160441383667 ], [ 138.910000000000394, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21910" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -22.405160441383664 ], [ 138.910000000000394, -22.195160441383663 ], [ 138.700000000000387, -22.195160441383663 ], [ 138.700000000000387, -22.405160441383664 ], [ 138.910000000000394, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21911" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -22.205160441383661 ], [ 138.910000000000394, -21.995160441383661 ], [ 138.700000000000387, -21.995160441383661 ], [ 138.700000000000387, -22.205160441383661 ], [ 138.910000000000394, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21912" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -22.005160441383659 ], [ 138.910000000000394, -21.795160441383658 ], [ 138.700000000000387, -21.795160441383658 ], [ 138.700000000000387, -22.005160441383659 ], [ 138.910000000000394, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21913" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -21.805160441383656 ], [ 138.910000000000394, -21.595160441383655 ], [ 138.700000000000387, -21.595160441383655 ], [ 138.700000000000387, -21.805160441383656 ], [ 138.910000000000394, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21914" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -21.605160441383653 ], [ 138.910000000000394, -21.395160441383652 ], [ 138.700000000000387, -21.395160441383652 ], [ 138.700000000000387, -21.605160441383653 ], [ 138.910000000000394, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21915" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -21.40516044138365 ], [ 138.910000000000394, -21.195160441383649 ], [ 138.700000000000387, -21.195160441383649 ], [ 138.700000000000387, -21.40516044138365 ], [ 138.910000000000394, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21916" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -21.205160441383647 ], [ 138.910000000000394, -20.995160441383646 ], [ 138.700000000000387, -20.995160441383646 ], [ 138.700000000000387, -21.205160441383647 ], [ 138.910000000000394, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21916" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -21.205160441383647 ], [ 138.910000000000394, -20.995160441383646 ], [ 138.700000000000387, -20.995160441383646 ], [ 138.700000000000387, -21.205160441383647 ], [ 138.910000000000394, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID21917" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 138.910000000000394, -21.005160441383644 ], [ 138.910000000000394, -20.795160441383644 ], [ 138.700000000000387, -20.795160441383644 ], [ 138.700000000000387, -21.005160441383644 ], [ 138.910000000000394, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22073" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -23.605160441383681 ], [ 139.110000000000383, -23.39516044138368 ], [ 138.900000000000375, -23.39516044138368 ], [ 138.900000000000375, -23.605160441383681 ], [ 139.110000000000383, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22073" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -23.605160441383681 ], [ 139.110000000000383, -23.39516044138368 ], [ 138.900000000000375, -23.39516044138368 ], [ 138.900000000000375, -23.605160441383681 ], [ 139.110000000000383, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22074" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -23.405160441383678 ], [ 139.110000000000383, -23.195160441383678 ], [ 138.900000000000375, -23.195160441383678 ], [ 138.900000000000375, -23.405160441383678 ], [ 139.110000000000383, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22074" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -23.405160441383678 ], [ 139.110000000000383, -23.195160441383678 ], [ 138.900000000000375, -23.195160441383678 ], [ 138.900000000000375, -23.405160441383678 ], [ 139.110000000000383, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22075" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -23.205160441383676 ], [ 139.110000000000383, -22.995160441383675 ], [ 138.900000000000375, -22.995160441383675 ], [ 138.900000000000375, -23.205160441383676 ], [ 139.110000000000383, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22076" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -23.005160441383673 ], [ 139.110000000000383, -22.795160441383672 ], [ 138.900000000000375, -22.795160441383672 ], [ 138.900000000000375, -23.005160441383673 ], [ 139.110000000000383, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22077" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -22.80516044138367 ], [ 139.110000000000383, -22.595160441383669 ], [ 138.900000000000375, -22.595160441383669 ], [ 138.900000000000375, -22.80516044138367 ], [ 139.110000000000383, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22078" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -22.605160441383667 ], [ 139.110000000000383, -22.395160441383666 ], [ 138.900000000000375, -22.395160441383666 ], [ 138.900000000000375, -22.605160441383667 ], [ 139.110000000000383, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22079" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -22.405160441383664 ], [ 139.110000000000383, -22.195160441383663 ], [ 138.900000000000375, -22.195160441383663 ], [ 138.900000000000375, -22.405160441383664 ], [ 139.110000000000383, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22080" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -22.205160441383661 ], [ 139.110000000000383, -21.995160441383661 ], [ 138.900000000000375, -21.995160441383661 ], [ 138.900000000000375, -22.205160441383661 ], [ 139.110000000000383, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22081" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -22.005160441383659 ], [ 139.110000000000383, -21.795160441383658 ], [ 138.900000000000375, -21.795160441383658 ], [ 138.900000000000375, -22.005160441383659 ], [ 139.110000000000383, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22082" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -21.805160441383656 ], [ 139.110000000000383, -21.595160441383655 ], [ 138.900000000000375, -21.595160441383655 ], [ 138.900000000000375, -21.805160441383656 ], [ 139.110000000000383, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22083" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -21.605160441383653 ], [ 139.110000000000383, -21.395160441383652 ], [ 138.900000000000375, -21.395160441383652 ], [ 138.900000000000375, -21.605160441383653 ], [ 139.110000000000383, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22084" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -21.40516044138365 ], [ 139.110000000000383, -21.195160441383649 ], [ 138.900000000000375, -21.195160441383649 ], [ 138.900000000000375, -21.40516044138365 ], [ 139.110000000000383, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22085" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -21.205160441383647 ], [ 139.110000000000383, -20.995160441383646 ], [ 138.900000000000375, -20.995160441383646 ], [ 138.900000000000375, -21.205160441383647 ], [ 139.110000000000383, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22086" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -21.005160441383644 ], [ 139.110000000000383, -20.795160441383644 ], [ 138.900000000000375, -20.795160441383644 ], [ 138.900000000000375, -21.005160441383644 ], [ 139.110000000000383, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22086" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.110000000000383, -21.005160441383644 ], [ 139.110000000000383, -20.795160441383644 ], [ 138.900000000000375, -20.795160441383644 ], [ 138.900000000000375, -21.005160441383644 ], [ 139.110000000000383, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22242" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -23.605160441383681 ], [ 139.310000000000372, -23.39516044138368 ], [ 139.100000000000364, -23.39516044138368 ], [ 139.100000000000364, -23.605160441383681 ], [ 139.310000000000372, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22242" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -23.605160441383681 ], [ 139.310000000000372, -23.39516044138368 ], [ 139.100000000000364, -23.39516044138368 ], [ 139.100000000000364, -23.605160441383681 ], [ 139.310000000000372, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22243" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -23.405160441383678 ], [ 139.310000000000372, -23.195160441383678 ], [ 139.100000000000364, -23.195160441383678 ], [ 139.100000000000364, -23.405160441383678 ], [ 139.310000000000372, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22243" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -23.405160441383678 ], [ 139.310000000000372, -23.195160441383678 ], [ 139.100000000000364, -23.195160441383678 ], [ 139.100000000000364, -23.405160441383678 ], [ 139.310000000000372, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22244" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -23.205160441383676 ], [ 139.310000000000372, -22.995160441383675 ], [ 139.100000000000364, -22.995160441383675 ], [ 139.100000000000364, -23.205160441383676 ], [ 139.310000000000372, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22245" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -23.005160441383673 ], [ 139.310000000000372, -22.795160441383672 ], [ 139.100000000000364, -22.795160441383672 ], [ 139.100000000000364, -23.005160441383673 ], [ 139.310000000000372, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22246" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -22.80516044138367 ], [ 139.310000000000372, -22.595160441383669 ], [ 139.100000000000364, -22.595160441383669 ], [ 139.100000000000364, -22.80516044138367 ], [ 139.310000000000372, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22247" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -22.605160441383667 ], [ 139.310000000000372, -22.395160441383666 ], [ 139.100000000000364, -22.395160441383666 ], [ 139.100000000000364, -22.605160441383667 ], [ 139.310000000000372, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22248" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -22.405160441383664 ], [ 139.310000000000372, -22.195160441383663 ], [ 139.100000000000364, -22.195160441383663 ], [ 139.100000000000364, -22.405160441383664 ], [ 139.310000000000372, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22249" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -22.205160441383661 ], [ 139.310000000000372, -21.995160441383661 ], [ 139.100000000000364, -21.995160441383661 ], [ 139.100000000000364, -22.205160441383661 ], [ 139.310000000000372, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22250" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -22.005160441383659 ], [ 139.310000000000372, -21.795160441383658 ], [ 139.100000000000364, -21.795160441383658 ], [ 139.100000000000364, -22.005160441383659 ], [ 139.310000000000372, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22250" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -22.005160441383659 ], [ 139.310000000000372, -21.795160441383658 ], [ 139.100000000000364, -21.795160441383658 ], [ 139.100000000000364, -22.005160441383659 ], [ 139.310000000000372, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22251" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -21.805160441383656 ], [ 139.310000000000372, -21.595160441383655 ], [ 139.100000000000364, -21.595160441383655 ], [ 139.100000000000364, -21.805160441383656 ], [ 139.310000000000372, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22251" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -21.805160441383656 ], [ 139.310000000000372, -21.595160441383655 ], [ 139.100000000000364, -21.595160441383655 ], [ 139.100000000000364, -21.805160441383656 ], [ 139.310000000000372, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22252" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -21.605160441383653 ], [ 139.310000000000372, -21.395160441383652 ], [ 139.100000000000364, -21.395160441383652 ], [ 139.100000000000364, -21.605160441383653 ], [ 139.310000000000372, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22252" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -21.605160441383653 ], [ 139.310000000000372, -21.395160441383652 ], [ 139.100000000000364, -21.395160441383652 ], [ 139.100000000000364, -21.605160441383653 ], [ 139.310000000000372, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22253" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -21.40516044138365 ], [ 139.310000000000372, -21.195160441383649 ], [ 139.100000000000364, -21.195160441383649 ], [ 139.100000000000364, -21.40516044138365 ], [ 139.310000000000372, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22254" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -21.205160441383647 ], [ 139.310000000000372, -20.995160441383646 ], [ 139.100000000000364, -20.995160441383646 ], [ 139.100000000000364, -21.205160441383647 ], [ 139.310000000000372, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22255" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -21.005160441383644 ], [ 139.310000000000372, -20.795160441383644 ], [ 139.100000000000364, -20.795160441383644 ], [ 139.100000000000364, -21.005160441383644 ], [ 139.310000000000372, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22255" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.310000000000372, -21.005160441383644 ], [ 139.310000000000372, -20.795160441383644 ], [ 139.100000000000364, -20.795160441383644 ], [ 139.100000000000364, -21.005160441383644 ], [ 139.310000000000372, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22410" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -23.805160441383684 ], [ 139.510000000000389, -23.595160441383683 ], [ 139.300000000000381, -23.595160441383683 ], [ 139.300000000000381, -23.805160441383684 ], [ 139.510000000000389, -23.805160441383684 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22410" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -23.805160441383684 ], [ 139.510000000000389, -23.595160441383683 ], [ 139.300000000000381, -23.595160441383683 ], [ 139.300000000000381, -23.805160441383684 ], [ 139.510000000000389, -23.805160441383684 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22411" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -23.605160441383681 ], [ 139.510000000000389, -23.39516044138368 ], [ 139.300000000000381, -23.39516044138368 ], [ 139.300000000000381, -23.605160441383681 ], [ 139.510000000000389, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22411" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -23.605160441383681 ], [ 139.510000000000389, -23.39516044138368 ], [ 139.300000000000381, -23.39516044138368 ], [ 139.300000000000381, -23.605160441383681 ], [ 139.510000000000389, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22412" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -23.405160441383678 ], [ 139.510000000000389, -23.195160441383678 ], [ 139.300000000000381, -23.195160441383678 ], [ 139.300000000000381, -23.405160441383678 ], [ 139.510000000000389, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22413" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -23.205160441383676 ], [ 139.510000000000389, -22.995160441383675 ], [ 139.300000000000381, -22.995160441383675 ], [ 139.300000000000381, -23.205160441383676 ], [ 139.510000000000389, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22414" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -23.005160441383673 ], [ 139.510000000000389, -22.795160441383672 ], [ 139.300000000000381, -22.795160441383672 ], [ 139.300000000000381, -23.005160441383673 ], [ 139.510000000000389, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22415" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -22.80516044138367 ], [ 139.510000000000389, -22.595160441383669 ], [ 139.300000000000381, -22.595160441383669 ], [ 139.300000000000381, -22.80516044138367 ], [ 139.510000000000389, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22416" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -22.605160441383667 ], [ 139.510000000000389, -22.395160441383666 ], [ 139.300000000000381, -22.395160441383666 ], [ 139.300000000000381, -22.605160441383667 ], [ 139.510000000000389, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22417" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -22.405160441383664 ], [ 139.510000000000389, -22.195160441383663 ], [ 139.300000000000381, -22.195160441383663 ], [ 139.300000000000381, -22.405160441383664 ], [ 139.510000000000389, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22417" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -22.405160441383664 ], [ 139.510000000000389, -22.195160441383663 ], [ 139.300000000000381, -22.195160441383663 ], [ 139.300000000000381, -22.405160441383664 ], [ 139.510000000000389, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22418" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -22.205160441383661 ], [ 139.510000000000389, -21.995160441383661 ], [ 139.300000000000381, -21.995160441383661 ], [ 139.300000000000381, -22.205160441383661 ], [ 139.510000000000389, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22418" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -22.205160441383661 ], [ 139.510000000000389, -21.995160441383661 ], [ 139.300000000000381, -21.995160441383661 ], [ 139.300000000000381, -22.205160441383661 ], [ 139.510000000000389, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22419" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -22.005160441383659 ], [ 139.510000000000389, -21.795160441383658 ], [ 139.300000000000381, -21.795160441383658 ], [ 139.300000000000381, -22.005160441383659 ], [ 139.510000000000389, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22419" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -22.005160441383659 ], [ 139.510000000000389, -21.795160441383658 ], [ 139.300000000000381, -21.795160441383658 ], [ 139.300000000000381, -22.005160441383659 ], [ 139.510000000000389, -22.005160441383659 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22420" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -21.805160441383656 ], [ 139.510000000000389, -21.595160441383655 ], [ 139.300000000000381, -21.595160441383655 ], [ 139.300000000000381, -21.805160441383656 ], [ 139.510000000000389, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22420" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -21.805160441383656 ], [ 139.510000000000389, -21.595160441383655 ], [ 139.300000000000381, -21.595160441383655 ], [ 139.300000000000381, -21.805160441383656 ], [ 139.510000000000389, -21.805160441383656 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22421" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -21.605160441383653 ], [ 139.510000000000389, -21.395160441383652 ], [ 139.300000000000381, -21.395160441383652 ], [ 139.300000000000381, -21.605160441383653 ], [ 139.510000000000389, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22421" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -21.605160441383653 ], [ 139.510000000000389, -21.395160441383652 ], [ 139.300000000000381, -21.395160441383652 ], [ 139.300000000000381, -21.605160441383653 ], [ 139.510000000000389, -21.605160441383653 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22422" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -21.40516044138365 ], [ 139.510000000000389, -21.195160441383649 ], [ 139.300000000000381, -21.195160441383649 ], [ 139.300000000000381, -21.40516044138365 ], [ 139.510000000000389, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22422" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -21.40516044138365 ], [ 139.510000000000389, -21.195160441383649 ], [ 139.300000000000381, -21.195160441383649 ], [ 139.300000000000381, -21.40516044138365 ], [ 139.510000000000389, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22423" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -21.205160441383647 ], [ 139.510000000000389, -20.995160441383646 ], [ 139.300000000000381, -20.995160441383646 ], [ 139.300000000000381, -21.205160441383647 ], [ 139.510000000000389, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22424" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -21.005160441383644 ], [ 139.510000000000389, -20.795160441383644 ], [ 139.300000000000381, -20.795160441383644 ], [ 139.300000000000381, -21.005160441383644 ], [ 139.510000000000389, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22424" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.510000000000389, -21.005160441383644 ], [ 139.510000000000389, -20.795160441383644 ], [ 139.300000000000381, -20.795160441383644 ], [ 139.300000000000381, -21.005160441383644 ], [ 139.510000000000389, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22579" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -23.805160441383684 ], [ 139.710000000000406, -23.595160441383683 ], [ 139.500000000000398, -23.595160441383683 ], [ 139.500000000000398, -23.805160441383684 ], [ 139.710000000000406, -23.805160441383684 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22579" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -23.805160441383684 ], [ 139.710000000000406, -23.595160441383683 ], [ 139.500000000000398, -23.595160441383683 ], [ 139.500000000000398, -23.805160441383684 ], [ 139.710000000000406, -23.805160441383684 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22580" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -23.605160441383681 ], [ 139.710000000000406, -23.39516044138368 ], [ 139.500000000000398, -23.39516044138368 ], [ 139.500000000000398, -23.605160441383681 ], [ 139.710000000000406, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22581" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -23.405160441383678 ], [ 139.710000000000406, -23.195160441383678 ], [ 139.500000000000398, -23.195160441383678 ], [ 139.500000000000398, -23.405160441383678 ], [ 139.710000000000406, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22582" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -23.205160441383676 ], [ 139.710000000000406, -22.995160441383675 ], [ 139.500000000000398, -22.995160441383675 ], [ 139.500000000000398, -23.205160441383676 ], [ 139.710000000000406, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22583" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -23.005160441383673 ], [ 139.710000000000406, -22.795160441383672 ], [ 139.500000000000398, -22.795160441383672 ], [ 139.500000000000398, -23.005160441383673 ], [ 139.710000000000406, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22584" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -22.80516044138367 ], [ 139.710000000000406, -22.595160441383669 ], [ 139.500000000000398, -22.595160441383669 ], [ 139.500000000000398, -22.80516044138367 ], [ 139.710000000000406, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22585" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -22.605160441383667 ], [ 139.710000000000406, -22.395160441383666 ], [ 139.500000000000398, -22.395160441383666 ], [ 139.500000000000398, -22.605160441383667 ], [ 139.710000000000406, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22586" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -22.405160441383664 ], [ 139.710000000000406, -22.195160441383663 ], [ 139.500000000000398, -22.195160441383663 ], [ 139.500000000000398, -22.405160441383664 ], [ 139.710000000000406, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22586" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -22.405160441383664 ], [ 139.710000000000406, -22.195160441383663 ], [ 139.500000000000398, -22.195160441383663 ], [ 139.500000000000398, -22.405160441383664 ], [ 139.710000000000406, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22591" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -21.40516044138365 ], [ 139.710000000000406, -21.195160441383649 ], [ 139.500000000000398, -21.195160441383649 ], [ 139.500000000000398, -21.40516044138365 ], [ 139.710000000000406, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22591" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -21.40516044138365 ], [ 139.710000000000406, -21.195160441383649 ], [ 139.500000000000398, -21.195160441383649 ], [ 139.500000000000398, -21.40516044138365 ], [ 139.710000000000406, -21.40516044138365 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22592" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -21.205160441383647 ], [ 139.710000000000406, -20.995160441383646 ], [ 139.500000000000398, -20.995160441383646 ], [ 139.500000000000398, -21.205160441383647 ], [ 139.710000000000406, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22592" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -21.205160441383647 ], [ 139.710000000000406, -20.995160441383646 ], [ 139.500000000000398, -20.995160441383646 ], [ 139.500000000000398, -21.205160441383647 ], [ 139.710000000000406, -21.205160441383647 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22593" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -21.005160441383644 ], [ 139.710000000000406, -20.795160441383644 ], [ 139.500000000000398, -20.795160441383644 ], [ 139.500000000000398, -21.005160441383644 ], [ 139.710000000000406, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22593" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -21.005160441383644 ], [ 139.710000000000406, -20.795160441383644 ], [ 139.500000000000398, -20.795160441383644 ], [ 139.500000000000398, -21.005160441383644 ], [ 139.710000000000406, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22593" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.710000000000406, -21.005160441383644 ], [ 139.710000000000406, -20.795160441383644 ], [ 139.500000000000398, -20.795160441383644 ], [ 139.500000000000398, -21.005160441383644 ], [ 139.710000000000406, -21.005160441383644 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22748" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -23.805160441383684 ], [ 139.910000000000394, -23.595160441383683 ], [ 139.700000000000387, -23.595160441383683 ], [ 139.700000000000387, -23.805160441383684 ], [ 139.910000000000394, -23.805160441383684 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22748" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -23.805160441383684 ], [ 139.910000000000394, -23.595160441383683 ], [ 139.700000000000387, -23.595160441383683 ], [ 139.700000000000387, -23.805160441383684 ], [ 139.910000000000394, -23.805160441383684 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22749" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -23.605160441383681 ], [ 139.910000000000394, -23.39516044138368 ], [ 139.700000000000387, -23.39516044138368 ], [ 139.700000000000387, -23.605160441383681 ], [ 139.910000000000394, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22750" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -23.405160441383678 ], [ 139.910000000000394, -23.195160441383678 ], [ 139.700000000000387, -23.195160441383678 ], [ 139.700000000000387, -23.405160441383678 ], [ 139.910000000000394, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22751" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -23.205160441383676 ], [ 139.910000000000394, -22.995160441383675 ], [ 139.700000000000387, -22.995160441383675 ], [ 139.700000000000387, -23.205160441383676 ], [ 139.910000000000394, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22752" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -23.005160441383673 ], [ 139.910000000000394, -22.795160441383672 ], [ 139.700000000000387, -22.795160441383672 ], [ 139.700000000000387, -23.005160441383673 ], [ 139.910000000000394, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22753" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -22.80516044138367 ], [ 139.910000000000394, -22.595160441383669 ], [ 139.700000000000387, -22.595160441383669 ], [ 139.700000000000387, -22.80516044138367 ], [ 139.910000000000394, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22754" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -22.605160441383667 ], [ 139.910000000000394, -22.395160441383666 ], [ 139.700000000000387, -22.395160441383666 ], [ 139.700000000000387, -22.605160441383667 ], [ 139.910000000000394, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22755" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -22.405160441383664 ], [ 139.910000000000394, -22.195160441383663 ], [ 139.700000000000387, -22.195160441383663 ], [ 139.700000000000387, -22.405160441383664 ], [ 139.910000000000394, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22755" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -22.405160441383664 ], [ 139.910000000000394, -22.195160441383663 ], [ 139.700000000000387, -22.195160441383663 ], [ 139.700000000000387, -22.405160441383664 ], [ 139.910000000000394, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22756" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -22.205160441383661 ], [ 139.910000000000394, -21.995160441383661 ], [ 139.700000000000387, -21.995160441383661 ], [ 139.700000000000387, -22.205160441383661 ], [ 139.910000000000394, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22756" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.910000000000394, -22.205160441383661 ], [ 139.910000000000394, -21.995160441383661 ], [ 139.700000000000387, -21.995160441383661 ], [ 139.700000000000387, -22.205160441383661 ], [ 139.910000000000394, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22917" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.110000000000383, -23.805160441383684 ], [ 140.110000000000383, -23.595160441383683 ], [ 139.900000000000375, -23.595160441383683 ], [ 139.900000000000375, -23.805160441383684 ], [ 140.110000000000383, -23.805160441383684 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22918" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.110000000000383, -23.605160441383681 ], [ 140.110000000000383, -23.39516044138368 ], [ 139.900000000000375, -23.39516044138368 ], [ 139.900000000000375, -23.605160441383681 ], [ 140.110000000000383, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22918" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.110000000000383, -23.605160441383681 ], [ 140.110000000000383, -23.39516044138368 ], [ 139.900000000000375, -23.39516044138368 ], [ 139.900000000000375, -23.605160441383681 ], [ 140.110000000000383, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22919" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.110000000000383, -23.405160441383678 ], [ 140.110000000000383, -23.195160441383678 ], [ 139.900000000000375, -23.195160441383678 ], [ 139.900000000000375, -23.405160441383678 ], [ 140.110000000000383, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22920" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.110000000000383, -23.205160441383676 ], [ 140.110000000000383, -22.995160441383675 ], [ 139.900000000000375, -22.995160441383675 ], [ 139.900000000000375, -23.205160441383676 ], [ 140.110000000000383, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22921" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.110000000000383, -23.005160441383673 ], [ 140.110000000000383, -22.795160441383672 ], [ 139.900000000000375, -22.795160441383672 ], [ 139.900000000000375, -23.005160441383673 ], [ 140.110000000000383, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22922" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.110000000000383, -22.80516044138367 ], [ 140.110000000000383, -22.595160441383669 ], [ 139.900000000000375, -22.595160441383669 ], [ 139.900000000000375, -22.80516044138367 ], [ 140.110000000000383, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22923" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.110000000000383, -22.605160441383667 ], [ 140.110000000000383, -22.395160441383666 ], [ 139.900000000000375, -22.395160441383666 ], [ 139.900000000000375, -22.605160441383667 ], [ 140.110000000000383, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22924" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.110000000000383, -22.405160441383664 ], [ 140.110000000000383, -22.195160441383663 ], [ 139.900000000000375, -22.195160441383663 ], [ 139.900000000000375, -22.405160441383664 ], [ 140.110000000000383, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID22924" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.110000000000383, -22.405160441383664 ], [ 140.110000000000383, -22.195160441383663 ], [ 139.900000000000375, -22.195160441383663 ], [ 139.900000000000375, -22.405160441383664 ], [ 140.110000000000383, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23087" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.3100000000004, -23.605160441383681 ], [ 140.3100000000004, -23.39516044138368 ], [ 140.100000000000392, -23.39516044138368 ], [ 140.100000000000392, -23.605160441383681 ], [ 140.3100000000004, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23087" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.3100000000004, -23.605160441383681 ], [ 140.3100000000004, -23.39516044138368 ], [ 140.100000000000392, -23.39516044138368 ], [ 140.100000000000392, -23.605160441383681 ], [ 140.3100000000004, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23088" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.3100000000004, -23.405160441383678 ], [ 140.3100000000004, -23.195160441383678 ], [ 140.100000000000392, -23.195160441383678 ], [ 140.100000000000392, -23.405160441383678 ], [ 140.3100000000004, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23089" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.3100000000004, -23.205160441383676 ], [ 140.3100000000004, -22.995160441383675 ], [ 140.100000000000392, -22.995160441383675 ], [ 140.100000000000392, -23.205160441383676 ], [ 140.3100000000004, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23090" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.3100000000004, -23.005160441383673 ], [ 140.3100000000004, -22.795160441383672 ], [ 140.100000000000392, -22.795160441383672 ], [ 140.100000000000392, -23.005160441383673 ], [ 140.3100000000004, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23091" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.3100000000004, -22.80516044138367 ], [ 140.3100000000004, -22.595160441383669 ], [ 140.100000000000392, -22.595160441383669 ], [ 140.100000000000392, -22.80516044138367 ], [ 140.3100000000004, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23092" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.3100000000004, -22.605160441383667 ], [ 140.3100000000004, -22.395160441383666 ], [ 140.100000000000392, -22.395160441383666 ], [ 140.100000000000392, -22.605160441383667 ], [ 140.3100000000004, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23093" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.3100000000004, -22.405160441383664 ], [ 140.3100000000004, -22.195160441383663 ], [ 140.100000000000392, -22.195160441383663 ], [ 140.100000000000392, -22.405160441383664 ], [ 140.3100000000004, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23093" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.3100000000004, -22.405160441383664 ], [ 140.3100000000004, -22.195160441383663 ], [ 140.100000000000392, -22.195160441383663 ], [ 140.100000000000392, -22.405160441383664 ], [ 140.3100000000004, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23256" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -23.605160441383681 ], [ 140.510000000000417, -23.39516044138368 ], [ 140.300000000000409, -23.39516044138368 ], [ 140.300000000000409, -23.605160441383681 ], [ 140.510000000000417, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23256" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -23.605160441383681 ], [ 140.510000000000417, -23.39516044138368 ], [ 140.300000000000409, -23.39516044138368 ], [ 140.300000000000409, -23.605160441383681 ], [ 140.510000000000417, -23.605160441383681 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23257" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -23.405160441383678 ], [ 140.510000000000417, -23.195160441383678 ], [ 140.300000000000409, -23.195160441383678 ], [ 140.300000000000409, -23.405160441383678 ], [ 140.510000000000417, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23257" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -23.405160441383678 ], [ 140.510000000000417, -23.195160441383678 ], [ 140.300000000000409, -23.195160441383678 ], [ 140.300000000000409, -23.405160441383678 ], [ 140.510000000000417, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23258" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -23.205160441383676 ], [ 140.510000000000417, -22.995160441383675 ], [ 140.300000000000409, -22.995160441383675 ], [ 140.300000000000409, -23.205160441383676 ], [ 140.510000000000417, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23259" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -23.005160441383673 ], [ 140.510000000000417, -22.795160441383672 ], [ 140.300000000000409, -22.795160441383672 ], [ 140.300000000000409, -23.005160441383673 ], [ 140.510000000000417, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23260" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -22.80516044138367 ], [ 140.510000000000417, -22.595160441383669 ], [ 140.300000000000409, -22.595160441383669 ], [ 140.300000000000409, -22.80516044138367 ], [ 140.510000000000417, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23261" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -22.605160441383667 ], [ 140.510000000000417, -22.395160441383666 ], [ 140.300000000000409, -22.395160441383666 ], [ 140.300000000000409, -22.605160441383667 ], [ 140.510000000000417, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23262" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -22.405160441383664 ], [ 140.510000000000417, -22.195160441383663 ], [ 140.300000000000409, -22.195160441383663 ], [ 140.300000000000409, -22.405160441383664 ], [ 140.510000000000417, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23262" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -22.405160441383664 ], [ 140.510000000000417, -22.195160441383663 ], [ 140.300000000000409, -22.195160441383663 ], [ 140.300000000000409, -22.405160441383664 ], [ 140.510000000000417, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23263" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -22.205160441383661 ], [ 140.510000000000417, -21.995160441383661 ], [ 140.300000000000409, -21.995160441383661 ], [ 140.300000000000409, -22.205160441383661 ], [ 140.510000000000417, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23263" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.510000000000417, -22.205160441383661 ], [ 140.510000000000417, -21.995160441383661 ], [ 140.300000000000409, -21.995160441383661 ], [ 140.300000000000409, -22.205160441383661 ], [ 140.510000000000417, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23426" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -23.405160441383678 ], [ 140.710000000000406, -23.195160441383678 ], [ 140.500000000000398, -23.195160441383678 ], [ 140.500000000000398, -23.405160441383678 ], [ 140.710000000000406, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23426" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -23.405160441383678 ], [ 140.710000000000406, -23.195160441383678 ], [ 140.500000000000398, -23.195160441383678 ], [ 140.500000000000398, -23.405160441383678 ], [ 140.710000000000406, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23427" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -23.205160441383676 ], [ 140.710000000000406, -22.995160441383675 ], [ 140.500000000000398, -22.995160441383675 ], [ 140.500000000000398, -23.205160441383676 ], [ 140.710000000000406, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23427" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -23.205160441383676 ], [ 140.710000000000406, -22.995160441383675 ], [ 140.500000000000398, -22.995160441383675 ], [ 140.500000000000398, -23.205160441383676 ], [ 140.710000000000406, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23428" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -23.005160441383673 ], [ 140.710000000000406, -22.795160441383672 ], [ 140.500000000000398, -22.795160441383672 ], [ 140.500000000000398, -23.005160441383673 ], [ 140.710000000000406, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23429" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -22.80516044138367 ], [ 140.710000000000406, -22.595160441383669 ], [ 140.500000000000398, -22.595160441383669 ], [ 140.500000000000398, -22.80516044138367 ], [ 140.710000000000406, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23430" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -22.605160441383667 ], [ 140.710000000000406, -22.395160441383666 ], [ 140.500000000000398, -22.395160441383666 ], [ 140.500000000000398, -22.605160441383667 ], [ 140.710000000000406, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23431" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -22.405160441383664 ], [ 140.710000000000406, -22.195160441383663 ], [ 140.500000000000398, -22.195160441383663 ], [ 140.500000000000398, -22.405160441383664 ], [ 140.710000000000406, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23431" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -22.405160441383664 ], [ 140.710000000000406, -22.195160441383663 ], [ 140.500000000000398, -22.195160441383663 ], [ 140.500000000000398, -22.405160441383664 ], [ 140.710000000000406, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23432" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -22.205160441383661 ], [ 140.710000000000406, -21.995160441383661 ], [ 140.500000000000398, -21.995160441383661 ], [ 140.500000000000398, -22.205160441383661 ], [ 140.710000000000406, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23432" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.710000000000406, -22.205160441383661 ], [ 140.710000000000406, -21.995160441383661 ], [ 140.500000000000398, -21.995160441383661 ], [ 140.500000000000398, -22.205160441383661 ], [ 140.710000000000406, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23595" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -23.405160441383678 ], [ 140.910000000000394, -23.195160441383678 ], [ 140.700000000000387, -23.195160441383678 ], [ 140.700000000000387, -23.405160441383678 ], [ 140.910000000000394, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23595" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -23.405160441383678 ], [ 140.910000000000394, -23.195160441383678 ], [ 140.700000000000387, -23.195160441383678 ], [ 140.700000000000387, -23.405160441383678 ], [ 140.910000000000394, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23595" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -23.405160441383678 ], [ 140.910000000000394, -23.195160441383678 ], [ 140.700000000000387, -23.195160441383678 ], [ 140.700000000000387, -23.405160441383678 ], [ 140.910000000000394, -23.405160441383678 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23596" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -23.205160441383676 ], [ 140.910000000000394, -22.995160441383675 ], [ 140.700000000000387, -22.995160441383675 ], [ 140.700000000000387, -23.205160441383676 ], [ 140.910000000000394, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23596" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -23.205160441383676 ], [ 140.910000000000394, -22.995160441383675 ], [ 140.700000000000387, -22.995160441383675 ], [ 140.700000000000387, -23.205160441383676 ], [ 140.910000000000394, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23596" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -23.205160441383676 ], [ 140.910000000000394, -22.995160441383675 ], [ 140.700000000000387, -22.995160441383675 ], [ 140.700000000000387, -23.205160441383676 ], [ 140.910000000000394, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23597" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -23.005160441383673 ], [ 140.910000000000394, -22.795160441383672 ], [ 140.700000000000387, -22.795160441383672 ], [ 140.700000000000387, -23.005160441383673 ], [ 140.910000000000394, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23598" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -22.80516044138367 ], [ 140.910000000000394, -22.595160441383669 ], [ 140.700000000000387, -22.595160441383669 ], [ 140.700000000000387, -22.80516044138367 ], [ 140.910000000000394, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23599" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -22.605160441383667 ], [ 140.910000000000394, -22.395160441383666 ], [ 140.700000000000387, -22.395160441383666 ], [ 140.700000000000387, -22.605160441383667 ], [ 140.910000000000394, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23600" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -22.405160441383664 ], [ 140.910000000000394, -22.195160441383663 ], [ 140.700000000000387, -22.195160441383663 ], [ 140.700000000000387, -22.405160441383664 ], [ 140.910000000000394, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23600" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -22.405160441383664 ], [ 140.910000000000394, -22.195160441383663 ], [ 140.700000000000387, -22.195160441383663 ], [ 140.700000000000387, -22.405160441383664 ], [ 140.910000000000394, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23601" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -22.205160441383661 ], [ 140.910000000000394, -21.995160441383661 ], [ 140.700000000000387, -21.995160441383661 ], [ 140.700000000000387, -22.205160441383661 ], [ 140.910000000000394, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23601" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -22.205160441383661 ], [ 140.910000000000394, -21.995160441383661 ], [ 140.700000000000387, -21.995160441383661 ], [ 140.700000000000387, -22.205160441383661 ], [ 140.910000000000394, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23601" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 140.910000000000394, -22.205160441383661 ], [ 140.910000000000394, -21.995160441383661 ], [ 140.700000000000387, -21.995160441383661 ], [ 140.700000000000387, -22.205160441383661 ], [ 140.910000000000394, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23765" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -23.205160441383676 ], [ 141.110000000000412, -22.995160441383675 ], [ 140.900000000000404, -22.995160441383675 ], [ 140.900000000000404, -23.205160441383676 ], [ 141.110000000000412, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23765" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -23.205160441383676 ], [ 141.110000000000412, -22.995160441383675 ], [ 140.900000000000404, -22.995160441383675 ], [ 140.900000000000404, -23.205160441383676 ], [ 141.110000000000412, -23.205160441383676 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23766" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -23.005160441383673 ], [ 141.110000000000412, -22.795160441383672 ], [ 140.900000000000404, -22.795160441383672 ], [ 140.900000000000404, -23.005160441383673 ], [ 141.110000000000412, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23766" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -23.005160441383673 ], [ 141.110000000000412, -22.795160441383672 ], [ 140.900000000000404, -22.795160441383672 ], [ 140.900000000000404, -23.005160441383673 ], [ 141.110000000000412, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23767" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -22.80516044138367 ], [ 141.110000000000412, -22.595160441383669 ], [ 140.900000000000404, -22.595160441383669 ], [ 140.900000000000404, -22.80516044138367 ], [ 141.110000000000412, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23767" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -22.80516044138367 ], [ 141.110000000000412, -22.595160441383669 ], [ 140.900000000000404, -22.595160441383669 ], [ 140.900000000000404, -22.80516044138367 ], [ 141.110000000000412, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23768" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -22.605160441383667 ], [ 141.110000000000412, -22.395160441383666 ], [ 140.900000000000404, -22.395160441383666 ], [ 140.900000000000404, -22.605160441383667 ], [ 141.110000000000412, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23768" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -22.605160441383667 ], [ 141.110000000000412, -22.395160441383666 ], [ 140.900000000000404, -22.395160441383666 ], [ 140.900000000000404, -22.605160441383667 ], [ 141.110000000000412, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23769" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -22.405160441383664 ], [ 141.110000000000412, -22.195160441383663 ], [ 140.900000000000404, -22.195160441383663 ], [ 140.900000000000404, -22.405160441383664 ], [ 141.110000000000412, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23769" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -22.405160441383664 ], [ 141.110000000000412, -22.195160441383663 ], [ 140.900000000000404, -22.195160441383663 ], [ 140.900000000000404, -22.405160441383664 ], [ 141.110000000000412, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23770" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -22.205160441383661 ], [ 141.110000000000412, -21.995160441383661 ], [ 140.900000000000404, -21.995160441383661 ], [ 140.900000000000404, -22.205160441383661 ], [ 141.110000000000412, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23770" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -22.205160441383661 ], [ 141.110000000000412, -21.995160441383661 ], [ 140.900000000000404, -21.995160441383661 ], [ 140.900000000000404, -22.205160441383661 ], [ 141.110000000000412, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23770" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.110000000000412, -22.205160441383661 ], [ 141.110000000000412, -21.995160441383661 ], [ 140.900000000000404, -21.995160441383661 ], [ 140.900000000000404, -22.205160441383661 ], [ 141.110000000000412, -22.205160441383661 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23935" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.310000000000429, -23.005160441383673 ], [ 141.310000000000429, -22.795160441383672 ], [ 141.100000000000421, -22.795160441383672 ], [ 141.100000000000421, -23.005160441383673 ], [ 141.310000000000429, -23.005160441383673 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23936" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.310000000000429, -22.80516044138367 ], [ 141.310000000000429, -22.595160441383669 ], [ 141.100000000000421, -22.595160441383669 ], [ 141.100000000000421, -22.80516044138367 ], [ 141.310000000000429, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23936" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.310000000000429, -22.80516044138367 ], [ 141.310000000000429, -22.595160441383669 ], [ 141.100000000000421, -22.595160441383669 ], [ 141.100000000000421, -22.80516044138367 ], [ 141.310000000000429, -22.80516044138367 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23937" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.310000000000429, -22.605160441383667 ], [ 141.310000000000429, -22.395160441383666 ], [ 141.100000000000421, -22.395160441383666 ], [ 141.100000000000421, -22.605160441383667 ], [ 141.310000000000429, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23937" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.310000000000429, -22.605160441383667 ], [ 141.310000000000429, -22.395160441383666 ], [ 141.100000000000421, -22.395160441383666 ], [ 141.100000000000421, -22.605160441383667 ], [ 141.310000000000429, -22.605160441383667 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23938" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.310000000000429, -22.405160441383664 ], [ 141.310000000000429, -22.195160441383663 ], [ 141.100000000000421, -22.195160441383663 ], [ 141.100000000000421, -22.405160441383664 ], [ 141.310000000000429, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23938" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.310000000000429, -22.405160441383664 ], [ 141.310000000000429, -22.195160441383663 ], [ 141.100000000000421, -22.195160441383663 ], [ 141.100000000000421, -22.405160441383664 ], [ 141.310000000000429, -22.405160441383664 ] ] ] } },
+{ "type": "Feature", "properties": { "patch_name": "GRID23938" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 141.310000000000429, -22.405160441383664 ], [ 141.310000000000429, -22.195160441383663 ], [ 141.100000000000421, -22.195160441383663 ], [ 141.100000000000421, -22.405160441383664 ], [ 141.310000000000429, -22.405160441383664 ] ] ] } }
+]
+}
diff --git a/tutorial/05_Monitor_Downloads.ipynb b/tutorial/05_Monitor_Downloads.ipynb
index d8e51c5..1125d7f 100644
--- a/tutorial/05_Monitor_Downloads.ipynb
+++ b/tutorial/05_Monitor_Downloads.ipynb
@@ -25,6 +25,8 @@
"import folium\n",
"import geemap.foliumap as geemap\n",
"import branca.colormap\n",
+ "from tqdm.notebook import tqdm\n",
+ "from datetime import datetime\n",
"\n",
"from db_utils import DB\n",
"from dotenv import load_dotenv"
@@ -71,7 +73,7 @@
"source": [
"## Query the download state from the database\n",
"\n",
- "Set the name of the session here and run all remaining cells in order."
+ "**Set the name of the session here and run all remaining cells in order.**"
]
},
{
@@ -81,7 +83,7 @@
"metadata": {},
"outputs": [],
"source": [
- "# All work is conducted under a unique session name\n",
+ "# EDIT THE NAME OF THE SESSION\n",
"session_name = \"EMSR586\""
]
},
@@ -285,53 +287,82 @@
},
{
"cell_type": "markdown",
- "id": "8e004463",
+ "id": "aedaab3f",
"metadata": {},
"source": [
- "## Display task count\n",
+ "## Monitor the task count and progress\n",
"\n",
- "The cell below can be run to check the number of tasks being tracked by the database. Note that the ```01_download_images.py``` script must remain running for this notebook to work correctly. "
+ "The cell below can be run to check the number of tasks being tracked by the database. Note that the ```01_download_images.py``` script must remain running for this notebook to work correctly.\n",
+ "\n",
+ "Individual tasks can also be viewed on this GEE [task tracking page](https://code.earthengine.google.com/tasks), provided you are logged Google Earth Engine via your web browser. "
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "7e69bd7f",
+ "id": "944750ad-bab7-422e-9714-e49522d2e029",
"metadata": {},
"outputs": [],
"source": [
- "# Query the DB for the task status for this session\n",
- "query = (f\"SELECT description, state_code \"\n",
- " f\"FROM gee_task_tracker \"\n",
- " f\"WHERE session = %s;\")\n",
- "data = (session_name,)\n",
- "tasks_df = db_conn.run_query(query, data, fetch=True)\n",
- "tasks_grp = tasks_df.groupby(\"state_code\")\n",
- "\n",
- "# Get the total number of tasks\n",
- "num_tasks = len(tasks_df)\n",
- "if num_tasks == 0:\n",
- " print(f\"[INFO] No tasks remaining for this session!\\n\"\n",
- " f\" This likely means all tasks have completed.\")\n",
- "else:\n",
+ "# Function to query the task status in the database\n",
+ "def query_tasks():\n",
+ " query = (f\"SELECT description, state_code \"\n",
+ " f\"FROM gee_task_tracker \"\n",
+ " f\"WHERE session = %s;\")\n",
+ " data = (session_name,)\n",
+ " tasks_df = db_conn.run_query(query, data, fetch=True)\n",
+ " tasks_grp = tasks_df.groupby(\"state_code\")\n",
+ " \n",
+ " # Get the total number of tasks\n",
+ " num_tasks = len(tasks_df)\n",
+ " \n",
+ " # Get the number completed\n",
" num_completed = 0\n",
" if \"COMPLETED\" in tasks_grp.groups.keys():\n",
" num_completed = tasks_grp.count().loc[\"COMPLETED\"][0]\n",
- " print(f\"[INFO] Completed {num_completed}/{num_tasks} tasks.\")"
+ "\n",
+ " return num_tasks, num_completed\n",
+ "\n",
+ "# Query the total number of tasks being tracked\n",
+ "num_tasks_old, _ = query_tasks()\n",
+ "print(f\"[INFO] There are currently {num_tasks_old} tasks being tracked.\")\n",
+ "\n",
+ "# Initialise a progress bar\n",
+ "pbar = tqdm(total=num_tasks_old,\n",
+ " dynamic_ncols=True,\n",
+ " leave=False,\n",
+ " position=0,\n",
+ " desc=\"Task Progress\")\n",
+ "\n",
+ "# Query the status every and update bar\n",
+ "interval_s = 1\n",
+ "num_completed_old = 0\n",
+ "while True:\n",
+ " num_tasks, num_completed = query_tasks()\n",
+ " if num_tasks > num_tasks_old:\n",
+ " print(f\"[WARN] Total number of tasks has changed!\\n\"\n",
+ " f\" Restart cell after all tasks have been submitted.\")\n",
+ " break\n",
+ " num_increment = num_completed - num_completed_old\n",
+ " num_completed_old = num_completed\n",
+ " pbar.update(num_increment)\n",
+ " now = datetime.now()\n",
+ " poll_time = now.strftime(\"%H:%M:%S\")\n",
+ " print(f\"[INFO] Last polling time: {poll_time}\", end=\"\\r\")\n",
+ " \n",
+ " # Exit if all tasks completed\n",
+ " if num_tasks == 0 or num_completed == num_tasks:\n",
+ " print(f\"[INFO] No active tasks remaining.\")\n",
+ " break\n",
+ " \n",
+ " # Increment after interval\n",
+ " time.sleep(interval_s)"
]
},
{
"cell_type": "code",
"execution_count": null,
- "id": "f9d70d57",
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "944750ad-bab7-422e-9714-e49522d2e029",
+ "id": "83fe0a74",
"metadata": {},
"outputs": [],
"source": []
diff --git a/tutorial/05a_Monitor_Mapping.ipynb b/tutorial/05a_Monitor_Mapping.ipynb
new file mode 100644
index 0000000..517caaf
--- /dev/null
+++ b/tutorial/05a_Monitor_Mapping.ipynb
@@ -0,0 +1,434 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "707bb7bc-2991-4d25-8261-dede3fd111c3",
+ "metadata": {},
+ "source": [
+ "# Monitor progress of mapping tasks\n",
+ "\n",
+ "Run this notebook to visualise the progress of mapping tasks."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "9d92f667-1d95-43e8-b47f-a928cdce5907",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Necessary imports\n",
+ "import os\n",
+ "os.environ['USE_PYGEOS'] = '0'\n",
+ "import pandas as pd\n",
+ "import geopandas as gpd\n",
+ "import time\n",
+ "import folium\n",
+ "import geemap.foliumap as geemap\n",
+ "import branca.colormap\n",
+ "from tqdm.notebook import tqdm\n",
+ "from datetime import datetime\n",
+ "\n",
+ "from db_utils import DB\n",
+ "from dotenv import load_dotenv"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "5d30dd68",
+ "metadata": {},
+ "source": [
+ "## Load environment and project details\n",
+ "\n",
+ "As with the other notebooks, we load credentials and project details from a hidden ```.env``` file."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e57b7c05",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Load environment variables (including path to credentials) from '.env' file\n",
+ "env_file_path = \"../.env\"\n",
+ "\n",
+ "# Uncomment for alternative version for Windows (r\"\" indicates raw string)\n",
+ "#env_file_path = r\"C:/Users/User/floodmapper/.env\"\n",
+ "\n",
+ "assert load_dotenv(dotenv_path=env_file_path) == True, \"[ERR] Failed to load environment!\"\n",
+ "assert \"GOOGLE_APPLICATION_CREDENTIALS\" in os.environ, \"[ERR] Missing $GOOGLE_APPLICATION_CREDENTIAL!\"\n",
+ "assert \"GS_USER_PROJECT\" in os.environ, \"[ERR] Missing $GS_USER_PROJECT!\"\n",
+ "key_file_path = os.environ[\"GOOGLE_APPLICATION_CREDENTIALS\"]\n",
+ "assert os.path.exists(key_file_path), f\"[ERR] Google credential key file does not exist: \\n{key_file_path} \"\n",
+ "assert \"ML4FLOODS_BASE_DIR\" in os.environ, \"[ERR] Missing $ML4FLOODS_BASE_DIR!\"\n",
+ "base_path = os.environ[\"ML4FLOODS_BASE_DIR\"]\n",
+ "assert os.path.exists(base_path), f\"[ERR] Base path does not exist: \\n{base_path} \"\n",
+ "print(\"[INFO] Successfully loaded FloodMapper environment.\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "21371a78",
+ "metadata": {},
+ "source": [
+ "## Retrieve the session parameters\n",
+ "\n",
+ "**Set the name of the session here and run all remaining cells in order.**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "e1aebf3c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# EDIT THE NAME OF THE SESSION\n",
+ "session_name = \"EMSR586\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "b404539e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Connect to the database (point to the .env file for credentials)\n",
+ "db_conn = DB(env_file_path)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "a753763a",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Fetch the session parameters from the database\n",
+ "query = (f\"SELECT flood_date_start, flood_date_end, \"\n",
+ " f\"ref_date_start, ref_date_end, bucket_uri \"\n",
+ " f\"FROM session_info \"\n",
+ " f\"WHERE session = %s\")\n",
+ "data = (session_name,)\n",
+ "session_df = db_conn.run_query(query, data, fetch=True)\n",
+ "flood_start_date = session_df.iloc[0][\"flood_date_start\"]\n",
+ "flood_end_date = session_df.iloc[0][\"flood_date_end\"]\n",
+ "ref_start_date = session_df.iloc[0][\"ref_date_start\"]\n",
+ "ref_end_date = session_df.iloc[0][\"ref_date_end\"]\n",
+ "bucket_uri = session_df.iloc[0][\"bucket_uri\"]\n",
+ "\n",
+ "# Fetch the AoI grid patches from the database\n",
+ "query = (f\"SELECT DISTINCT patch_name \"\n",
+ " f\"FROM session_patches \"\n",
+ " f\"WHERE session = %s\")\n",
+ "data = (session_name,)\n",
+ "aois_df = db_conn.run_query(query, data, fetch=True)\n",
+ "num_patches = len(aois_df)\n",
+ "print(f\"[INFO] Found {num_patches} grid patches in map.\")\n",
+ "aois_list = aois_df.patch_name.to_list()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "158e4477",
+ "metadata": {},
+ "source": [
+ "## Query the progress of inference from database"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "2e97d59e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Query the inference status and geometry of each image\n",
+ "query = (f\"SELECT DISTINCT dl.image_id, dl.patch_name, inf.status, ST_AsText(gr.geometry) \"\n",
+ " f\"FROM image_downloads dl \"\n",
+ " f\"LEFT JOIN grid_loc gr \"\n",
+ " f\"ON dl.patch_name = gr.patch_name \"\n",
+ " f\"LEFT JOIN (SELECT * FROM inference WHERE mode='vect') AS inf \"\n",
+ " f\"ON dl.image_id = inf.image_id \"\n",
+ " f\"WHERE dl.patch_name IN %s \"\n",
+ " f\"AND dl.status = 1 \"\n",
+ " f\"AND ((dl.date >= %s \"\n",
+ " f\"AND dl.date <= %s) \")\n",
+ "data = [tuple(aois_list), flood_start_date, flood_end_date]\n",
+ "if ref_start_date is not None and ref_end_date is not None:\n",
+ " query += (f\"OR (dl.date >= %s \"\n",
+ " f\"AND dl.date <= %s));\")\n",
+ " data += [ref_start_date, ref_end_date]\n",
+ "else:\n",
+ " query += (f\");\")\n",
+ "inf_df = db_conn.run_query(query, data, fetch = True)\n",
+ "num_rows = len(inf_df)\n",
+ "print(f\"[INFO] Entries for {num_rows} images in the DB.\")\n",
+ "\n",
+ "# Format the results into a correct GeoDataFrame\n",
+ "inf_df['geometry'] = gpd.GeoSeries.from_wkt(inf_df['st_astext'])\n",
+ "inf_df.drop(['st_astext'], axis=1, inplace = True)\n",
+ "inf_gdf = gpd.GeoDataFrame(inf_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "inf_gdf = inf_gdf.fillna(0)\n",
+ "\n",
+ "# Create an outline of the map area\n",
+ "aoi_outline = inf_gdf.geometry.unary_union\n",
+ "aoi_outline_gdf = gpd.GeoDataFrame(geometry=[aoi_outline], crs=\"EPSG:4326\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "8b754f2b",
+ "metadata": {},
+ "source": [
+ "## Parse the number of inference processed files in each grid patch"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "23f569d8",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Extract the patch polygons\n",
+ "geom = inf_gdf[[\"patch_name\", \"geometry\"]].drop_duplicates()\n",
+ "geom = geom.set_index(\"patch_name\")\n",
+ "\n",
+ "# Count the processed and unprocessed files\n",
+ "grid_inf_gdf = inf_gdf.loc[inf_gdf.status == 1]\n",
+ "processed = grid_inf_gdf.groupby(\"patch_name\").image_id.count()\n",
+ "grid_not_gdf = inf_gdf.loc[inf_gdf.status == 0]\n",
+ "unprocessed = grid_not_gdf.groupby(\"patch_name\").image_id.count()\n",
+ "\n",
+ "# Create a processed gdf\n",
+ "processed_df = pd.concat([processed, geom], axis = 1)\n",
+ "processed_df = processed_df.rename(columns={\"image_id\": \"count\"})\n",
+ "processed_gdf = gpd.GeoDataFrame(processed_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "processed_gdf = processed_gdf.fillna(0)\n",
+ "\n",
+ "# Create an unprocessed gdf\n",
+ "unprocessed_df = pd.concat([unprocessed, geom], axis = 1)\n",
+ "unprocessed_df = unprocessed_df.rename(columns={\"image_id\": \"count\"})\n",
+ "unprocessed_gdf = gpd.GeoDataFrame(unprocessed_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "unprocessed_gdf = unprocessed_gdf.fillna(0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "fa446f38",
+ "metadata": {},
+ "source": [
+ "## Plot the number of inference processed files"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "65a7b63e",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define a style function to set the colours\n",
+ "#cm = branca.colormap.LinearColormap(\n",
+ "# ['red', 'orange', 'yellow', 'cyan', 'blue', 'darkblue'],\n",
+ "cm = branca.colormap.linear.YlOrRd_07.scale(\n",
+ " vmin=processed_gdf[\"count\"].min(), \n",
+ " vmax=processed_gdf[\"count\"].max())\n",
+ "def style_fn(feature):\n",
+ " return {\n",
+ " 'fillColor': cm(feature['properties']['count']),\n",
+ " 'color': cm(feature['properties']['count']),\n",
+ " 'weight': 0.5,\n",
+ " \"fillOpacity\": 0.5\n",
+ " }\n",
+ "\n",
+ "# Plot the patches colour-coded by number of downloads\n",
+ "m = aoi_outline_gdf.explore(color=\"black\", style_kwds={\"fillOpacity\": 0.0, \"weight\": 3}, \n",
+ " name=\"AoI Outline\", highlight=False)\n",
+ "folium.GeoJson(processed_gdf, \n",
+ " style_function=style_fn,\n",
+ " name=\"Processed Images\",\n",
+ " tooltip=folium.features.GeoJsonTooltip([\"count\"]),\n",
+ " ).add_to(m)\n",
+ "\n",
+ "# Add the colourmap, layer control and show\n",
+ "m.add_child(cm)\n",
+ "folium.LayerControl(collapsed=False).add_to(m)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "809c4889",
+ "metadata": {},
+ "source": [
+ "## Plot the number of inference unprocessed files"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "d51a7fa3",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define a style function to set the colours\n",
+ "#cm = branca.colormap.LinearColormap(\n",
+ "# ['red', 'yellow', 'green'],\n",
+ "cm = branca.colormap.linear.YlOrRd_07.scale(\n",
+ " vmin=unprocessed_gdf[\"count\"].min(), \n",
+ " vmax=unprocessed_gdf[\"count\"].max())\n",
+ "def style_fn(feature):\n",
+ " return {\n",
+ " 'fillColor': cm(feature['properties']['count']),\n",
+ " 'color': cm(feature['properties']['count']),\n",
+ " 'weight': 0.5,\n",
+ " \"fillOpacity\": 0.5\n",
+ " }\n",
+ "\n",
+ "# Plot the patches colour-coded by number of downloads\n",
+ "m = aoi_outline_gdf.explore(color=\"black\", style_kwds={\"fillOpacity\": 0.0, \"weight\": 3}, \n",
+ " name=\"AoI Outline\", highlight=False)\n",
+ "folium.GeoJson(unprocessed_gdf, \n",
+ " style_function=style_fn,\n",
+ " name=\"Unprocessed Images\",\n",
+ " tooltip=folium.features.GeoJsonTooltip([\"count\"]),\n",
+ " ).add_to(m)\n",
+ "\n",
+ "# Add the colourmap, layer control and show\n",
+ "m.add_child(cm)\n",
+ "folium.LayerControl(collapsed=False).add_to(m)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "6b054a63",
+ "metadata": {},
+ "source": [
+ "## Calculate the percentage processed (inference)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "021cbb83",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "num_processed = inf_gdf[inf_gdf.status==1].status.count()\n",
+ "num_files = len(inf_gdf)\n",
+ "num_unprocessed = inf_gdf[inf_gdf.status==0].status.count()\n",
+ "percent_processed = round(num_processed*100 / num_files, 2)\n",
+ "print(f\"[INFO] Inference is {percent_processed}% processed ({num_processed}/{num_files} files).\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "49a44bfd",
+ "metadata": {},
+ "source": [
+ "## Query the progress of the temporal aggregation step"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "48f82039",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Query the inference status and geometry of each image\n",
+ "query = (f\"SELECT DISTINCT s.patch_name, t.status, ST_AsText(gr.geometry) \"\n",
+ " f\"FROM session_patches s \"\n",
+ " f\"LEFT JOIN grid_loc gr \"\n",
+ " f\"ON s.patch_name = gr.patch_name \"\n",
+ " f\"LEFT JOIN (SELECT * FROM postproc_temporal WHERE mode='flood' AND session = %s) AS t \"\n",
+ " f\"ON s.patch_name = t.patch_name \"\n",
+ " f\"WHERE s.session = %s ;\")\n",
+ "data = [session_name, session_name]\n",
+ "tmp_df = db_conn.run_query(query, data, fetch = True)\n",
+ "num_rows = len(tmp_df)\n",
+ "print(f\"[INFO] Entries for {num_rows} patches in the DB.\")\n",
+ "\n",
+ "# Format the results into a correct GeoDataFrame\n",
+ "tmp_df['geometry'] = gpd.GeoSeries.from_wkt(tmp_df['st_astext'])\n",
+ "tmp_df.drop(['st_astext'], axis=1, inplace = True)\n",
+ "tmp_gdf = gpd.GeoDataFrame(tmp_df, geometry='geometry', crs=\"EPSG:4326\")\n",
+ "tmp_gdf = tmp_gdf.fillna(0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "d72e9762",
+ "metadata": {},
+ "source": [
+ "## Plot the progress of temporal aggregation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "cef66f19",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define a style function to set the colours\n",
+ "cm = branca.colormap.LinearColormap(['red', 'blue'])\n",
+ "def style_fn(feature):\n",
+ " return {\n",
+ " 'fillColor': cm(feature['properties']['status']),\n",
+ " 'color': cm(feature['properties']['status']),\n",
+ " 'weight': 0.5,\n",
+ " \"fillOpacity\": 0.5\n",
+ " }\n",
+ "\n",
+ "# Plot the patches colour-coded by number of downloads\n",
+ "m = aoi_outline_gdf.explore(color=\"black\", style_kwds={\"fillOpacity\": 0.0, \"weight\": 3}, \n",
+ " name=\"AoI Outline\", highlight=False)\n",
+ "folium.GeoJson(tmp_gdf, \n",
+ " style_function=style_fn,\n",
+ " name=\"Temporal Aggregation Done\",\n",
+ " tooltip=folium.features.GeoJsonTooltip([\"status\"]),\n",
+ " ).add_to(m)\n",
+ "\n",
+ "# Add the colourmap, layer control and show\n",
+ "m.add_child(cm)\n",
+ "folium.LayerControl(collapsed=False).add_to(m)\n",
+ "m"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "0c0ebd71",
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python (floodmapper)",
+ "language": "python",
+ "name": "floodmapper"
+ },
+ "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.16"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}