{ "cells": [ { "cell_type": "markdown", "id": "95b55d06-3772-4f2c-bbe3-49278d74ce66", "metadata": { "tags": [] }, "source": [ "# Demo of data cube functionalities: Ozone hole size computation\n", "Here we demonstrate how to analyse the ozone hole area as a function of time on the basis of Sentinel 5P/TROPOMI-observations using EOC data cube functionalities. " ] }, { "cell_type": "markdown", "id": "bfcc83d2-dd7d-4b8b-b5cf-262991f6c8b6", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "## Do some preparation (only need to be done once for each environment)." ] }, { "cell_type": "code", "execution_count": 12, "id": "665851e2-98aa-42e4-9aa6-e0b19deb152d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: pystac_client in ./py-env-inpuls/lib/python3.8/site-packages (0.7.5)\n", "Requirement already satisfied: pystac[validation]>=1.8.2 in ./py-env-inpuls/lib/python3.8/site-packages (from pystac_client) (1.8.4)\n", "Requirement already satisfied: requests>=2.28.2 in ./py-env-inpuls/lib/python3.8/site-packages (from pystac_client) (2.31.0)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in ./py-env-inpuls/lib/python3.8/site-packages (from pystac_client) (2.8.2)\n", "Requirement already satisfied: importlib-resources>=5.12.0; python_version < \"3.9\" in ./py-env-inpuls/lib/python3.8/site-packages (from pystac[validation]>=1.8.2->pystac_client) (6.1.0)\n", "Requirement already satisfied: jsonschema~=4.18; extra == \"validation\" in ./py-env-inpuls/lib/python3.8/site-packages (from pystac[validation]>=1.8.2->pystac_client) (4.19.1)\n", "Requirement already satisfied: idna<4,>=2.5 in ./py-env-inpuls/lib/python3.8/site-packages (from requests>=2.28.2->pystac_client) (3.4)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in ./py-env-inpuls/lib/python3.8/site-packages (from requests>=2.28.2->pystac_client) (2.0.6)\n", "Requirement already satisfied: certifi>=2017.4.17 in ./py-env-inpuls/lib/python3.8/site-packages (from requests>=2.28.2->pystac_client) (2023.7.22)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in ./py-env-inpuls/lib/python3.8/site-packages (from requests>=2.28.2->pystac_client) (3.3.0)\n", "Requirement already satisfied: six>=1.5 in ./py-env-inpuls/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pystac_client) (1.16.0)\n", "Requirement already satisfied: zipp>=3.1.0; python_version < \"3.10\" in ./py-env-inpuls/lib/python3.8/site-packages (from importlib-resources>=5.12.0; python_version < \"3.9\"->pystac[validation]>=1.8.2->pystac_client) (3.17.0)\n", "Requirement already satisfied: referencing>=0.28.4 in ./py-env-inpuls/lib/python3.8/site-packages (from jsonschema~=4.18; extra == \"validation\"->pystac[validation]>=1.8.2->pystac_client) (0.30.2)\n", "Requirement already satisfied: pkgutil-resolve-name>=1.3.10; python_version < \"3.9\" in ./py-env-inpuls/lib/python3.8/site-packages (from jsonschema~=4.18; extra == \"validation\"->pystac[validation]>=1.8.2->pystac_client) (1.3.10)\n", "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in ./py-env-inpuls/lib/python3.8/site-packages (from jsonschema~=4.18; extra == \"validation\"->pystac[validation]>=1.8.2->pystac_client) (2023.7.1)\n", "Requirement already satisfied: rpds-py>=0.7.1 in ./py-env-inpuls/lib/python3.8/site-packages (from jsonschema~=4.18; extra == \"validation\"->pystac[validation]>=1.8.2->pystac_client) (0.10.4)\n", "Requirement already satisfied: attrs>=22.2.0 in ./py-env-inpuls/lib/python3.8/site-packages (from jsonschema~=4.18; extra == \"validation\"->pystac[validation]>=1.8.2->pystac_client) (23.1.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install pystac_client" ] }, { "cell_type": "code", "execution_count": 10, "id": "68bb76e0-df73-4ccc-9aff-0652f75dafe1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting odc.stac\n", " Downloading odc_stac-0.3.6-py3-none-any.whl (56 kB)\n", "\u001b[K |████████████████████████████████| 56 kB 1.6 MB/s eta 0:00:011\n", "\u001b[?25hCollecting dask[array]\n", " Downloading dask-2023.5.0-py3-none-any.whl (1.2 MB)\n", "\u001b[K |████████████████████████████████| 1.2 MB 6.1 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: pystac<2,>=1.0.0 in ./py-env-inpuls/lib/python3.8/site-packages (from odc.stac) (1.8.4)\n", "Collecting toolz\n", " Using cached toolz-0.12.0-py3-none-any.whl (55 kB)\n", "Collecting rasterio!=1.3.0,!=1.3.1,>=1.0.0\n", " Downloading rasterio-1.3.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (21.3 MB)\n", "\u001b[K |████████████████████████████████| 21.3 MB 83.5 MB/s eta 0:00:01\n", "\u001b[?25hCollecting pandas\n", " Using cached pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.4 MB)\n", "Collecting xarray>=0.19\n", " Using cached xarray-2023.1.0-py3-none-any.whl (973 kB)\n", "Collecting affine\n", " Using cached affine-2.4.0-py3-none-any.whl (15 kB)\n", "Collecting numpy>=1.20.0\n", " Downloading numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.3 MB)\n", "\u001b[K |████████████████████████████████| 17.3 MB 87.9 MB/s eta 0:00:01\n", "\u001b[?25hCollecting odc-geo>=0.3.0\n", " Downloading odc_geo-0.4.1-py3-none-any.whl (122 kB)\n", "\u001b[K |████████████████████████████████| 122 kB 94.0 MB/s eta 0:00:01\n", "\u001b[?25hCollecting pyyaml>=5.3.1\n", " Downloading PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (736 kB)\n", "\u001b[K |████████████████████████████████| 736 kB 65.5 MB/s eta 0:00:01\n", "\u001b[?25hCollecting partd>=1.2.0\n", " Downloading partd-1.4.1-py3-none-any.whl (18 kB)\n", "Collecting click>=8.0\n", " Downloading click-8.1.7-py3-none-any.whl (97 kB)\n", "\u001b[K |████████████████████████████████| 97 kB 30.7 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: packaging>=20.0 in ./py-env-inpuls/lib/python3.8/site-packages (from dask[array]->odc.stac) (23.2)\n", "Collecting cloudpickle>=1.5.0\n", " Using cached cloudpickle-2.2.1-py3-none-any.whl (25 kB)\n", "Requirement already satisfied: importlib-metadata>=4.13.0 in ./py-env-inpuls/lib/python3.8/site-packages (from dask[array]->odc.stac) (6.8.0)\n", "Collecting fsspec>=2021.09.0\n", " Downloading fsspec-2023.9.2-py3-none-any.whl (173 kB)\n", "\u001b[K |████████████████████████████████| 173 kB 97.2 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: python-dateutil>=2.7.0 in ./py-env-inpuls/lib/python3.8/site-packages (from pystac<2,>=1.0.0->odc.stac) (2.8.2)\n", "Requirement already satisfied: importlib-resources>=5.12.0; python_version < \"3.9\" in ./py-env-inpuls/lib/python3.8/site-packages (from pystac<2,>=1.0.0->odc.stac) (6.1.0)\n", "Requirement already satisfied: setuptools in ./py-env-inpuls/lib/python3.8/site-packages (from rasterio!=1.3.0,!=1.3.1,>=1.0.0->odc.stac) (44.0.0)\n", "Requirement already satisfied: certifi in ./py-env-inpuls/lib/python3.8/site-packages (from rasterio!=1.3.0,!=1.3.1,>=1.0.0->odc.stac) (2023.7.22)\n", "Requirement already satisfied: attrs in ./py-env-inpuls/lib/python3.8/site-packages (from rasterio!=1.3.0,!=1.3.1,>=1.0.0->odc.stac) (23.1.0)\n", "Collecting cligj>=0.5\n", " Using cached cligj-0.7.2-py3-none-any.whl (7.1 kB)\n", "Collecting snuggs>=1.4.1\n", " Using cached snuggs-1.4.7-py3-none-any.whl (5.4 kB)\n", "Collecting click-plugins\n", " Using cached click_plugins-1.1.1-py2.py3-none-any.whl (7.5 kB)\n", "Collecting pytz>=2020.1\n", " Downloading pytz-2023.3.post1-py2.py3-none-any.whl (502 kB)\n", "\u001b[K |████████████████████████████████| 502 kB 107.9 MB/s eta 0:00:01\n", "\u001b[?25hCollecting tzdata>=2022.1\n", " Using cached tzdata-2023.3-py2.py3-none-any.whl (341 kB)\n", "Collecting pyproj>=3.0.0\n", " Downloading pyproj-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)\n", "\u001b[K |████████████████████████████████| 7.8 MB 116.5 MB/s eta 0:00:01\n", "\u001b[?25hCollecting cachetools\n", " Downloading cachetools-5.3.1-py3-none-any.whl (9.3 kB)\n", "Collecting shapely\n", " Downloading shapely-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB)\n", "\u001b[K |████████████████████████████████| 2.3 MB 151.8 MB/s eta 0:00:01\n", "\u001b[?25hCollecting locket\n", " Using cached locket-1.0.0-py2.py3-none-any.whl (4.4 kB)\n", "Requirement already satisfied: zipp>=0.5 in ./py-env-inpuls/lib/python3.8/site-packages (from importlib-metadata>=4.13.0->dask[array]->odc.stac) (3.17.0)\n", "Requirement already satisfied: six>=1.5 in ./py-env-inpuls/lib/python3.8/site-packages (from python-dateutil>=2.7.0->pystac<2,>=1.0.0->odc.stac) (1.16.0)\n", "Collecting pyparsing>=2.1.6\n", " Downloading pyparsing-3.1.1-py3-none-any.whl (103 kB)\n", "\u001b[K |████████████████████████████████| 103 kB 98.3 MB/s eta 0:00:01\n", "\u001b[?25hInstalling collected packages: pyyaml, toolz, locket, partd, click, cloudpickle, fsspec, numpy, dask, cligj, affine, pyparsing, snuggs, click-plugins, rasterio, pytz, tzdata, pandas, xarray, pyproj, cachetools, shapely, odc-geo, odc.stac\n", "Successfully installed affine-2.4.0 cachetools-5.3.1 click-8.1.7 click-plugins-1.1.1 cligj-0.7.2 cloudpickle-2.2.1 dask-2023.5.0 fsspec-2023.9.2 locket-1.0.0 numpy-1.24.4 odc-geo-0.4.1 odc.stac pandas-2.0.3 partd-1.4.1 pyparsing-3.1.1 pyproj-3.5.0 pytz-2023.3.post1 pyyaml-6.0.1 rasterio-1.3.8 shapely-2.0.1 snuggs-1.4.7 toolz-0.12.0 tzdata-2023.3 xarray-2023.1.0\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install odc.stac" ] }, { "cell_type": "code", "execution_count": 11, "id": "c612ed95-b50e-4feb-bdce-ffac16049460", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: xarray in ./py-env-inpuls/lib/python3.8/site-packages (2023.1.0)\n", "Requirement already satisfied: numpy>=1.20 in ./py-env-inpuls/lib/python3.8/site-packages (from xarray) (1.24.4)\n", "Requirement already satisfied: pandas>=1.3 in ./py-env-inpuls/lib/python3.8/site-packages (from xarray) (2.0.3)\n", "Requirement already satisfied: packaging>=21.3 in ./py-env-inpuls/lib/python3.8/site-packages (from xarray) (23.2)\n", "Requirement already satisfied: pytz>=2020.1 in ./py-env-inpuls/lib/python3.8/site-packages (from pandas>=1.3->xarray) (2023.3.post1)\n", "Requirement already satisfied: tzdata>=2022.1 in ./py-env-inpuls/lib/python3.8/site-packages (from pandas>=1.3->xarray) (2023.3)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in ./py-env-inpuls/lib/python3.8/site-packages (from pandas>=1.3->xarray) (2.8.2)\n", "Requirement already satisfied: six>=1.5 in ./py-env-inpuls/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas>=1.3->xarray) (1.16.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install xarray" ] }, { "cell_type": "code", "execution_count": 14, "id": "0f7de7ae-f018-4fdb-a50f-532d5ff111d1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: numpy in ./py-env-inpuls/lib/python3.8/site-packages (1.24.4)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install numpy" ] }, { "cell_type": "code", "execution_count": 14, "id": "23d6c418-97fb-456d-a57c-bcaea2f8d7f7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting matplotlib\n", " Downloading matplotlib-3.7.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (9.2 MB)\n", "\u001b[K |████████████████████████████████| 9.2 MB 3.4 MB/s eta 0:00:01\n", "\u001b[?25hCollecting fonttools>=4.22.0\n", " Downloading fonttools-4.43.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB)\n", "\u001b[K |████████████████████████████████| 4.6 MB 153.1 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: packaging>=20.0 in ./py-env-inpuls/lib/python3.8/site-packages (from matplotlib) (23.2)\n", "Collecting cycler>=0.10\n", " Downloading cycler-0.12.0-py3-none-any.whl (8.2 kB)\n", "Requirement already satisfied: python-dateutil>=2.7 in ./py-env-inpuls/lib/python3.8/site-packages (from matplotlib) (2.8.2)\n", "Collecting kiwisolver>=1.0.1\n", " Downloading kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.2 MB)\n", "\u001b[K |████████████████████████████████| 1.2 MB 55.4 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: importlib-resources>=3.2.0; python_version < \"3.10\" in ./py-env-inpuls/lib/python3.8/site-packages (from matplotlib) (6.1.0)\n", "Requirement already satisfied: pyparsing>=2.3.1 in ./py-env-inpuls/lib/python3.8/site-packages (from matplotlib) (3.1.1)\n", "Requirement already satisfied: numpy<2,>=1.20 in ./py-env-inpuls/lib/python3.8/site-packages (from matplotlib) (1.24.4)\n", "Collecting pillow>=6.2.0\n", " Downloading Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.5 MB)\n", "\u001b[K |████████████████████████████████| 3.5 MB 85.0 MB/s eta 0:00:01\n", "\u001b[?25hCollecting contourpy>=1.0.1\n", " Downloading contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (301 kB)\n", "\u001b[K |████████████████████████████████| 301 kB 135.6 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: six>=1.5 in ./py-env-inpuls/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n", "Requirement already satisfied: zipp>=3.1.0; python_version < \"3.10\" in ./py-env-inpuls/lib/python3.8/site-packages (from importlib-resources>=3.2.0; python_version < \"3.10\"->matplotlib) (3.17.0)\n", "Installing collected packages: fonttools, cycler, kiwisolver, pillow, contourpy, matplotlib\n", "Successfully installed contourpy-1.1.1 cycler-0.12.0 fonttools-4.43.0 kiwisolver-1.4.5 matplotlib-3.7.3 pillow-10.0.1\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install matplotlib" ] }, { "cell_type": "markdown", "id": "7f402fff-3dd8-4bde-a31c-37cc7a58d208", "metadata": { "tags": [] }, "source": [ "## Let's start with some relevant settings\n", "
\n", "To identify the relevant STAC collection, visit https://geoservice.dlr.de/eoc/ogc/stac with your browser.\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "id": "5231736c-210e-43fc-81c3-0f3a72ac2faf", "metadata": { "tags": [] }, "outputs": [], "source": [ "stacapi_endpoint = \"https://geoservice.dlr.de/eoc/ogc/stac/\"\n", "collections = [\"S5P_TROPOMI_L3_P1D_O3\"]\n", "\n", "bbox = [-180, -90, 180, -30]\n", "dates_from_to = [\"2023-08-01\", \"2023-10-04\"]\n", "resolution=0.09 # 0.09 deg is original product resolution\n", "\n", "earth_circumference_poles = 40007.863 # km\n", "earth_circumference_eq = 40075.017 # km\n", "\n", "ozone_threshold = 220.0 # DU" ] }, { "cell_type": "markdown", "id": "2eacdeb5-c869-4de4-b979-fd92fbc38546", "metadata": { "tags": [] }, "source": [ "## Now let's connect to the STAC catalog\n", "\n", "
\n", "Import library and connect to the EOC STAC catalog service.\n", "\n", "This is just a \"connect\", no data is going to be downloaded.\n", "
" ] }, { "cell_type": "code", "execution_count": 2, "id": "126230ed-aae3-4db6-8138-6dfc7fc04306", "metadata": { "tags": [] }, "outputs": [], "source": [ "from pystac_client import Client" ] }, { "cell_type": "code", "execution_count": 3, "id": "98eab293-19f9-4ed0-8cfe-9abcf54780bc", "metadata": { "scrolled": true }, "outputs": [], "source": [ "catalog = Client.open(\n", " url=stacapi_endpoint\n", ")" ] }, { "cell_type": "markdown", "id": "67def331-85d6-43e8-ba0b-44291bd7b988", "metadata": { "tags": [] }, "source": [ "## Let's discover datasets\n", "
\n", "Data discovery is performed according to our settings\n", "
" ] }, { "cell_type": "code", "execution_count": 4, "id": "d9de5aa3-6716-4e9b-83fd-31ab145fc0ce", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 59.9 ms, sys: 0 ns, total: 59.9 ms\n", "Wall time: 2.75 s\n" ] } ], "source": [ "%%time\n", "\n", "stac_items = catalog.search(\n", " collections=collections, \n", " datetime=dates_from_to, \n", " method=\"GET\", \n", " filter_lang=\"cql2-text\",\n", " max_items=1000\n", ").item_collection()" ] }, { "cell_type": "code", "execution_count": 5, "id": "5be92994-7839-4c02-9077-6da90951b5e4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<pystac.item_collection.ItemCollection object at 0x7feca5a58af0>" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stac_items" ] }, { "cell_type": "markdown", "id": "85505e99-7769-4ecf-843e-206019149dbd", "metadata": {}, "source": [ "*--> Now we identified the relevant datasets which we need for our research.*" ] }, { "cell_type": "markdown", "id": "33de29f2-33c2-4308-8364-5003894e794e", "metadata": { "tags": [] }, "source": [ "## Load the data to local storage\n", "\n", "
\n", "Now the data of the identifed data sets is going to be downloaded to the local client.\n", "\n", "You con concentrate on your work. All ugly work such as \n", "- re-projection or\n", "- area-slicing \n", " \n", "is done on the server.
" ] }, { "cell_type": "code", "execution_count": 6, "id": "ff2aacbb-ff37-46d9-aa87-9d019d124cf9", "metadata": {}, "outputs": [], "source": [ "from odc.stac import stac_load\n", "import xarray as xr" ] }, { "cell_type": "code", "execution_count": 7, "id": "8bdaf9b1-dff8-4cc4-b6a0-3d1cbaeb7c1d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Data is extracted on the server and downloaded to local storage.\n", "CPU times: user 10.2 s, sys: 12 s, total: 22.2 s\n", "Wall time: 2min 23s\n" ] } ], "source": [ "%%time\n", "\n", "ozone_column = stac_load(\n", " stac_items,\n", " bands=[\"o3\"],\n", " crs=\"EPSG:4326\",\n", " resolution=resolution,\n", " lon=(bbox[0], bbox[2]),\n", " lat=(bbox[1], bbox[3]),)\n", "\n", "print (\"Data is extracted on the server and downloaded to local storage.\")" ] }, { "cell_type": "code", "execution_count": 8, "id": "8aebca6b-657f-4532-812a-a2e904d6757a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset>\n",
       "Dimensions:      (latitude: 667, longitude: 4000, time: 65)\n",
       "Coordinates:\n",
       "  * latitude     (latitude) float64 -30.02 -30.11 -30.2 ... -89.78 -89.86 -89.95\n",
       "  * longitude    (longitude) float64 -180.0 -179.9 -179.8 ... 179.8 179.9 180.0\n",
       "    spatial_ref  int32 4326\n",
       "  * time         (time) datetime64[ns] 2023-08-01 2023-08-02 ... 2023-10-04\n",
       "Data variables:\n",
       "    o3           (time, latitude, longitude) float32 9.969e+36 ... 124.3
" ], "text/plain": [ "\n", "Dimensions: (latitude: 667, longitude: 4000, time: 65)\n", "Coordinates:\n", " * latitude (latitude) float64 -30.02 -30.11 -30.2 ... -89.78 -89.86 -89.95\n", " * longitude (longitude) float64 -180.0 -179.9 -179.8 ... 179.8 179.9 180.0\n", " spatial_ref int32 4326\n", " * time (time) datetime64[ns] 2023-08-01 2023-08-02 ... 2023-10-04\n", "Data variables:\n", " o3 (time, latitude, longitude) float32 9.969e+36 ... 124.3" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ozone_column" ] }, { "cell_type": "markdown", "id": "186fd469-c82d-472b-bcd5-61fbb2ce2bef", "metadata": { "tags": [] }, "source": [ "## Now do some auxiliary calculations: Compute area per pixel\n", "
\n", "Compute the area in square kilometers per pixel in L3-satellite-data projection (EPSG:4326). \n", "\n", "Area $a(\\lambda, \\phi)$ is based on the projection of the satellite L3 data as retrieved from the EOC Geoservice:\n", "\n", "$a(\\lambda, \\phi) = d_x(equator) \\cdot \\cos(\\phi) \\cdot d_y \\cdot resolution$\n", "
" ] }, { "cell_type": "code", "execution_count": 9, "id": "271a1b98-195f-46bb-871b-f9786826ea6c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (latitude: 667, longitude: 4000)>\n",
       "array([[8.67688927e+01, 8.67688927e+01, 8.67688927e+01, ...,\n",
       "        8.67688927e+01, 8.67688927e+01, 8.67688927e+01],\n",
       "       [8.66900474e+01, 8.66900474e+01, 8.66900474e+01, ...,\n",
       "        8.66900474e+01, 8.66900474e+01, 8.66900474e+01],\n",
       "       [8.66109882e+01, 8.66109882e+01, 8.66109882e+01, ...,\n",
       "        8.66109882e+01, 8.66109882e+01, 8.66109882e+01],\n",
       "       ...,\n",
       "       [3.93511888e-01, 3.93511888e-01, 3.93511888e-01, ...,\n",
       "        3.93511888e-01, 3.93511888e-01, 3.93511888e-01],\n",
       "       [2.36107521e-01, 2.36107521e-01, 2.36107521e-01, ...,\n",
       "        2.36107521e-01, 2.36107521e-01, 2.36107521e-01],\n",
       "       [7.87025717e-02, 7.87025717e-02, 7.87025717e-02, ...,\n",
       "        7.87025717e-02, 7.87025717e-02, 7.87025717e-02]])\n",
       "Coordinates:\n",
       "  * latitude   (latitude) float64 -30.02 -30.11 -30.2 ... -89.78 -89.86 -89.95\n",
       "  * longitude  (longitude) float64 -180.0 -179.9 -179.8 ... 179.8 179.9 180.0
" ], "text/plain": [ "\n", "array([[8.67688927e+01, 8.67688927e+01, 8.67688927e+01, ...,\n", " 8.67688927e+01, 8.67688927e+01, 8.67688927e+01],\n", " [8.66900474e+01, 8.66900474e+01, 8.66900474e+01, ...,\n", " 8.66900474e+01, 8.66900474e+01, 8.66900474e+01],\n", " [8.66109882e+01, 8.66109882e+01, 8.66109882e+01, ...,\n", " 8.66109882e+01, 8.66109882e+01, 8.66109882e+01],\n", " ...,\n", " [3.93511888e-01, 3.93511888e-01, 3.93511888e-01, ...,\n", " 3.93511888e-01, 3.93511888e-01, 3.93511888e-01],\n", " [2.36107521e-01, 2.36107521e-01, 2.36107521e-01, ...,\n", " 2.36107521e-01, 2.36107521e-01, 2.36107521e-01],\n", " [7.87025717e-02, 7.87025717e-02, 7.87025717e-02, ...,\n", " 7.87025717e-02, 7.87025717e-02, 7.87025717e-02]])\n", "Coordinates:\n", " * latitude (latitude) float64 -30.02 -30.11 -30.2 ... -89.78 -89.86 -89.95\n", " * longitude (longitude) float64 -180.0 -179.9 -179.8 ... 179.8 179.9 180.0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import math\n", "import numpy as np\n", "\n", "nlat = len(ozone_column.latitude)\n", "nlon = len(ozone_column.longitude)\n", "\n", "area = np.zeros((nlat,nlon), dtype=np.double)\n", "\n", "extend_ns = (earth_circumference_poles/2.0) / 180. * resolution\n", "for ilat in range(nlat):\n", " extend_ew = earth_circumference_eq * math.cos(ozone_column.latitude[ilat]/180.*math.pi) / 360. * resolution\n", " for ilon in range(nlon):\n", " area[ilat,ilon] = extend_ns * extend_ew\n", "\n", "\n", "area_xr = xr.DataArray(area, coords= {\"latitude\": ozone_column.latitude, \"longitude\": ozone_column.longitude})\n", "area_xr" ] }, { "cell_type": "markdown", "id": "818ac7d6-279f-44ce-a659-31891aa2918c", "metadata": { "tags": [] }, "source": [ "## Mask out all ozone observations >= 220 DU (WMO criterium for ozone hole condition)\n", "\n", "
\n", "Only cells with ozone columns < 220 DU are remaining.\n", "
" ] }, { "cell_type": "code", "execution_count": 10, "id": "c49571e0-cc9a-4018-891a-427dc8925e6c", "metadata": {}, "outputs": [], "source": [ "ozone_hole = ozone_column.o3.where(ozone_column.o3 < ozone_threshold, 0) " ] }, { "cell_type": "markdown", "id": "3d72204b-b1f8-4378-8370-32f21033c232", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "## Prepare plotting of timeseries\n", "\n", "
\n", "Use \"Geopandas\" timeseries processing.\n", "\n", "$ozonehole = \\sum_{ij} a_{ij} \\mathrm{\\ where\\ } ozone_{ij} < 220 DU$\n", "
" ] }, { "cell_type": "code", "execution_count": 11, "id": "0f8b56ed-091a-46e9-a821-70790e084934", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2.0.3'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "pd.__version__" ] }, { "cell_type": "code", "execution_count": 12, "id": "736f97e0-3886-483c-a541-68c6eaef47c1", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datetimesize_ozone_holemean_O3_value
02023-08-010.4657791.0120476
12023-08-020.7666811.6748397
22023-08-030.1526260.35741448
32023-08-040.3093300.70260465
42023-08-051.2827632.7660265
............
602023-09-3021.62647758.531498
612023-10-0122.01464458.67384
622023-10-0221.92425256.59337
632023-10-0321.75353955.88885
642023-10-0421.81365856.404713
\n", "

65 rows × 3 columns

\n", "
" ], "text/plain": [ " datetime size_ozone_hole mean_O3_value\n", "0 2023-08-01 0.465779 1.0120476\n", "1 2023-08-02 0.766681 1.6748397\n", "2 2023-08-03 0.152626 0.35741448\n", "3 2023-08-04 0.309330 0.70260465\n", "4 2023-08-05 1.282763 2.7660265\n", ".. ... ... ...\n", "60 2023-09-30 21.626477 58.531498\n", "61 2023-10-01 22.014644 58.67384\n", "62 2023-10-02 21.924252 56.59337\n", "63 2023-10-03 21.753539 55.88885\n", "64 2023-10-04 21.813658 56.404713\n", "\n", "[65 rows x 3 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "daterange = np.array(ozone_column.time)\n", "cols = [\"datetime\", 'size_ozone_hole', 'mean_O3_value']\n", "\n", "result = []\n", "for i in range(0, len(ozone_hole.time)):\n", " ozone_hole_area = area_xr.where(ozone_hole.isel(time=i) != 0, np.nan)\n", " size_hole_in_km2 = np.array(ozone_hole_area.sum())\n", "\n", " result.append([daterange[i], size_hole_in_km2.round(2)/1000000, np.array(ozone_hole.isel(time=i).mean())])\n", " \n", "df_ozone_hole = pd.DataFrame(result, columns=cols)\n", "df_ozone_hole" ] }, { "cell_type": "markdown", "id": "c6b8548c-2cb6-4982-8f36-3b240343be4d", "metadata": { "tags": [] }, "source": [ "## Now create the timeseries plot: Ozone hole area as a function of time from S5P/TROPOMI observations" ] }, { "cell_type": "code", "execution_count": 15, "id": "480cdbb1-c409-43db-a439-c2e88d44636a", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "df_ozone_hole.plot(\n", " x ='datetime', \n", " y='size_ozone_hole', \n", " legend=None, \n", " kind='line', marker='o', markersize = 4, lw = 2, \n", " title = \"Area below 220 DU in the Southern Hemisphere \\n (calculated witpd.__version__h INPULS L3 S5P Tropomi O3 data)\")\n", "plt.xlabel('')\n", "plt.ylabel('Area [in million km²]')\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 16, "id": "21630320-4a0e-4f6b-abea-de33eb9bdfa8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2.0.3'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.__version__" ] }, { "cell_type": "markdown", "id": "915ee983-73d6-4f4f-badf-9c2e700390b7", "metadata": { "tags": [] }, "source": [ "## Now let's compare both algorithms\n", "\n", "
\n", "Compare information on ozone hole size derived from STAC metadata with results obtained by our approach.\n", "
" ] }, { "cell_type": "code", "execution_count": 17, "id": "4c67312c-e32c-4f05-a263-058a5a6b2ef3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 2023-10-04T00:00:00Z 21.81365821 21.798092 0.015566209999999359\n", "1 2023-10-03T00:00:00Z 21.75353934 21.741516 0.012023339999998939\n", "2 2023-10-02T00:00:00Z 21.924252 21.91087 0.013382000000000005\n", "3 2023-10-01T00:00:00Z 22.0146441 21.998634 0.01601010000000258\n", "4 2023-09-30T00:00:00Z 21.62647652 21.609182 0.01729452000000009\n", "5 2023-09-29T00:00:00Z 21.59490387 21.569372 0.025531869999998236\n", "6 2023-09-28T00:00:00Z 21.53040123 21.511862 0.01853922999999824\n", "7 2023-09-27T00:00:00Z 21.56490156 21.548874 0.01602755999999772\n", "8 2023-09-26T00:00:00Z 22.242348030000002 22.225592 0.016756030000003364\n", "9 2023-09-25T00:00:00Z 22.97839471 22.96629 0.01210470999999913\n", "10 2023-09-24T00:00:00Z 22.99205362 22.977142 0.01491161999999946\n", "11 2023-09-23T00:00:00Z 23.71388691 23.701204 0.01268290999999877\n", "12 2023-09-22T00:00:00Z 24.82340027 24.8063 0.01710027000000025\n", "13 2023-09-21T00:00:00Z 24.94365371 24.931174 0.012479710000000921\n", "14 2023-09-20T00:00:00Z 24.30860273 24.290028 0.018574730000000983\n", "15 2023-09-19T00:00:00Z 24.26714173 24.258116 0.009025729999997623\n", "16 2023-09-18T00:00:00Z 24.32961361 24.313756 0.015857609999997635\n", "17 2023-09-17T00:00:00Z 24.63892588 24.625336 0.013589879999997834\n", "18 2023-09-16T00:00:00Z 24.94238184 24.925636 0.01674583999999868\n", "19 2023-09-15T00:00:00Z 24.58374627 24.563414 0.020332269999997266\n", "20 2023-09-14T00:00:00Z 23.58459586 23.56774 0.016855859999999723\n", "21 2023-09-13T00:00:00Z 22.38462178 22.369972 0.014649779999999168\n", "22 2023-09-12T00:00:00Z 21.26123076 21.256984 0.004246760000000904\n", "23 2023-09-11T00:00:00Z 21.37696794 21.34959 0.027377940000000933\n", "24 2023-09-10T00:00:00Z 20.63209118 20.61542 0.016671179999999453\n", "25 2023-09-09T00:00:00Z 20.26761233 20.248928 0.01868432999999925\n", "26 2023-09-08T00:00:00Z 20.08289236 20.061824 0.021068359999997455\n", "27 2023-09-07T00:00:00Z 18.12562798 18.125264 0.0003639799999994864\n", "28 2023-09-06T00:00:00Z 16.50968682 16.488673 0.021013820000000294\n", "29 2023-09-05T00:00:00Z 16.764299859999998 16.752852 0.011447859999996979\n", "30 2023-09-04T00:00:00Z 15.329531509999999 15.316173 0.013358509999999768\n", "31 2023-09-03T00:00:00Z 14.57090406 14.5593 0.011604059999999805\n", "32 2023-09-02T00:00:00Z 14.218300339999999 14.207189 0.011111339999999359\n", "33 2023-09-01T00:00:00Z 13.880201529999999 13.869948 0.010253529999998179\n", "34 2023-08-31T00:00:00Z 13.40134825 13.391728 0.00962024999999933\n", "35 2023-08-30T00:00:00Z 12.92009582 12.911708 0.00838781999999938\n", "36 2023-08-29T00:00:00Z 11.25211635 11.241695 0.010421349999999663\n", "37 2023-08-28T00:00:00Z 10.51394382 10.511693 0.002250820000000431\n", "38 2023-08-27T00:00:00Z 8.350306530000001 8.3479715 0.002335030000001126\n", "39 2023-08-26T00:00:00Z 7.4267835 7.420335 0.006448500000000301\n", "40 2023-08-25T00:00:00Z 6.16378385 6.155645 0.00813884999999992\n", "41 2023-08-24T00:00:00Z 7.24911754 7.2430855 0.006032040000000016\n", "42 2023-08-23T00:00:00Z 8.040478929999999 8.035174 0.00530492999999943\n", "43 2023-08-22T00:00:00Z 7.95010793 7.9435585 0.006549429999999745\n", "44 2023-08-21T00:00:00Z 7.96561571 7.96013 0.005485709999999422\n", "45 2023-08-20T00:00:00Z 7.58378957 7.569694 0.01409557000000028\n", "46 2023-08-19T00:00:00Z 7.82302947 7.805542 0.01748746999999984\n", "47 2023-08-18T00:00:00Z 6.70409821 6.6762045 0.02789370999999985\n", "48 2023-08-17T00:00:00Z 5.59829599 5.58539 0.012905990000000145\n", "49 2023-08-16T00:00:00Z 3.3683885499999997 3.3688898 -0.0005012500000001197\n", "50 2023-08-15T00:00:00Z 1.0793685100000001 1.0776541000000002 0.001714409999999944\n", "51 2023-08-14T00:00:00Z 1.18856969 1.188991 -0.00042130999999989704\n", "52 2023-08-13T00:00:00Z 0.08583116 0.08467602 0.001155139999999999\n", "53 2023-08-12T00:00:00Z 0.36725524 0.36566334 0.0015918999999999794\n", "54 2023-08-11T00:00:00Z 0.00380655 0.0036303438 0.0001762062\n", "55 2023-08-10T00:00:00Z 1.94657355 1.940295 0.006278549999999994\n", "56 2023-08-09T00:00:00Z 1.82784096 nan nan\n", "57 2023-08-08T00:00:00Z 0.91251984 nan nan\n", "58 2023-08-07T00:00:00Z 1.1871813 1.1882566 -0.0010753000000001123\n", "59 2023-08-06T00:00:00Z 2.2433692 2.2385545 0.004814700000000283\n", "60 2023-08-05T00:00:00Z 1.2827634399999999 1.2816968 0.0010666399999998966\n", "61 2023-08-04T00:00:00Z 0.30933042 0.3088396 0.0004908200000000029\n", "62 2023-08-03T00:00:00Z 0.15262583 0.15230022000000001 0.0003256099999999762\n", "63 2023-08-02T00:00:00Z 0.76668055 0.7655955 0.0010850500000000318\n", "64 2023-08-01T00:00:00Z 0.46577913 0.46856656 -0.002787430000000035\n" ] } ], "source": [ "size_ozone_hole_computed = 0\n", "\n", "for i in range(len(stac_items)):\n", " x = stac_items.items[i].properties[\"datetime\"]\n", "\n", " for j in range(len(df_ozone_hole)):\n", " y = df_ozone_hole[\"datetime\"][j].strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n", " # print (x,y)\n", " if x == y:\n", " size_ozone_hole_computed = df_ozone_hole[\"size_ozone_hole\"][j]\n", "\n", " try:\n", " size_ozone_hole_metadata = stac_items.items[i].properties[\"s5p:south_pole_ozone_hole_area\"]\n", " except:\n", " size_ozone_hole_metadata = np.nan\n", " \n", " print (i, stac_items.items[i].properties[\"datetime\"], size_ozone_hole_computed, size_ozone_hole_metadata/1e6, size_ozone_hole_computed-size_ozone_hole_metadata/1e6)" ] }, { "cell_type": "code", "execution_count": null, "id": "853c5feb-c4dd-4538-a827-94af1f883e7f", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "py-env-inpuls", "language": "python", "name": "py-env-inpuls" }, "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.8.10" }, "vscode": { "interpreter": { "hash": "c9cf2cf1fbfea15c12fdef0c7fa448d6ed0052a786563243501b003465a1259e" } } }, "nbformat": 4, "nbformat_minor": 5 }