diff --git a/algorithm_catalog/obsgession/udp_obsgession_w23_lai/notebooks/execute-obsgession-lai-udp.ipynb b/algorithm_catalog/obsgession/udp_obsgession_w23_lai/notebooks/execute-obsgession-lai-udp.ipynb new file mode 100644 index 000000000..2095c651c --- /dev/null +++ b/algorithm_catalog/obsgession/udp_obsgession_w23_lai/notebooks/execute-obsgession-lai-udp.ipynb @@ -0,0 +1,385 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "f4f734a1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting git+https://github.com/ESA-WEED-project/eo_processing@v0.6.0\n", + " Cloning https://github.com/ESA-WEED-project/eo_processing (to revision v0.6.0) to /private/var/folders/50/09_2zmx12zj6ks4fdl4y9wgc0000gn/T/pip-req-build-uxy7br7j\n", + " Running command git clone --filter=blob:none --quiet https://github.com/ESA-WEED-project/eo_processing /private/var/folders/50/09_2zmx12zj6ks4fdl4y9wgc0000gn/T/pip-req-build-uxy7br7j\n", + " Running command git checkout -q 68a4c0c09ea245527f7168068572d0169e0dda42\n", + " Resolved https://github.com/ESA-WEED-project/eo_processing to commit 68a4c0c09ea245527f7168068572d0169e0dda42\n", + " Installing build dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Getting requirements to build wheel ... \u001b[?25ldone\n", + "\u001b[?25h Installing backend dependencies ... \u001b[?25ldone\n", + "\u001b[?25h Preparing metadata (pyproject.toml) ... \u001b[?25ldone\n", + "\u001b[?25hRequirement already satisfied: rasterio>=1.3.11 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (1.5.0)\n", + "Requirement already satisfied: openeo==0.49.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (0.49.0)\n", + "Requirement already satisfied: geopandas>=1.0.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (1.1.3)\n", + "Requirement already satisfied: notebook>=7.2.2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (7.5.5)\n", + "Requirement already satisfied: matplotlib>=3.9.2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (3.10.8)\n", + "Requirement already satisfied: rioxarray>=0.17.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (0.21.0)\n", + "Requirement already satisfied: netCDF4==1.7.3 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (1.7.3)\n", + "Requirement already satisfied: scikit-image>=0.24.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (0.26.0)\n", + "Requirement already satisfied: onnx>=1.16.2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (1.20.1)\n", + "Requirement already satisfied: catboost>=1.2.7 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (1.2.10)\n", + "Requirement already satisfied: onnxruntime>=1.18.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (1.23.2)\n", + "Requirement already satisfied: geojson>=3.1.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (3.2.0)\n", + "Requirement already satisfied: pyarrow>=17.0.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (23.0.1)\n", + "Requirement already satisfied: fastparquet>=2024.5.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (2026.3.0)\n", + "Requirement already satisfied: pydrive2>=1.21.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (1.21.3)\n", + "Requirement already satisfied: hvac>=2.3.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (2.4.0)\n", + "Requirement already satisfied: boto3>=1.36.16 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (1.42.63)\n", + "Requirement already satisfied: skl2onnx==1.19.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (1.19.1)\n", + "Requirement already satisfied: psycopg2-binary>=2.9.10 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (2.9.12)\n", + "Requirement already satisfied: folium>=0.17.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (0.20.0)\n", + "Requirement already satisfied: python-dotenv>=1.2.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (1.2.2)\n", + "Requirement already satisfied: pystac-client>=0.9.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from eo_processing==0.6.0) (0.9.0)\n", + "Requirement already satisfied: cftime in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from netCDF4==1.7.3->eo_processing==0.6.0) (1.6.5)\n", + "Requirement already satisfied: certifi in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from netCDF4==1.7.3->eo_processing==0.6.0) (2026.2.25)\n", + "Requirement already satisfied: numpy in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from netCDF4==1.7.3->eo_processing==0.6.0) (2.4.3)\n", + "Requirement already satisfied: requests>=2.26.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from openeo==0.49.0->eo_processing==0.6.0) (2.32.5)\n", + "Requirement already satisfied: urllib3>=1.9.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from openeo==0.49.0->eo_processing==0.6.0) (2.6.3)\n", + "Requirement already satisfied: shapely>=1.6.4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from openeo==0.49.0->eo_processing==0.6.0) (2.1.2)\n", + "Requirement already satisfied: xarray<2025.01.2,>=0.12.3 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from openeo==0.49.0->eo_processing==0.6.0) (2025.1.1)\n", + "Requirement already satisfied: pandas<3.0.0,>0.20.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from openeo==0.49.0->eo_processing==0.6.0) (2.3.3)\n", + "Requirement already satisfied: pystac>=1.5.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from openeo==0.49.0->eo_processing==0.6.0) (1.14.3)\n", + "Requirement already satisfied: deprecated>=1.2.12 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from openeo==0.49.0->eo_processing==0.6.0) (1.3.1)\n", + "Requirement already satisfied: scikit-learn>=1.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from skl2onnx==1.19.1->eo_processing==0.6.0) (1.8.0)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pandas<3.0.0,>0.20.0->openeo==0.49.0->eo_processing==0.6.0) (2.9.0.post0)\n", + "Requirement already satisfied: pytz>=2020.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pandas<3.0.0,>0.20.0->openeo==0.49.0->eo_processing==0.6.0) (2026.1.post1)\n", + "Requirement already satisfied: tzdata>=2022.7 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pandas<3.0.0,>0.20.0->openeo==0.49.0->eo_processing==0.6.0) (2025.3)\n", + "Requirement already satisfied: packaging>=23.2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from xarray<2025.01.2,>=0.12.3->openeo==0.49.0->eo_processing==0.6.0) (26.0)\n", + "Requirement already satisfied: botocore<1.43.0,>=1.42.63 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from boto3>=1.36.16->eo_processing==0.6.0) (1.42.63)\n", + "Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from boto3>=1.36.16->eo_processing==0.6.0) (1.1.0)\n", + "Requirement already satisfied: s3transfer<0.17.0,>=0.16.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from boto3>=1.36.16->eo_processing==0.6.0) (0.16.0)\n", + "Requirement already satisfied: six>=1.5 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from python-dateutil>=2.8.2->pandas<3.0.0,>0.20.0->openeo==0.49.0->eo_processing==0.6.0) (1.17.0)\n", + "Requirement already satisfied: graphviz in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from catboost>=1.2.7->eo_processing==0.6.0) (0.21)\n", + "Requirement already satisfied: scipy in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from catboost>=1.2.7->eo_processing==0.6.0) (1.17.1)\n", + "Requirement already satisfied: plotly in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from catboost>=1.2.7->eo_processing==0.6.0) (6.6.0)\n", + "Requirement already satisfied: wrapt<3,>=1.10 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from deprecated>=1.2.12->openeo==0.49.0->eo_processing==0.6.0) (2.1.2)\n", + "Requirement already satisfied: cramjam>=2.3 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from fastparquet>=2024.5.0->eo_processing==0.6.0) (2.11.0)\n", + "Requirement already satisfied: fsspec in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from fastparquet>=2024.5.0->eo_processing==0.6.0) (2026.2.0)\n", + "Requirement already satisfied: branca>=0.6.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from folium>=0.17.0->eo_processing==0.6.0) (0.8.2)\n", + "Requirement already satisfied: jinja2>=2.9 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from folium>=0.17.0->eo_processing==0.6.0) (3.1.6)\n", + "Requirement already satisfied: xyzservices in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from folium>=0.17.0->eo_processing==0.6.0) (2025.11.0)\n", + "Requirement already satisfied: pyogrio>=0.7.2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from geopandas>=1.0.1->eo_processing==0.6.0) (0.12.1)\n", + "Requirement already satisfied: pyproj>=3.5.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from geopandas>=1.0.1->eo_processing==0.6.0) (3.7.2)\n", + "Requirement already satisfied: charset_normalizer<4,>=2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from requests>=2.26.0->openeo==0.49.0->eo_processing==0.6.0) (3.4.5)\n", + "Requirement already satisfied: idna<4,>=2.5 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from requests>=2.26.0->openeo==0.49.0->eo_processing==0.6.0) (3.11)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jinja2>=2.9->folium>=0.17.0->eo_processing==0.6.0) (3.0.3)\n", + "Requirement already satisfied: contourpy>=1.0.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from matplotlib>=3.9.2->eo_processing==0.6.0) (1.3.3)\n", + "Requirement already satisfied: cycler>=0.10 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from matplotlib>=3.9.2->eo_processing==0.6.0) (0.12.1)\n", + "Requirement already satisfied: fonttools>=4.22.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from matplotlib>=3.9.2->eo_processing==0.6.0) (4.62.1)\n", + "Requirement already satisfied: kiwisolver>=1.3.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from matplotlib>=3.9.2->eo_processing==0.6.0) (1.5.0)\n", + "Requirement already satisfied: pillow>=8 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from matplotlib>=3.9.2->eo_processing==0.6.0) (12.1.1)\n", + "Requirement already satisfied: pyparsing>=3 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from matplotlib>=3.9.2->eo_processing==0.6.0) (3.3.2)\n", + "Requirement already satisfied: jupyter-server<3,>=2.4.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from notebook>=7.2.2->eo_processing==0.6.0) (2.17.0)\n", + "Requirement already satisfied: jupyterlab-server<3,>=2.28.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from notebook>=7.2.2->eo_processing==0.6.0) (2.28.0)\n", + "Requirement already satisfied: jupyterlab<4.6,>=4.5.6 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from notebook>=7.2.2->eo_processing==0.6.0) (4.5.6)\n", + "Requirement already satisfied: notebook-shim<0.3,>=0.2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from notebook>=7.2.2->eo_processing==0.6.0) (0.2.4)\n", + "Requirement already satisfied: tornado>=6.2.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from notebook>=7.2.2->eo_processing==0.6.0) (6.5.5)\n", + "Requirement already satisfied: anyio>=3.1.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (4.12.1)\n", + "Requirement already satisfied: argon2-cffi>=21.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (25.1.0)\n", + "Requirement already satisfied: jupyter-client>=7.4.4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (8.8.0)\n", + "Requirement already satisfied: jupyter-core!=5.0.*,>=4.12 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (5.9.1)\n", + "Requirement already satisfied: jupyter-events>=0.11.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (0.12.0)\n", + "Requirement already satisfied: jupyter-server-terminals>=0.4.4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (0.5.4)\n", + "Requirement already satisfied: nbconvert>=6.4.4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (7.17.0)\n", + "Requirement already satisfied: nbformat>=5.3.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (5.10.4)\n", + "Requirement already satisfied: prometheus-client>=0.9 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (0.24.1)\n", + "Requirement already satisfied: pyzmq>=24 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (27.1.0)\n", + "Requirement already satisfied: send2trash>=1.8.2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (2.1.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (0.18.1)\n", + "Requirement already satisfied: traitlets>=5.6.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (5.14.3)\n", + "Requirement already satisfied: websocket-client>=1.7 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (1.9.0)\n", + "Requirement already satisfied: async-lru>=1.0.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (2.2.0)\n", + "Requirement already satisfied: httpx<1,>=0.25.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.28.1)\n", + "Requirement already satisfied: ipykernel!=6.30.0,>=6.5.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (7.2.0)\n", + "Requirement already satisfied: jupyter-lsp>=2.0.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (2.3.0)\n", + "Requirement already satisfied: setuptools>=41.1.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (78.1.1)\n", + "Requirement already satisfied: httpcore==1.* in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from httpx<1,>=0.25.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (1.0.9)\n", + "Requirement already satisfied: h11>=0.16 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from httpcore==1.*->httpx<1,>=0.25.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.16.0)\n", + "Requirement already satisfied: babel>=2.10 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyterlab-server<3,>=2.28.0->notebook>=7.2.2->eo_processing==0.6.0) (2.18.0)\n", + "Requirement already satisfied: json5>=0.9.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyterlab-server<3,>=2.28.0->notebook>=7.2.2->eo_processing==0.6.0) (0.13.0)\n", + "Requirement already satisfied: jsonschema>=4.18.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyterlab-server<3,>=2.28.0->notebook>=7.2.2->eo_processing==0.6.0) (4.24.1)\n", + "Requirement already satisfied: argon2-cffi-bindings in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from argon2-cffi>=21.1->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (25.1.0)\n", + "Requirement already satisfied: appnope>=0.1.2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.1.4)\n", + "Requirement already satisfied: comm>=0.1.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.2.3)\n", + "Requirement already satisfied: debugpy>=1.6.5 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (1.8.20)\n", + "Requirement already satisfied: ipython>=7.23.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (9.11.0)\n", + "Requirement already satisfied: matplotlib-inline>=0.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.2.1)\n", + "Requirement already satisfied: nest-asyncio>=1.4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (1.6.0)\n", + "Requirement already satisfied: psutil>=5.7 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (7.2.2)\n", + "Requirement already satisfied: decorator>=5.1.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (5.2.1)\n", + "Requirement already satisfied: ipython-pygments-lexers>=1.0.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (1.1.1)\n", + "Requirement already satisfied: jedi>=0.18.2 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.19.2)\n", + "Requirement already satisfied: pexpect>4.6 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (4.9.0)\n", + "Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (3.0.52)\n", + "Requirement already satisfied: pygments>=2.14.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (2.19.2)\n", + "Requirement already satisfied: stack_data>=0.6.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.6.3)\n", + "Requirement already satisfied: wcwidth in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.6.0)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jedi>=0.18.2->ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.8.6)\n", + "Requirement already satisfied: attrs>=22.2.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.28.0->notebook>=7.2.2->eo_processing==0.6.0) (25.4.0)\n", + "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.28.0->notebook>=7.2.2->eo_processing==0.6.0) (2025.9.1)\n", + "Requirement already satisfied: referencing>=0.28.4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.28.0->notebook>=7.2.2->eo_processing==0.6.0) (0.37.0)\n", + "Requirement already satisfied: rpds-py>=0.7.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jsonschema>=4.18.0->jupyterlab-server<3,>=2.28.0->notebook>=7.2.2->eo_processing==0.6.0) (0.30.0)\n", + "Requirement already satisfied: platformdirs>=2.5 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-core!=5.0.*,>=4.12->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (4.9.4)\n", + "Requirement already satisfied: python-json-logger>=2.0.4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (4.0.0)\n", + "Requirement already satisfied: pyyaml>=5.3 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (6.0.3)\n", + "Requirement already satisfied: rfc3339-validator in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (0.1.4)\n", + "Requirement already satisfied: rfc3986-validator>=0.1.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (0.1.1)\n", + "Requirement already satisfied: fqdn in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (1.5.1)\n", + "Requirement already satisfied: isoduration in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (20.11.0)\n", + "Requirement already satisfied: jsonpointer>1.13 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (3.0.0)\n", + "Requirement already satisfied: uri-template in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (1.3.0)\n", + "Requirement already satisfied: webcolors>=24.6.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (25.10.0)\n", + "Requirement already satisfied: beautifulsoup4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (4.14.3)\n", + "Requirement already satisfied: bleach!=5.0.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from bleach[css]!=5.0.0->nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (6.3.0)\n", + "Requirement already satisfied: defusedxml in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (0.7.1)\n", + "Requirement already satisfied: jupyterlab-pygments in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (0.3.0)\n", + "Requirement already satisfied: mistune<4,>=2.0.3 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (3.2.0)\n", + "Requirement already satisfied: nbclient>=0.5.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (0.10.4)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (1.5.1)\n", + "Requirement already satisfied: webencodings in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from bleach!=5.0.0->bleach[css]!=5.0.0->nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (0.5.1)\n", + "Requirement already satisfied: tinycss2<1.5,>=1.1.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from bleach[css]!=5.0.0->nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (1.4.0)\n", + "Requirement already satisfied: fastjsonschema>=2.15 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from nbformat>=5.3.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (2.21.2)\n", + "Requirement already satisfied: protobuf>=4.25.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from onnx>=1.16.2->eo_processing==0.6.0) (6.33.5)\n", + "Requirement already satisfied: typing_extensions>=4.7.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from onnx>=1.16.2->eo_processing==0.6.0) (4.15.0)\n", + "Requirement already satisfied: ml_dtypes>=0.5.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from onnx>=1.16.2->eo_processing==0.6.0) (0.5.4)\n", + "Requirement already satisfied: coloredlogs in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from onnxruntime>=1.18.1->eo_processing==0.6.0) (15.0.1)\n", + "Requirement already satisfied: flatbuffers in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from onnxruntime>=1.18.1->eo_processing==0.6.0) (25.12.19)\n", + "Requirement already satisfied: sympy in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from onnxruntime>=1.18.1->eo_processing==0.6.0) (1.14.0)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pexpect>4.6->ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.7.0)\n", + "Requirement already satisfied: google-api-python-client>=1.12.5 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (2.193.0)\n", + "Requirement already satisfied: oauth2client>=4.0.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (4.1.3)\n", + "Requirement already satisfied: cryptography<44 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (43.0.3)\n", + "Requirement already satisfied: pyOpenSSL<=24.2.1,>=19.1.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (24.2.1)\n", + "Requirement already satisfied: cffi>=1.12 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from cryptography<44->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (2.0.0)\n", + "Requirement already satisfied: pycparser in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from cffi>=1.12->cryptography<44->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (3.0)\n", + "Requirement already satisfied: httplib2<1.0.0,>=0.19.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from google-api-python-client>=1.12.5->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (0.31.2)\n", + "Requirement already satisfied: google-auth!=2.24.0,!=2.25.0,<3.0.0,>=1.32.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from google-api-python-client>=1.12.5->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (2.49.1)\n", + "Requirement already satisfied: google-auth-httplib2<1.0.0,>=0.2.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from google-api-python-client>=1.12.5->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (0.3.0)\n", + "Requirement already satisfied: google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0,>=1.31.5 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from google-api-python-client>=1.12.5->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (2.30.0)\n", + "Requirement already satisfied: uritemplate<5,>=3.0.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from google-api-python-client>=1.12.5->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (4.2.0)\n", + "Requirement already satisfied: googleapis-common-protos<2.0.0,>=1.56.3 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0,>=1.31.5->google-api-python-client>=1.12.5->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (1.73.0)\n", + "Requirement already satisfied: proto-plus<2.0.0,>=1.22.3 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from google-api-core!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0,<3.0.0,>=1.31.5->google-api-python-client>=1.12.5->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (1.27.1)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from google-auth!=2.24.0,!=2.25.0,<3.0.0,>=1.32.0->google-api-python-client>=1.12.5->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (0.4.2)\n", + "Requirement already satisfied: pyasn1>=0.1.7 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from oauth2client>=4.0.0->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (0.6.3)\n", + "Requirement already satisfied: rsa>=3.1.4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from oauth2client>=4.0.0->pydrive2>=1.21.1->pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (4.9.1)\n", + "Requirement already satisfied: tqdm>=4.0.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (4.67.3)\n", + "Requirement already satisfied: funcy>=1.14 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (2.0)\n", + "Requirement already satisfied: appdirs>=1.4.3 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from pydrive2[fsspec]>=1.21.1->eo_processing==0.6.0) (1.4.4)\n", + "Requirement already satisfied: affine in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from rasterio>=1.3.11->eo_processing==0.6.0) (2.4.0)\n", + "Requirement already satisfied: click!=8.2.*,>=4.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from rasterio>=1.3.11->eo_processing==0.6.0) (8.3.1)\n", + "Requirement already satisfied: cligj>=0.5 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from rasterio>=1.3.11->eo_processing==0.6.0) (0.7.2)\n", + "Requirement already satisfied: networkx>=3.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from scikit-image>=0.24.0->eo_processing==0.6.0) (3.6.1)\n", + "Requirement already satisfied: imageio!=2.35.0,>=2.33 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from scikit-image>=0.24.0->eo_processing==0.6.0) (2.37.3)\n", + "Requirement already satisfied: tifffile>=2022.8.12 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from scikit-image>=0.24.0->eo_processing==0.6.0) (2026.3.3)\n", + "Requirement already satisfied: lazy-loader>=0.4 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from scikit-image>=0.24.0->eo_processing==0.6.0) (0.5)\n", + "Requirement already satisfied: joblib>=1.3.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from scikit-learn>=1.1->skl2onnx==1.19.1->eo_processing==0.6.0) (1.5.3)\n", + "Requirement already satisfied: threadpoolctl>=3.2.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from scikit-learn>=1.1->skl2onnx==1.19.1->eo_processing==0.6.0) (3.6.0)\n", + "Requirement already satisfied: executing>=1.2.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from stack_data>=0.6.0->ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (2.2.1)\n", + "Requirement already satisfied: asttokens>=2.1.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from stack_data>=0.6.0->ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (3.0.1)\n", + "Requirement already satisfied: pure-eval in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from stack_data>=0.6.0->ipython>=7.23.1->ipykernel!=6.30.0,>=6.5.0->jupyterlab<4.6,>=4.5.6->notebook>=7.2.2->eo_processing==0.6.0) (0.2.3)\n", + "Requirement already satisfied: soupsieve>=1.6.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from beautifulsoup4->nbconvert>=6.4.4->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (2.8.3)\n", + "Requirement already satisfied: humanfriendly>=9.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from coloredlogs->onnxruntime>=1.18.1->eo_processing==0.6.0) (10.0)\n", + "Requirement already satisfied: arrow>=0.15.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from isoduration->jsonschema[format-nongpl]>=4.18.0->jupyter-events>=0.11.0->jupyter-server<3,>=2.4.0->notebook>=7.2.2->eo_processing==0.6.0) (1.4.0)\n", + "Requirement already satisfied: narwhals>=1.15.1 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from plotly->catboost>=1.2.7->eo_processing==0.6.0) (2.18.0)\n", + "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /Users/bramjanssen/miniconda/envs/apex_algorithms_qa/lib/python3.13/site-packages (from sympy->onnxruntime>=1.18.1->eo_processing==0.6.0) (1.3.0)\n" + ] + } + ], + "source": [ + "! pip install git+https://github.com/ESA-WEED-project/eo_processing@v0.6.0\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b1b73c7b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Authenticated using refresh token.\n" + ] + } + ], + "source": [ + "# import necessary packages\n", + "import openeo\n", + "\n", + "# connect with the backend\n", + "eoconn = openeo.connect(\n", + " \"openeofed.dataspace.copernicus.eu\"\n", + ").authenticate_oidc()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "947e74a6", + "metadata": {}, + "outputs": [], + "source": [ + "# define input parameters\n", + "start_date = '2025-06-01'\n", + "end_date = '2025-07-01'\n", + "\n", + "# make sure to pass cooordinate in meter and not in degree\n", + "aoi = {'east': 4880000, 'south': 2896000, 'west': 4876000, 'north': 2900000, 'crs': 3035}\n", + "process_graph = \"https://raw.githubusercontent.com/ESA-APEx/apex_algorithms/obsgession_lai/algorithm_catalog/obsgession/udp_obsgession_w23_lai/openeo_udp/udp_obsgession_w23_lai.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e3cac8c3", + "metadata": {}, + "outputs": [], + "source": [ + "# get cube from udp\n", + "cube = eoconn.datacube_from_process(\n", + " process_id=\"udp_obsgession_w23_lai\",\n", + " namespace=process_graph,\n", + " start_date=start_date,\n", + " end_date=end_date,\n", + " spatial_extent=aoi,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9e67680b", + "metadata": {}, + "outputs": [], + "source": [ + "# set the metadata for the output file\n", + "from eo_processing.utils.metadata import get_base_metadata\n", + "\n", + "file_meta = get_base_metadata(project='OBSGESSION', connection=eoconn)\n", + "file_meta.update(\n", + " description=f'Generation of EO4Diversity conform high-resolution temperate forests optimized LAI products based on Sentinel-2 following the OBSGESSION W2.3 benchmarking.',\n", + " tiling_grid='LAEA',\n", + " time_start=start_date,\n", + " time_end=end_date\n", + ")\n", + "bands_meta = {\n", + " \"LAI\": {\n", + " \"description\": \"LAI\",\n", + " \"unit\": \"m2*m-2\",\n", + " \"valid_range\": '[0, 240]',\n", + " \"scale\": 1./32.,\n", + " \"offset\": 0,\n", + " \"nodata_value\": 255},\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "534d1f36", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0:00:00 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': send 'start'\n", + "0:00:02 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': created (progress 0%)\n", + "0:00:08 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': queued (progress 0%)\n", + "0:00:14 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': queued (progress 0%)\n", + "0:00:22 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': queued (progress 0%)\n", + "0:00:33 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': queued (progress 0%)\n", + "0:00:45 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': queued (progress 0%)\n", + "0:01:00 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': queued (progress 0%)\n", + "0:01:20 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': running (progress N/A)\n", + "0:01:44 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': running (progress N/A)\n", + "0:02:14 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': running (progress N/A)\n", + "0:02:51 Job 'cdse-j-2607150812294b22a2c9a70ea0eb784f': finished (progress 100%)\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job = cube.execute_batch(\n", + " \"./EO4Diversity_LAI_result.tiff\",\n", + " title=f'LAI calculation for {start_date} to {end_date}',\n", + " out_format=\"GTiff\",\n", + " file_metadata=file_meta,\n", + " bands_metadata=bands_meta,\n", + " )\n", + "job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b283649", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "apex_algorithms_qa", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/algorithm_catalog/obsgession/udp_obsgession_w23_lai/notebooks/execute-udp.ipynb b/algorithm_catalog/obsgession/udp_obsgession_w23_lai/notebooks/execute-udp.ipynb deleted file mode 100644 index df0a9ab5e..000000000 --- a/algorithm_catalog/obsgession/udp_obsgession_w23_lai/notebooks/execute-udp.ipynb +++ /dev/null @@ -1,154 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "b1b73c7b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Authenticated using refresh token.\n" - ] - } - ], - "source": [ - "# import necessary packages\n", - "import openeo\n", - "\n", - "# connect with the backend\n", - "eoconn = openeo.connect(\n", - " \"openeofed.dataspace.copernicus.eu\"\n", - " ).authenticate_oidc()" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "947e74a6", - "metadata": {}, - "outputs": [], - "source": [ - "#define input parameters\n", - "start_date = '2025-06-01'\n", - "end_date = '2025-07-01'\n", - "\n", - "# make sure to pass cooordinate in meter and not in degree\n", - "aoi = {'east': 4880000, 'south': 2896000, 'west': 4876000, 'north': 2900000, 'crs': 3035}\n", - "process_graph = \"https://raw.githubusercontent.com/ESA-APEx/apex_algorithms/obsgession_lai/algorithm_catalog/obsgession/udp_obsgession_w23_lai/openeo_udp/udp_obsgession_w23_lai.json\"" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "e3cac8c3", - "metadata": {}, - "outputs": [], - "source": [ - "#get cube from udp\n", - "cube = eoconn.datacube_from_process(\n", - " process_id=\"udp_obsgession_w23_lai\",\n", - " namespace=process_graph,\n", - " start_date = start_date,\n", - " end_date = end_date,\n", - " spatial_extent = aoi,\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "534d1f36", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0:00:00 Job 'cdse-j-260521125423442186c4a5efd8866148': send 'start'\n", - "0:00:16 Job 'cdse-j-260521125423442186c4a5efd8866148': created (progress 0%)\n", - "0:00:21 Job 'cdse-j-260521125423442186c4a5efd8866148': created (progress 0%)\n", - "0:00:28 Job 'cdse-j-260521125423442186c4a5efd8866148': created (progress 0%)\n", - "0:00:36 Job 'cdse-j-260521125423442186c4a5efd8866148': created (progress 0%)\n", - "0:00:49 Job 'cdse-j-260521125423442186c4a5efd8866148': running (progress N/A)\n", - "0:01:02 Job 'cdse-j-260521125423442186c4a5efd8866148': running (progress N/A)\n", - "0:01:17 Job 'cdse-j-260521125423442186c4a5efd8866148': running (progress N/A)\n", - "0:01:36 Job 'cdse-j-260521125423442186c4a5efd8866148': running (progress N/A)\n", - "0:02:01 Job 'cdse-j-260521125423442186c4a5efd8866148': running (progress N/A)\n", - "0:02:31 Job 'cdse-j-260521125423442186c4a5efd8866148': running (progress N/A)\n", - "0:03:08 Job 'cdse-j-260521125423442186c4a5efd8866148': finished (progress 100%)\n" - ] - }, - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "job = cube.create_job(title=f'LAI calculation for {start_date} to {end_date}',auto_add_save_result=False)\n", - "job.start_and_wait()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8cdd68f6", - "metadata": {}, - "outputs": [], - "source": [ - "results = job.get_results()\n", - "results.download_files()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "eo", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/algorithm_catalog/obsgession/udp_obsgession_w23_lai/openeo_udp/udp_generation.py b/algorithm_catalog/obsgession/udp_obsgession_w23_lai/openeo_udp/udp_generation.py index 1d2ac3e55..2808526a6 100644 --- a/algorithm_catalog/obsgession/udp_obsgession_w23_lai/openeo_udp/udp_generation.py +++ b/algorithm_catalog/obsgession/udp_obsgession_w23_lai/openeo_udp/udp_generation.py @@ -1,16 +1,12 @@ import json +import pathlib + import openeo +from eo_processing.config.settings import get_advanced_options, get_collection_options, get_job_options +from eo_processing.openeo.preprocessing import extract_S2_datacube from openeo.api.process import Parameter -from openeo.processes import if_, eq +from openeo.processes import array_create, eq from openeo.rest.udp import build_process_dict -import os -import pathlib -from eo_processing.openeo.preprocessing import extract_S2_datacube -from eo_processing.config.settings import get_job_options, get_collection_options, get_advanced_options -from eo_processing.utils.metadata import get_base_metadata -from openeo.processes import array_create -from openeo.processes import ProcessBuilder -from typing import Any, Union # we use the base functionality of openEO @@ -27,6 +23,7 @@ def compute_LAI(bands): LAI = 4.0543 * EVI + 1.7901 return array_create([LAI]) + def generate() -> dict: """ Generate the UDP process graph for CropSAR1d. @@ -36,8 +33,8 @@ def generate() -> dict: # define input parameters print("defining parameters") param_start_date = Parameter.string( - name="start_date", - description="Start date of the observation period in format YYYY-MM-DD.", + name="start_date", + description="Start date of the observation period in format YYYY-MM-DD.", ) param_end_date = Parameter.string( name="end_date", @@ -47,72 +44,51 @@ def generate() -> dict: name="spatial_extent", description="""The AOI should be set as an openEO BBOX dict. It defines the boundaries of the area of interest. The coordinates are given in the order of west, south, east, north in EPSG:3035. Please make sure to pass the coordinates in meter and not in degree.""", - schema= {"title": "Bounding Box", + schema={ + "title": "Bounding Box", "type": "object", "subtype": "bounding-box", - "required": ["west", "south","east","north"], + "required": ["west", "south", "east", "north"], "properties": { - "west": { - "description": "West (lower left corner, coordinate axis 1).", - "type": "number" - }, - "south": { - "description": "South (lower left corner, coordinate axis 2).", - "type": "number" - }, - "east": { - "description": "East (upper right corner, coordinate axis 1).", - "type": "number" - }, - "north": { - "description": "North (upper right corner, coordinate axis 2).", - "type": "number" - }, + "west": {"description": "West (lower left corner, coordinate axis 1).", "type": "number"}, + "south": {"description": "South (lower left corner, coordinate axis 2).", "type": "number"}, + "east": {"description": "East (upper right corner, coordinate axis 1).", "type": "number"}, + "north": {"description": "North (upper right corner, coordinate axis 2).", "type": "number"}, "crs": { - "description": "Coordinate reference system of the extent, specified as as [EPSG code](http://www.epsg-registry.org/) or [WKT2 CRS string](http://docs.opengeospatial.org/is/18-010r7/18-010r7.html).", - "anyOf": [ - { - "title": "EPSG Code", - "type": "integer", - "subtype": "epsg-code", - "minimum": 1000, - "examples": [ - 3035 - ] - }, - { - "title": "WKT2", - "type": "string", - "subtype": "wkt2-definition" - } - ], - "default": 3035 - } - } - } - ) - param_binning_period= Parameter.string( + "description": "Coordinate reference system of the extent, specified as as [EPSG code](http://www.epsg-registry.org/) or [WKT2 CRS string](http://docs.opengeospatial.org/is/18-010r7/18-010r7.html).", + "anyOf": [ + { + "title": "EPSG Code", + "type": "integer", + "subtype": "epsg-code", + "minimum": 1000, + "examples": [3035], + }, + {"title": "WKT2", "type": "string", "subtype": "wkt2-definition"}, + ], + "default": 3035, + }, + }, + }, + ) + param_binning_period = Parameter.string( name="binning_period", - default='month', + default="month", description="The temporal binning period. Please have a look at openeo documentation of the process " - "aggregate_temporal_period for more information", - values=['day', 'week', 'dekad','month', 'season', 'year'] + "aggregate_temporal_period for more information", + values=["day", "week", "dekad", "month", "season", "year"], ) param_temp_aggregator = Parameter.string( name="temp_aggregator", description="The temporal aggregation function. Please have a look at openeo documentation of the process " - "aggregate_temporal_period for more information", + "aggregate_temporal_period for more information", values=["min", "max", "mean", "median"], - default="mean" - ) - param_epsg = Parameter.number( - name="epsg", - description="The EPSG is set to 3035 by default.", - default=3035 + default="mean", ) + param_epsg = Parameter.number(name="epsg", description="The EPSG is set to 3035 by default.", default=3035) - provider = 'cdse' + provider = "cdse" resolution = 20.0 # use the eo_processing package to prepare the Sentinel-2 time series for the LAI calculation @@ -122,27 +98,20 @@ def generate() -> dict: resolution=resolution, ts_interpolation=False, ts_interval=None, - slc_masking='mask_scl_dilation', + slc_masking="mask_scl_dilation", S2_max_cloud_cover=95, S2_bands=["B02", "B04", "B08"], skip_check_S2=True, ) collection_options = get_collection_options(provider=provider) - job_options = get_job_options(provider=provider, task='raw_extraction') - s2_cube = extract_S2_datacube(eoconn, - param_AOI, - param_start_date, - param_end_date, - **collection_options, - **processing_options - ) + job_options = get_job_options(provider=provider, task="raw_extraction") + s2_cube = extract_S2_datacube( + eoconn, param_AOI, param_start_date, param_end_date, **collection_options, **processing_options + ) LAI_cube = s2_cube.apply_dimension( - dimension="bands", - process=compute_LAI, - context={"parallel": True, - "TileSize": 128} + dimension="bands", process=compute_LAI, context={"parallel": True, "TileSize": 128} ).rename_labels("bands", ["LAI"]) # mask out values above 7.5 @@ -153,71 +122,53 @@ def generate() -> dict: LAI_cube_agg = eoconn.datacube_from_process( process_id="if", value=eq(param_temp_aggregator, "median", case_sensitive=False), - accept=LAI_cube.aggregate_temporal_period(period=param_binning_period, reducer='median'), + accept=LAI_cube.aggregate_temporal_period(period=param_binning_period, reducer="median"), reject=eoconn.datacube_from_process( process_id="if", value=eq(param_temp_aggregator, "mean", case_sensitive=False), - accept=LAI_cube.aggregate_temporal_period(period=param_binning_period, reducer='mean'), + accept=LAI_cube.aggregate_temporal_period(period=param_binning_period, reducer="mean"), reject=eoconn.datacube_from_process( process_id="if", value=eq(param_temp_aggregator, "max", case_sensitive=False), - accept=LAI_cube.aggregate_temporal_period(period=param_binning_period, reducer='max'), - reject=LAI_cube.aggregate_temporal_period(period=param_binning_period, reducer='min') - ) + accept=LAI_cube.aggregate_temporal_period(period=param_binning_period, reducer="max"), + reject=LAI_cube.aggregate_temporal_period(period=param_binning_period, reducer="min"), + ), ), ) - + # load the WorldCover 2021 for masking to tree cover - tree_cube = eoconn.load_collection("ESA_WORLDCOVER_10M_2021_V2", - spatial_extent=param_AOI, - bands=["MAP"] - ) - tree_cube = tree_cube.resample_spatial(projection=param_epsg, - resolution=resolution) + tree_cube = eoconn.load_collection("ESA_WORLDCOVER_10M_2021_V2", spatial_extent=param_AOI, bands=["MAP"]) + tree_cube = tree_cube.resample_spatial(projection=param_epsg, resolution=resolution) tree_cube = tree_cube.drop_dimension("t") - tree_mask = ~ (tree_cube == 10) + tree_mask = ~(tree_cube == 10) LAI_cube_mask_tree = LAI_cube_agg.mask(tree_mask) # load vector file for temperate forests and also mask - mask_url = 'https://s3.waw4-1.cloudferro.com/swift/v1/obsgession-waw4-1-b2rm8flkntfkatia3zzm7av6pzt3dsmrd2uc87dbvhnml/udp_data/EU_temperate_forests_distribution.parquet' + mask_url = "https://s3.waw4-1.cloudferro.com/swift/v1/obsgession-waw4-1-b2rm8flkntfkatia3zzm7av6pzt3dsmrd2uc87dbvhnml/udp_data/EU_temperate_forests_distribution.parquet" LAI_cube_mask_url = LAI_cube_mask_tree.mask_polygon(mask_url) - + # force Uint8 and scaling (scal_factor = 1./32) LAI_cube_mask_url = LAI_cube_mask_url.linear_scale_range(0, 7.5, 0, 240) - - # prepare metadata - file_meta = get_base_metadata(project='OBSGESSION') - file_meta.update(description=f'Generation of EO4Diversity conform high-resolution temperate forests optimized LAI products based on Sentinel-2 following the OBSGESSION W2.3 benchmarking.', - tiling_grid='LAEA', - time_start=param_start_date, - time_end=param_end_date) - bands_meta = {"LAI": {"description": "LAI", - "unit": "m2*m-2", - "valid_range": '[0, 240]', - "scale": 1./32., - "offset": 0, - "nodata_value": 255}} - - saved_result = LAI_cube_mask_url.save_result( - format="GTiff", - options={ - "file_metadata":file_meta, - "bands_metadata":bands_meta, - "filename_prefix": f"EO4Diversity_LAI_", - } - ) + return build_process_dict( - process_graph=saved_result.flat_graph(), + process_graph=LAI_cube_mask_url.flat_graph(), process_id="udp_obsgession_w23_lai", description=(pathlib.Path(__file__).parent / "README.md").read_text(), - parameters=[param_AOI, param_start_date, param_end_date, param_binning_period, param_temp_aggregator, param_epsg], - default_job_options=job_options + parameters=[ + param_AOI, + param_start_date, + param_end_date, + param_binning_period, + param_temp_aggregator, + param_epsg, + ], + default_job_options=job_options, ) if __name__ == "__main__": with open("udp_obsgession_w23_lai.json", "w") as f: json.dump(generate(), f, indent=2) - print("Process graph saved to udp_obsgession_w23_lai.json") \ No newline at end of file + print("Process graph saved to udp_obsgession_w23_lai.json") diff --git a/algorithm_catalog/obsgession/udp_obsgession_w23_lai/openeo_udp/udp_obsgession_w23_lai.json b/algorithm_catalog/obsgession/udp_obsgession_w23_lai/openeo_udp/udp_obsgession_w23_lai.json index fc12ffcf6..44bc9141f 100644 --- a/algorithm_catalog/obsgession/udp_obsgession_w23_lai/openeo_udp/udp_obsgession_w23_lai.json +++ b/algorithm_catalog/obsgession/udp_obsgession_w23_lai/openeo_udp/udp_obsgession_w23_lai.json @@ -1,912 +1,874 @@ { - "process_graph": { - "loadcollection1": { - "process_id": "load_collection", - "arguments": { - "bands": [ - "B02", - "B04", - "B08" - ], - "featureflags": { - "tilesize": 128 - }, - "id": "SENTINEL2_L2A", - "properties": { - "eo:cloud_cover": { - "process_graph": { - "lte1": { - "process_id": "lte", - "arguments": { - "x": { - "from_parameter": "value" - }, - "y": 95 - }, - "result": true - } - } - } - }, - "spatial_extent": { - "from_parameter": "spatial_extent" - }, - "temporal_extent": [ - { - "from_parameter": "start_date" - }, - { - "from_parameter": "end_date" - } - ] - } - }, - "resamplespatial1": { - "process_id": "resample_spatial", - "arguments": { - "align": "upper-left", - "data": { - "from_node": "loadcollection1" - }, - "method": "near", - "projection": { - "from_parameter": "epsg" - }, - "resolution": 20 - } - }, - "loadcollection2": { - "process_id": "load_collection", - "arguments": { - "bands": [ - "SCL" - ], - "featureflags": { - "tilesize": 128 - }, - "id": "SENTINEL2_L2A", - "properties": { - "eo:cloud_cover": { - "process_graph": { - "lte2": { - "process_id": "lte", - "arguments": { - "x": { - "from_parameter": "value" - }, - "y": 95 - }, - "result": true - } - } - } - }, - "spatial_extent": { - "from_parameter": "spatial_extent" - }, - "temporal_extent": [ - { - "from_parameter": "start_date" - }, - { - "from_parameter": "end_date" - } - ] - } - }, - "resamplespatial2": { - "process_id": "resample_spatial", - "arguments": { - "align": "upper-left", - "data": { - "from_node": "loadcollection2" - }, - "method": "near", - "projection": { - "from_parameter": "epsg" - }, - "resolution": 10 - } - }, - "toscldilationmask1": { - "process_id": "to_scl_dilation_mask", - "arguments": { - "data": { - "from_node": "resamplespatial2" - }, - "erosion_kernel_size": 3, - "kernel1_size": 17, - "kernel2_size": 77, - "mask1_values": [ - 2, - 4, - 5, - 6, - 7 - ], - "mask2_values": [ - 3, - 8, - 9, - 10, - 11 - ], - "scl_band_name": "SCL" - } - }, - "renamelabels1": { - "process_id": "rename_labels", - "arguments": { - "data": { - "from_node": "toscldilationmask1" - }, - "dimension": "bands", - "target": [ - "S2-CLOUD-MASK" - ] - } - }, - "mask1": { - "process_id": "mask", - "arguments": { - "data": { - "from_node": "resamplespatial1" - }, - "mask": { - "from_node": "renamelabels1" + "process_graph": { + "loadcollection1": { + "process_id": "load_collection", + "arguments": { + "bands": [ + "B02", + "B04", + "B08" + ], + "featureflags": { + "tilesize": 128 + }, + "id": "SENTINEL2_L2A", + "properties": { + "eo:cloud_cover": { + "process_graph": { + "lte1": { + "process_id": "lte", + "arguments": { + "x": { + "from_parameter": "value" + }, + "y": 95 + }, + "result": true + } + } + } + }, + "spatial_extent": { + "from_parameter": "spatial_extent" + }, + "temporal_extent": [ + { + "from_parameter": "start_date" + }, + { + "from_parameter": "end_date" + } + ] + } + }, + "resamplespatial1": { + "process_id": "resample_spatial", + "arguments": { + "align": "upper-left", + "data": { + "from_node": "loadcollection1" + }, + "method": "near", + "projection": { + "from_parameter": "epsg" + }, + "resolution": 20.0 + } + }, + "loadcollection2": { + "process_id": "load_collection", + "arguments": { + "bands": [ + "SCL" + ], + "featureflags": { + "tilesize": 128 + }, + "id": "SENTINEL2_L2A", + "properties": { + "eo:cloud_cover": { + "process_graph": { + "lte2": { + "process_id": "lte", + "arguments": { + "x": { + "from_parameter": "value" + }, + "y": 95 + }, + "result": true + } + } + } + }, + "spatial_extent": { + "from_parameter": "spatial_extent" + }, + "temporal_extent": [ + { + "from_parameter": "start_date" + }, + { + "from_parameter": "end_date" + } + ] + } + }, + "resamplespatial2": { + "process_id": "resample_spatial", + "arguments": { + "align": "upper-left", + "data": { + "from_node": "loadcollection2" + }, + "method": "near", + "projection": { + "from_parameter": "epsg" + }, + "resolution": 10.0 + } + }, + "toscldilationmask1": { + "process_id": "to_scl_dilation_mask", + "arguments": { + "data": { + "from_node": "resamplespatial2" + }, + "erosion_kernel_size": 3, + "kernel1_size": 17, + "kernel2_size": 77, + "mask1_values": [ + 2, + 4, + 5, + 6, + 7 + ], + "mask2_values": [ + 3, + 8, + 9, + 10, + 11 + ], + "scl_band_name": "SCL" + } + }, + "renamelabels1": { + "process_id": "rename_labels", + "arguments": { + "data": { + "from_node": "toscldilationmask1" + }, + "dimension": "bands", + "target": [ + "S2-CLOUD-MASK" + ] + } + }, + "mask1": { + "process_id": "mask", + "arguments": { + "data": { + "from_node": "resamplespatial1" + }, + "mask": { + "from_node": "renamelabels1" + } + } + }, + "apply1": { + "process_id": "apply", + "arguments": { + "data": { + "from_node": "mask1" + }, + "process": { + "process_graph": { + "linearscalerange1": { + "process_id": "linear_scale_range", + "arguments": { + "inputMax": 65534, + "inputMin": 0, + "outputMax": 65534, + "outputMin": 0, + "x": { + "from_parameter": "x" } + }, + "result": true } - }, - "apply1": { - "process_id": "apply", - "arguments": { + } + } + } + }, + "applydimension1": { + "process_id": "apply_dimension", + "arguments": { + "context": { + "parallel": true, + "TileSize": 128 + }, + "data": { + "from_node": "apply1" + }, + "dimension": "bands", + "process": { + "process_graph": { + "arrayelement1": { + "process_id": "array_element", + "arguments": { "data": { - "from_node": "mask1" + "from_parameter": "data" }, - "process": { - "process_graph": { - "linearscalerange1": { - "process_id": "linear_scale_range", - "arguments": { - "inputMax": 65534, - "inputMin": 0, - "outputMax": 65534, - "outputMin": 0, - "x": { - "from_parameter": "x" - } - }, - "result": true - } - } - } - } - }, - "applydimension1": { - "process_id": "apply_dimension", - "arguments": { - "context": { - "parallel": true, - "TileSize": 128 + "label": "B08" + } + }, + "multiply1": { + "process_id": "multiply", + "arguments": { + "x": { + "from_node": "arrayelement1" }, + "y": 0.0001 + } + }, + "arrayelement2": { + "process_id": "array_element", + "arguments": { "data": { - "from_node": "apply1" + "from_parameter": "data" }, - "dimension": "bands", - "process": { - "process_graph": { - "arrayelement1": { - "process_id": "array_element", - "arguments": { - "data": { - "from_parameter": "data" - }, - "label": "B08" - } - }, - "multiply1": { - "process_id": "multiply", - "arguments": { - "x": { - "from_node": "arrayelement1" - }, - "y": 0.0001 - } - }, - "arrayelement2": { - "process_id": "array_element", - "arguments": { - "data": { - "from_parameter": "data" - }, - "label": "B04" - } - }, - "multiply2": { - "process_id": "multiply", - "arguments": { - "x": { - "from_node": "arrayelement2" - }, - "y": 0.0001 - } - }, - "subtract1": { - "process_id": "subtract", - "arguments": { - "x": { - "from_node": "multiply1" - }, - "y": { - "from_node": "multiply2" - } - } - }, - "multiply3": { - "process_id": "multiply", - "arguments": { - "x": 2.5, - "y": { - "from_node": "subtract1" - } - } - }, - "multiply4": { - "process_id": "multiply", - "arguments": { - "x": 6, - "y": { - "from_node": "multiply2" - } - } - }, - "add1": { - "process_id": "add", - "arguments": { - "x": { - "from_node": "multiply1" - }, - "y": { - "from_node": "multiply4" - } - } - }, - "arrayelement3": { - "process_id": "array_element", - "arguments": { - "data": { - "from_parameter": "data" - }, - "label": "B02" - } - }, - "multiply5": { - "process_id": "multiply", - "arguments": { - "x": { - "from_node": "arrayelement3" - }, - "y": 0.0001 - } - }, - "multiply6": { - "process_id": "multiply", - "arguments": { - "x": 7.5, - "y": { - "from_node": "multiply5" - } - } - }, - "subtract2": { - "process_id": "subtract", - "arguments": { - "x": { - "from_node": "add1" - }, - "y": { - "from_node": "multiply6" - } - } - }, - "add2": { - "process_id": "add", - "arguments": { - "x": { - "from_node": "subtract2" - }, - "y": 1 - } - }, - "divide1": { - "process_id": "divide", - "arguments": { - "x": { - "from_node": "multiply3" - }, - "y": { - "from_node": "add2" - } - } - }, - "multiply7": { - "process_id": "multiply", - "arguments": { - "x": 4.0543, - "y": { - "from_node": "divide1" - } - } - }, - "add3": { - "process_id": "add", - "arguments": { - "x": { - "from_node": "multiply7" - }, - "y": 1.7901 - } - }, - "arraycreate1": { - "process_id": "array_create", - "arguments": { - "data": [ - { - "from_node": "add3" - } - ] - }, - "result": true - } - } - } - } - }, - "renamelabels2": { - "process_id": "rename_labels", - "arguments": { - "data": { - "from_node": "applydimension1" + "label": "B04" + } + }, + "multiply2": { + "process_id": "multiply", + "arguments": { + "x": { + "from_node": "arrayelement2" }, - "dimension": "bands", - "target": [ - "LAI" - ] - } - }, - "apply2": { - "process_id": "apply", - "arguments": { - "data": { - "from_node": "renamelabels2" + "y": 0.0001 + } + }, + "subtract1": { + "process_id": "subtract", + "arguments": { + "x": { + "from_node": "multiply1" }, - "process": { - "process_graph": { - "lt1": { - "process_id": "lt", - "arguments": { - "x": { - "from_parameter": "x" - }, - "y": 0 - }, - "result": true - } - } + "y": { + "from_node": "multiply2" } - } - }, - "apply3": { - "process_id": "apply", - "arguments": { - "data": { - "from_node": "renamelabels2" - }, - "process": { - "process_graph": { - "gt1": { - "process_id": "gt", - "arguments": { - "x": { - "from_parameter": "x" - }, - "y": 7.5 - }, - "result": true - } - } + } + }, + "multiply3": { + "process_id": "multiply", + "arguments": { + "x": 2.5, + "y": { + "from_node": "subtract1" } - } - }, - "mergecubes1": { - "process_id": "merge_cubes", - "arguments": { - "cube1": { - "from_node": "apply2" - }, - "cube2": { - "from_node": "apply3" - }, - "overlap_resolver": { - "process_graph": { - "or1": { - "process_id": "or", - "arguments": { - "x": { - "from_parameter": "x" - }, - "y": { - "from_parameter": "y" - } - }, - "result": true - } - } + } + }, + "multiply4": { + "process_id": "multiply", + "arguments": { + "x": 6.0, + "y": { + "from_node": "multiply2" } - } - }, - "mask2": { - "process_id": "mask", - "arguments": { - "data": { - "from_node": "renamelabels2" + } + }, + "add1": { + "process_id": "add", + "arguments": { + "x": { + "from_node": "multiply1" }, - "mask": { - "from_node": "mergecubes1" + "y": { + "from_node": "multiply4" } - } - }, - "aggregatetemporalperiod1": { - "process_id": "aggregate_temporal_period", - "arguments": { + } + }, + "arrayelement3": { + "process_id": "array_element", + "arguments": { "data": { - "from_node": "mask2" + "from_parameter": "data" }, - "period": { - "from_parameter": "binning_period" + "label": "B02" + } + }, + "multiply5": { + "process_id": "multiply", + "arguments": { + "x": { + "from_node": "arrayelement3" }, - "reducer": { - "process_graph": { - "median1": { - "process_id": "median", - "arguments": { - "data": { - "from_parameter": "data" - } - }, - "result": true - } - } + "y": 0.0001 + } + }, + "multiply6": { + "process_id": "multiply", + "arguments": { + "x": 7.5, + "y": { + "from_node": "multiply5" } - } - }, - "aggregatetemporalperiod2": { - "process_id": "aggregate_temporal_period", - "arguments": { - "data": { - "from_node": "mask2" - }, - "period": { - "from_parameter": "binning_period" + } + }, + "subtract2": { + "process_id": "subtract", + "arguments": { + "x": { + "from_node": "add1" }, - "reducer": { - "process_graph": { - "mean1": { - "process_id": "mean", - "arguments": { - "data": { - "from_parameter": "data" - } - }, - "result": true - } - } + "y": { + "from_node": "multiply6" } - } - }, - "aggregatetemporalperiod3": { - "process_id": "aggregate_temporal_period", - "arguments": { - "data": { - "from_node": "mask2" + } + }, + "add2": { + "process_id": "add", + "arguments": { + "x": { + "from_node": "subtract2" }, - "period": { - "from_parameter": "binning_period" + "y": 1.0 + } + }, + "divide1": { + "process_id": "divide", + "arguments": { + "x": { + "from_node": "multiply3" }, - "reducer": { - "process_graph": { - "max1": { - "process_id": "max", - "arguments": { - "data": { - "from_parameter": "data" - } - }, - "result": true - } - } + "y": { + "from_node": "add2" } - } - }, - "aggregatetemporalperiod4": { - "process_id": "aggregate_temporal_period", - "arguments": { - "data": { - "from_node": "mask2" - }, - "period": { - "from_parameter": "binning_period" - }, - "reducer": { - "process_graph": { - "min1": { - "process_id": "min", - "arguments": { - "data": { - "from_parameter": "data" - } - }, - "result": true - } - } + } + }, + "multiply7": { + "process_id": "multiply", + "arguments": { + "x": 4.0543, + "y": { + "from_node": "divide1" } - } - }, - "eq1": { - "process_id": "eq", - "arguments": { - "case_sensitive": false, + } + }, + "add3": { + "process_id": "add", + "arguments": { "x": { - "from_parameter": "temp_aggregator" + "from_node": "multiply7" }, - "y": "max" - } - }, - "if1": { - "process_id": "if", - "arguments": { - "accept": { - "from_node": "aggregatetemporalperiod3" - }, - "reject": { - "from_node": "aggregatetemporalperiod4" - }, - "value": { - "from_node": "eq1" - } + "y": 1.7901 + } + }, + "arraycreate1": { + "process_id": "array_create", + "arguments": { + "data": [ + { + "from_node": "add3" + } + ] + }, + "result": true } - }, - "eq2": { - "process_id": "eq", - "arguments": { - "case_sensitive": false, + } + } + } + }, + "renamelabels2": { + "process_id": "rename_labels", + "arguments": { + "data": { + "from_node": "applydimension1" + }, + "dimension": "bands", + "target": [ + "LAI" + ] + } + }, + "apply2": { + "process_id": "apply", + "arguments": { + "data": { + "from_node": "renamelabels2" + }, + "process": { + "process_graph": { + "lt1": { + "process_id": "lt", + "arguments": { "x": { - "from_parameter": "temp_aggregator" + "from_parameter": "x" }, - "y": "mean" + "y": 0 + }, + "result": true } - }, - "if2": { - "process_id": "if", - "arguments": { - "accept": { - "from_node": "aggregatetemporalperiod2" - }, - "reject": { - "from_node": "if1" - }, - "value": { - "from_node": "eq2" - } - } - }, - "eq3": { - "process_id": "eq", - "arguments": { - "case_sensitive": false, + } + } + } + }, + "apply3": { + "process_id": "apply", + "arguments": { + "data": { + "from_node": "renamelabels2" + }, + "process": { + "process_graph": { + "gt1": { + "process_id": "gt", + "arguments": { "x": { - "from_parameter": "temp_aggregator" + "from_parameter": "x" }, - "y": "median" + "y": 7.5 + }, + "result": true } - }, - "if3": { - "process_id": "if", - "arguments": { - "accept": { - "from_node": "aggregatetemporalperiod1" - }, - "reject": { - "from_node": "if2" + } + } + } + }, + "mergecubes1": { + "process_id": "merge_cubes", + "arguments": { + "cube1": { + "from_node": "apply2" + }, + "cube2": { + "from_node": "apply3" + }, + "overlap_resolver": { + "process_graph": { + "or1": { + "process_id": "or", + "arguments": { + "x": { + "from_parameter": "x" }, - "value": { - "from_node": "eq3" + "y": { + "from_parameter": "y" } + }, + "result": true } - }, - "loadcollection3": { - "process_id": "load_collection", - "arguments": { - "bands": [ - "MAP" - ], - "id": "ESA_WORLDCOVER_10M_2021_V2", - "spatial_extent": { - "from_parameter": "spatial_extent" - }, - "temporal_extent": null - } - }, - "resamplespatial3": { - "process_id": "resample_spatial", - "arguments": { - "align": "upper-left", + } + } + } + }, + "mask2": { + "process_id": "mask", + "arguments": { + "data": { + "from_node": "renamelabels2" + }, + "mask": { + "from_node": "mergecubes1" + } + } + }, + "aggregatetemporalperiod1": { + "process_id": "aggregate_temporal_period", + "arguments": { + "data": { + "from_node": "mask2" + }, + "period": { + "from_parameter": "binning_period" + }, + "reducer": { + "process_graph": { + "median1": { + "process_id": "median", + "arguments": { "data": { - "from_node": "loadcollection3" - }, - "method": "near", - "projection": { - "from_parameter": "epsg" - }, - "resolution": 20 + "from_parameter": "data" + } + }, + "result": true } - }, - "dropdimension1": { - "process_id": "drop_dimension", - "arguments": { + } + } + } + }, + "aggregatetemporalperiod2": { + "process_id": "aggregate_temporal_period", + "arguments": { + "data": { + "from_node": "mask2" + }, + "period": { + "from_parameter": "binning_period" + }, + "reducer": { + "process_graph": { + "mean1": { + "process_id": "mean", + "arguments": { "data": { - "from_node": "resamplespatial3" - }, - "name": "t" + "from_parameter": "data" + } + }, + "result": true } - }, - "apply4": { - "process_id": "apply", - "arguments": { + } + } + } + }, + "aggregatetemporalperiod3": { + "process_id": "aggregate_temporal_period", + "arguments": { + "data": { + "from_node": "mask2" + }, + "period": { + "from_parameter": "binning_period" + }, + "reducer": { + "process_graph": { + "max1": { + "process_id": "max", + "arguments": { "data": { - "from_node": "dropdimension1" - }, - "process": { - "process_graph": { - "eq4": { - "process_id": "eq", - "arguments": { - "x": { - "from_parameter": "x" - }, - "y": 10 - } - }, - "not1": { - "process_id": "not", - "arguments": { - "x": { - "from_node": "eq4" - } - }, - "result": true - } - } + "from_parameter": "data" } + }, + "result": true } - }, - "mask3": { - "process_id": "mask", - "arguments": { + } + } + } + }, + "aggregatetemporalperiod4": { + "process_id": "aggregate_temporal_period", + "arguments": { + "data": { + "from_node": "mask2" + }, + "period": { + "from_parameter": "binning_period" + }, + "reducer": { + "process_graph": { + "min1": { + "process_id": "min", + "arguments": { "data": { - "from_node": "if3" - }, - "mask": { - "from_node": "apply4" + "from_parameter": "data" } + }, + "result": true } + } + } + } + }, + "eq1": { + "process_id": "eq", + "arguments": { + "case_sensitive": false, + "x": { + "from_parameter": "temp_aggregator" + }, + "y": "max" + } + }, + "if1": { + "process_id": "if", + "arguments": { + "accept": { + "from_node": "aggregatetemporalperiod3" }, - "loadurl1": { - "process_id": "load_url", - "arguments": { - "format": "Parquet", - "url": "https://s3.waw4-1.cloudferro.com/swift/v1/obsgession-waw4-1-b2rm8flkntfkatia3zzm7av6pzt3dsmrd2uc87dbvhnml/udp_data/EU_temperate_forests_distribution.parquet" - } + "reject": { + "from_node": "aggregatetemporalperiod4" }, - "maskpolygon1": { - "process_id": "mask_polygon", - "arguments": { - "data": { - "from_node": "mask3" - }, - "mask": { - "from_node": "loadurl1" - } - } + "value": { + "from_node": "eq1" + } + } + }, + "eq2": { + "process_id": "eq", + "arguments": { + "case_sensitive": false, + "x": { + "from_parameter": "temp_aggregator" + }, + "y": "mean" + } + }, + "if2": { + "process_id": "if", + "arguments": { + "accept": { + "from_node": "aggregatetemporalperiod2" }, - "apply5": { - "process_id": "apply", - "arguments": { - "data": { - "from_node": "maskpolygon1" - }, - "process": { - "process_graph": { - "linearscalerange2": { - "process_id": "linear_scale_range", - "arguments": { - "inputMax": 7.5, - "inputMin": 0, - "outputMax": 240, - "outputMin": 0, - "x": { - "from_parameter": "x" - } - }, - "result": true - } - } - } - } + "reject": { + "from_node": "if1" }, - "saveresult1": { - "process_id": "save_result", - "arguments": { - "data": { - "from_node": "apply5" + "value": { + "from_node": "eq2" + } + } + }, + "eq3": { + "process_id": "eq", + "arguments": { + "case_sensitive": false, + "x": { + "from_parameter": "temp_aggregator" + }, + "y": "median" + } + }, + "if3": { + "process_id": "if", + "arguments": { + "accept": { + "from_node": "aggregatetemporalperiod1" + }, + "reject": { + "from_node": "if2" + }, + "value": { + "from_node": "eq3" + } + } + }, + "loadcollection3": { + "process_id": "load_collection", + "arguments": { + "bands": [ + "MAP" + ], + "id": "ESA_WORLDCOVER_10M_2021_V2", + "spatial_extent": { + "from_parameter": "spatial_extent" + }, + "temporal_extent": null + } + }, + "resamplespatial3": { + "process_id": "resample_spatial", + "arguments": { + "align": "upper-left", + "data": { + "from_node": "loadcollection3" + }, + "method": "near", + "projection": { + "from_parameter": "epsg" + }, + "resolution": 20.0 + } + }, + "dropdimension1": { + "process_id": "drop_dimension", + "arguments": { + "data": { + "from_node": "resamplespatial3" + }, + "name": "t" + } + }, + "apply4": { + "process_id": "apply", + "arguments": { + "data": { + "from_node": "dropdimension1" + }, + "process": { + "process_graph": { + "eq4": { + "process_id": "eq", + "arguments": { + "x": { + "from_parameter": "x" }, - "format": "GTiff", - "options": { - "file_metadata": { - "copyright": "OBSGESSION project 2025 / Contains modified Copernicus Sentinel data processed by VITO", - "creation_time": "2026-06-10T09:56:42Z", - "processing_platform": "openEO platform, {'client': 0.48.0}", - "EO_PROCESSING_SOFTWARE": "eo_processing, version 0.5.0", - "producer": "VITO NV", - "references": "https://obsgession.eu/", - "Tech-Guru": "Dr. Marcel Buchhorn", - "description": "Generation of EO4Diversity conform high-resolution temperate forests optimized LAI products based on Sentinel-2 following the OBSGESSION W2.3 benchmarking.", - "tiling_grid": "LAEA", - "time_start": { - "from_parameter": "start_date" - }, - "time_end": { - "from_parameter": "end_date" - } - }, - "bands_metadata": { - "LAI": { - "description": "LAI", - "unit": "m2*m-2", - "valid_range": "[0, 240]", - "scale": 0.03125, - "offset": 0, - "nodata_value": 255 - } - }, - "filename_prefix": "EO4Diversity_LAI_" - } + "y": 10 + } }, - "result": true + "not1": { + "process_id": "not", + "arguments": { + "x": { + "from_node": "eq4" + } + }, + "result": true + } + } } + } }, - "id": "udp_obsgession_w23_lai", - "description": "# EO4Diversity EVI-LAI \n\nCalculate **Leaf Area Index (LAI)** at 10m spatial resolution based on Sentinel-2 time series, optimized for forested areas in temperate zones. Users can define spatial area-of-interest, the start and end dates, and the temporal binning period. A cloud and tree cover mask are applied. The result is a Cloud Optimized GeoTIFF (COG) raster file. \n\nThe **LAI** provides a one-sided green leaf area, hence half the total area of a canopy’s green elements, per unit of horizontal ground area. The satellite-derived value corresponds to the total green LAI of all the canopy layers, including the understory, which may represent a very significant contribution, particularly for forests. LAI is a remote sensing-based **EBV-enabling product, which enables the generation of** the Essential Biodiversity Variable (EBV) *Live cover fraction* in the EBV class *Ecosystem structure*, and provides relevant information for the EBV classes *Ecosystem functioning and Ecosystem phenology*.\n\nSentinel-2 time series provides opportunities for medium-resolution LAI mapping due to its spectral configuration, which includes multiple red-edge and shortwave infrared (SWIR) bands.\n\n# Methodology\n\nThe empirical algorithm to derive the LAI from Sentinel-2 is developed and validated by the ESA-funded EO4Diversity project. It relates in-situ LAI measurements to the enhanced vegetation index (EVI) by adapting the approach developed by Boegh et al. (2002), optimized for and demonstrating robust performance over temperate forest sites. The method is computationally efficient and validated over temperate forest ecosystems. In principle, it could be transferable to other vegetated ecosystems with appropriate re-calibration. The method was identified as a benchmark approach in the OBSGESSION project, funded by the European Union under the Horizon Europe research and innovation programme.\n\n# Quality\n\nAbdullah et al. (2025) reports RMSE values varying between 0.85 and 2.28 m²m⁻² and a correlation coefficient varying between 0.55 and 0.78 when comparing measured and sentinel-2 retrieved LAI values across different years and forest sites (coniferous, deciduous and mixed) in northwestern Europe. Tests demonstrated a stable relationship between estimated and measured LAI and reliable capture of inter-annual and inter-site variability in canopy structure of diverse temperate forests with a single set of calibrated regression. Slightly higher uncertainty was observed in coniferous plots, likely due to clumping effects and strong background reflectance, whereas deciduous stands showed tighter correlations with ground observations. Overall, the results confirm that the LAI algorithm provides an accurate and transferable measure of vegetation canopy density suitable for regional-scale monitoring and ecosystem-condition applications.\n\n# Limitations\n\n* Input is Sentinel-2 L2A data sourced from CDSE. Usage of other data sources like existing Sentinel-2 composites is not yet supported. \n* The applied forest mask is based on the WorldCover2021 dataset. Usage of an annual Land Cover dataset (e.g. CCI) is not yet supported.\n\n# Links\n\n* Abdullah et al. (2025). Deliverable D2.3. Algorithm Theoretical Baseline Document. Deliverable D2.3 EU Horizon Europe OBSGESSION Project, Grant agreement No. 101134954\n* Boegh, E., et al (2002). Airborne multispectral data for quantifying leaf area index, nitrogen concentration, and photosynthetic efficiency in agriculture. Remote Sens Environ 81(2-3): 179-193. https://doi.org/10.1016/S0034-4257(01)00342-X \n* OBSGESSION project [https://obsgession.eu/](https://obsgession.eu/)\n* EO4Diversity project [https://www.eo4diversity.info/](https://www.eo4diversity.info/)\n", - "default_job_options": { - "driver-memory": "8G", - "driver-memoryOverhead": "5G", - "driver-cores": 1, - "executor-memory": "2000m", - "executor-memoryOverhead": "256m", - "executor-cores": 1, - "max-executors": 25, - "soft-errors": "true", - "python-memory": "2500m", - "logging-threshold": "info" - }, - "parameters": [ - { - "name": "spatial_extent", - "description": "The AOI should be set as an openEO BBOX dict. It defines the boundaries of the area of interest.\n The coordinates are given in the order of west, south, east, north in EPSG:3035. Please make sure to pass the coordinates in meter and not in degree.", - "schema": { - "title": "Bounding Box", - "type": "object", - "subtype": "bounding-box", - "required": [ - "west", - "south", - "east", - "north" - ], - "properties": { - "west": { - "description": "West (lower left corner, coordinate axis 1).", - "type": "number" - }, - "south": { - "description": "South (lower left corner, coordinate axis 2).", - "type": "number" - }, - "east": { - "description": "East (upper right corner, coordinate axis 1).", - "type": "number" - }, - "north": { - "description": "North (upper right corner, coordinate axis 2).", - "type": "number" - }, - "crs": { - "description": "Coordinate reference system of the extent, specified as as [EPSG code](http://www.epsg-registry.org/) or [WKT2 CRS string](http://docs.opengeospatial.org/is/18-010r7/18-010r7.html).", - "anyOf": [ - { - "title": "EPSG Code", - "type": "integer", - "subtype": "epsg-code", - "minimum": 1000, - "examples": [ - 3035 - ] - }, - { - "title": "WKT2", - "type": "string", - "subtype": "wkt2-definition" - } - ], - "default": 3035 - } + "mask3": { + "process_id": "mask", + "arguments": { + "data": { + "from_node": "if3" + }, + "mask": { + "from_node": "apply4" + } + } + }, + "loadurl1": { + "process_id": "load_url", + "arguments": { + "format": "Parquet", + "url": "https://s3.waw4-1.cloudferro.com/swift/v1/obsgession-waw4-1-b2rm8flkntfkatia3zzm7av6pzt3dsmrd2uc87dbvhnml/udp_data/EU_temperate_forests_distribution.parquet" + } + }, + "maskpolygon1": { + "process_id": "mask_polygon", + "arguments": { + "data": { + "from_node": "mask3" + }, + "mask": { + "from_node": "loadurl1" + } + } + }, + "apply5": { + "process_id": "apply", + "arguments": { + "data": { + "from_node": "maskpolygon1" + }, + "process": { + "process_graph": { + "linearscalerange2": { + "process_id": "linear_scale_range", + "arguments": { + "inputMax": 7.5, + "inputMin": 0, + "outputMax": 240, + "outputMin": 0, + "x": { + "from_parameter": "x" } + }, + "result": true } - }, - { - "name": "start_date", - "description": "Start date of the observation period in format YYYY-MM-DD.", - "schema": { - "type": "string" - } - }, - { - "name": "end_date", - "description": "End date of the observation period in format YYYY-MM-DD.", - "schema": { - "type": "string" - } - }, - { - "name": "binning_period", - "description": "The temporal binning period. Please have a look at openeo documentation of the process aggregate_temporal_period for more information", - "schema": { - "type": "string", - "enum": [ - "day", - "week", - "dekad", - "month", - "season", - "year" + } + } + }, + "result": true + } + }, + "id": "udp_obsgession_w23_lai", + "description": "# EO4Diversity EVI-LAI \n\nCalculate **Leaf Area Index (LAI)** at 10m spatial resolution based on Sentinel-2 time series, optimized for forested areas in temperate zones. Users can define spatial area-of-interest, the start and end dates, and the temporal binning period. A cloud and tree cover mask are applied. The result is a Cloud Optimized GeoTIFF (COG) raster file. \n\nThe **LAI** provides a one-sided green leaf area, hence half the total area of a canopy\u2019s green elements, per unit of horizontal ground area. The satellite-derived value corresponds to the total green LAI of all the canopy layers, including the understory, which may represent a very significant contribution, particularly for forests. LAI is a remote sensing-based **EBV-enabling product, which enables the generation of** the Essential Biodiversity Variable (EBV) *Live cover fraction* in the EBV class *Ecosystem structure*, and provides relevant information for the EBV classes *Ecosystem functioning and Ecosystem phenology*.\n\nSentinel-2 time series provides opportunities for medium-resolution LAI mapping due to its spectral configuration, which includes multiple red-edge and shortwave infrared (SWIR) bands.\n\n# Methodology\n\nThe empirical algorithm to derive the LAI from Sentinel-2 is developed and validated by the ESA-funded EO4Diversity project. It relates in-situ LAI measurements to the enhanced vegetation index (EVI) by adapting the approach developed by Boegh et al. (2002), optimized for and demonstrating robust performance over temperate forest sites. The method is computationally efficient and validated over temperate forest ecosystems. In principle, it could be transferable to other vegetated ecosystems with appropriate re-calibration. The method was identified as a benchmark approach in the OBSGESSION project, funded by the European Union under the Horizon Europe research and innovation programme.\n\n# Quality\n\nAbdullah et al. (2025) reports RMSE values varying between 0.85 and 2.28 m\u00b2m\u207b\u00b2 and a correlation coefficient varying between 0.55 and 0.78 when comparing measured and sentinel-2 retrieved LAI values across different years and forest sites (coniferous, deciduous and mixed) in northwestern Europe. Tests demonstrated a stable relationship between estimated and measured LAI and reliable capture of inter-annual and inter-site variability in canopy structure of diverse temperate forests with a single set of calibrated regression. Slightly higher uncertainty was observed in coniferous plots, likely due to clumping effects and strong background reflectance, whereas deciduous stands showed tighter correlations with ground observations. Overall, the results confirm that the LAI algorithm provides an accurate and transferable measure of vegetation canopy density suitable for regional-scale monitoring and ecosystem-condition applications.\n\n# Limitations\n\n* Input is Sentinel-2 L2A data sourced from CDSE. Usage of other data sources like existing Sentinel-2 composites is not yet supported. \n* The applied forest mask is based on the WorldCover2021 dataset. Usage of an annual Land Cover dataset (e.g. CCI) is not yet supported.\n\n# Links\n\n* Abdullah et al. (2025). Deliverable D2.3. Algorithm Theoretical Baseline Document. Deliverable D2.3 EU Horizon Europe OBSGESSION Project, Grant agreement No. 101134954\n* Boegh, E., et al (2002). Airborne multispectral data for quantifying leaf area index, nitrogen concentration, and photosynthetic efficiency in agriculture. Remote Sens Environ 81(2-3): 179-193. https://doi.org/10.1016/S0034-4257(01)00342-X \n* OBSGESSION project [https://obsgession.eu/](https://obsgession.eu/)\n* EO4Diversity project [https://www.eo4diversity.info/](https://www.eo4diversity.info/)\n", + "default_job_options": { + "driver-memory": "8G", + "driver-memoryOverhead": "5G", + "driver-cores": 1, + "executor-memory": "2000m", + "executor-memoryOverhead": "256m", + "executor-cores": 1, + "max-executors": 25, + "soft-errors": "true", + "stac-version": "1.1", + "python-memory": "2500m", + "logging-threshold": "info" + }, + "parameters": [ + { + "name": "spatial_extent", + "description": "The AOI should be set as an openEO BBOX dict. It defines the boundaries of the area of interest.\n The coordinates are given in the order of west, south, east, north in EPSG:3035. Please make sure to pass the coordinates in meter and not in degree.", + "schema": { + "title": "Bounding Box", + "type": "object", + "subtype": "bounding-box", + "required": [ + "west", + "south", + "east", + "north" + ], + "properties": { + "west": { + "description": "West (lower left corner, coordinate axis 1).", + "type": "number" + }, + "south": { + "description": "South (lower left corner, coordinate axis 2).", + "type": "number" + }, + "east": { + "description": "East (upper right corner, coordinate axis 1).", + "type": "number" + }, + "north": { + "description": "North (upper right corner, coordinate axis 2).", + "type": "number" + }, + "crs": { + "description": "Coordinate reference system of the extent, specified as as [EPSG code](http://www.epsg-registry.org/) or [WKT2 CRS string](http://docs.opengeospatial.org/is/18-010r7/18-010r7.html).", + "anyOf": [ + { + "title": "EPSG Code", + "type": "integer", + "subtype": "epsg-code", + "minimum": 1000, + "examples": [ + 3035 ] - }, - "default": "month", - "optional": true - }, - { - "name": "temp_aggregator", - "description": "The temporal aggregation function. Please have a look at openeo documentation of the process aggregate_temporal_period for more information", - "schema": { + }, + { + "title": "WKT2", "type": "string", - "enum": [ - "min", - "max", - "mean", - "median" - ] - }, - "default": "mean", - "optional": true - }, - { - "name": "epsg", - "description": "The EPSG is set to 3035 by default.", - "schema": { - "type": "number" - }, - "default": 3035, - "optional": true + "subtype": "wkt2-definition" + } + ], + "default": 3035 + } } - ] + } + }, + { + "name": "start_date", + "description": "Start date of the observation period in format YYYY-MM-DD.", + "schema": { + "type": "string" + } + }, + { + "name": "end_date", + "description": "End date of the observation period in format YYYY-MM-DD.", + "schema": { + "type": "string" + } + }, + { + "name": "binning_period", + "description": "The temporal binning period. Please have a look at openeo documentation of the process aggregate_temporal_period for more information", + "schema": { + "type": "string", + "enum": [ + "day", + "week", + "dekad", + "month", + "season", + "year" + ] + }, + "default": "month", + "optional": true + }, + { + "name": "temp_aggregator", + "description": "The temporal aggregation function. Please have a look at openeo documentation of the process aggregate_temporal_period for more information", + "schema": { + "type": "string", + "enum": [ + "min", + "max", + "mean", + "median" + ] + }, + "default": "mean", + "optional": true + }, + { + "name": "epsg", + "description": "The EPSG is set to 3035 by default.", + "schema": { + "type": "number" + }, + "default": 3035, + "optional": true + } + ] } \ No newline at end of file diff --git a/algorithm_catalog/obsgession/udp_obsgession_w23_lai/records/udp_obsgession_w23_lai.json b/algorithm_catalog/obsgession/udp_obsgession_w23_lai/records/udp_obsgession_w23_lai.json index fb6a78515..a89ff3920 100644 --- a/algorithm_catalog/obsgession/udp_obsgession_w23_lai/records/udp_obsgession_w23_lai.json +++ b/algorithm_catalog/obsgession/udp_obsgession_w23_lai/records/udp_obsgession_w23_lai.json @@ -101,7 +101,7 @@ "rel": "notebook", "type": "application/x-ipynb+json", "title": "Example Jupyter Notebook to calculate the LAI products", - "href": "https://raw.githubusercontent.com/ESA-APEx/apex_algorithms/refs/heads/obsgession_lai/algorithm_catalog/obsgession/udp_obsgession_w23_lai/notebooks/execute-udp.ipynb" + "href": "https://raw.githubusercontent.com/ESA-APEx/apex_algorithms/refs/heads/obsgession_lai/algorithm_catalog/obsgession/udp_obsgession_w23_lai/notebooks/execute-obsgession-lai-udp.ipynb" }, { "rel": "example-output",