diff --git a/README.md b/README.md
index f0e31382..1e2d52d1 100644
--- a/README.md
+++ b/README.md
@@ -6,8 +6,6 @@
An open source AI model and interface for Earth.
-# Getting started
-
## Quickstart
Launch into a [JupyterLab](https://jupyterlab.readthedocs.io) environment on
@@ -74,3 +72,26 @@ To train the model:
More options can be found using `python trainer.py fit --help`, or at the
[LightningCLI docs](https://lightning.ai/docs/pytorch/2.1.0/cli/lightning_cli.html).
+
+## Contributing
+
+### Writing documentation
+
+Our Documentation uses [Jupyter Book](https://jupyterbook.org/intro.html).
+
+Install it with:
+```bash
+pip install -U jupyter-book
+```
+
+Then build it with:
+```bash
+jupyter-book build docs/
+```
+
+You can preview the site locally with:
+```bash
+python -m http.server --directory _build/html
+```
+
+There is a GitHub Action on `./github/workflows/deploy-docs.yml` that builds the site and pushes it to GitHub Pages.
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index f5bc0086..00000000
--- a/docs/README.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Clay Model Documentation
-
-This Documentation uses [Jupyter Book](https://jupyterbook.org/intro.html).
-
-Install it with:
-```bash
-pip install -U jupyter-book
-```
-
-Then build it with:
-```bash
-jupyter-book build docs/
-```
-
-You can preview the site locally with:
-```bash
-python -m http.server --directory _build/html
-```
-
-There is a GitHub Action on `./github/workflows/deploy-docs.yml` that builds the site and pushes it to GitHub Pages.
diff --git a/docs/_toc.yml b/docs/_toc.yml
index 276d32b4..3b3b726b 100644
--- a/docs/_toc.yml
+++ b/docs/_toc.yml
@@ -7,25 +7,25 @@ parts:
- caption: Release notes
chapters:
- title: Software release notes
- file: changelog
+ file: release-notes/changelog
- title: Model release notes
- file: specification
+ file: release-notes/specification
- title: Data sampling strategy
- file: data_sampling
+ file: release-notes/data_sampling
- caption: Getting Started
chapters:
- title: Installation
- file: installation
+ file: getting-started/installation
- title: Basic Use
- file: basic_use
+ file: getting-started/basic_use
- caption: Tutorials
chapters:
- title: Clay v1 wall-to-wall example
- file: clay-v1-wall-to-wall
+ file: tutorials/clay-v1-wall-to-wall
- title: Explore embeddings from Clay Encoder
- file: visualize-embeddings
+ file: tutorials/visualize-embeddings
- title: Clay MAE reconstruction
- file: reconstruction
+ file: tutorials/reconstruction
- caption: About Clay
chapters:
- title: GitHub
diff --git a/docs/clay-v1-wall-to-wall.ipynb b/docs/clay-v1-wall-to-wall.ipynb
deleted file mode 100644
index 4dcac9b3..00000000
--- a/docs/clay-v1-wall-to-wall.ipynb
+++ /dev/null
@@ -1,1648 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "0cc5e729-9116-4ec9-bf1e-8346cbccdf7b",
- "metadata": {},
- "source": [
- "## Run Clay v1\n",
- "\n",
- "This notebook shows how to run Clay v1 wall-to-wall, from downloading imagery\n",
- "to training a tiny fine tuning head. This will include the following steps:\n",
- "\n",
- "1. Set a location and date range of interest\n",
- "2. Download Sentinel-2 imagery for this specification\n",
- "3. Load the model checkpoint\n",
- "4. Prepare data into a format for the model\n",
- "5. Run the model on the imagery\n",
- "6. Analyise the model embeddings output using PCA\n",
- "7. Train a Support Vector Machines fine tuning head"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "id": "add63cd9",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Add the repo root to the sys path for the model import below\n",
- "import sys\n",
- "\n",
- "sys.path.append(\"..\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "id": "6a17b8a8-a9c6-4053-833e-de97287fae49",
- "metadata": {},
- "outputs": [],
- "source": [
- "import math\n",
- "\n",
- "import geopandas as gpd\n",
- "import numpy as np\n",
- "import pandas as pd\n",
- "import pystac_client\n",
- "import stackstac\n",
- "import torch\n",
- "import yaml\n",
- "from box import Box\n",
- "from matplotlib import pyplot as plt\n",
- "from rasterio.enums import Resampling\n",
- "from shapely import Point\n",
- "from sklearn import decomposition, svm\n",
- "from stacchip.processors.prechip import normalize_timestamp\n",
- "from torchvision.transforms import v2\n",
- "\n",
- "from src.model import ClayMAEModule"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "beac6394-9762-422b-9f5d-82d226018c0c",
- "metadata": {},
- "source": [
- "### Specify location and date of interest\n",
- "In this example we will use a location in Portugal where a forest fire happened. We will run the model over the time period of the fire and analyse the model embeddings."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "id": "08d7787d-1506-4de7-89dc-c1054910acf7",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Point over Monchique Portugal\n",
- "lat, lon = 37.30939, -8.57207\n",
- "\n",
- "# Dates of a large forest fire\n",
- "start = \"2018-07-01\"\n",
- "end = \"2018-09-01\""
- ]
- },
- {
- "cell_type": "markdown",
- "id": "2bd226c9-003b-4867-a64a-8ae887e7e20a",
- "metadata": {},
- "source": [
- "### Get data from STAC catalog\n",
- "\n",
- "Based on the location and date we can obtain a stack of imagery using stackstac. Let's start with finding the STAC items we want to analyse."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "id": "2e80743c-7c77-459b-9984-f6c26cdff549",
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/home/tam/apps/miniforge3/envs/claymodel/lib/python3.11/site-packages/pystac_client/item_search.py:850: FutureWarning: get_all_items() is deprecated, use item_collection() instead.\n",
- " warnings.warn(\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Found 12 items\n"
- ]
- }
- ],
- "source": [
- "STAC_API = \"https://earth-search.aws.element84.com/v1\"\n",
- "COLLECTION = \"sentinel-2-l2a\"\n",
- "\n",
- "# Search the catalogue\n",
- "catalog = pystac_client.Client.open(STAC_API)\n",
- "search = catalog.search(\n",
- " collections=[COLLECTION],\n",
- " datetime=f\"{start}/{end}\",\n",
- " bbox=(lon - 1e-5, lat - 1e-5, lon + 1e-5, lat + 1e-5),\n",
- " max_items=100,\n",
- " query={\"eo:cloud_cover\": {\"lt\": 80}},\n",
- ")\n",
- "\n",
- "all_items = search.get_all_items()\n",
- "\n",
- "# Reduce to one per date (there might be some duplicates\n",
- "# based on the location)\n",
- "items = []\n",
- "dates = []\n",
- "for item in all_items:\n",
- " if item.datetime.date() not in dates:\n",
- " items.append(item)\n",
- " dates.append(item.datetime.date())\n",
- "\n",
- "print(f\"Found {len(items)} items\")"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "5b7c68ae-7c8a-446a-8bc7-5afba70183c2",
- "metadata": {},
- "source": [
- "### Create a bounding box around the point of interest\n",
- "\n",
- "This is needed in the projection of the data so that we can generate image chips of the right size."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "id": "0f3573b5-5a00-47d9-a648-5c4d7cd2c996",
- "metadata": {},
- "outputs": [],
- "source": [
- "# Extract coordinate system from first item\n",
- "epsg = items[0].properties[\"proj:epsg\"]\n",
- "\n",
- "# Convert point of interest into the image projection\n",
- "# (assumes all images are in the same projection)\n",
- "poidf = gpd.GeoDataFrame(\n",
- " pd.DataFrame(),\n",
- " crs=\"EPSG:4326\",\n",
- " geometry=[Point(lon, lat)],\n",
- ").to_crs(epsg)\n",
- "\n",
- "coords = poidf.iloc[0].geometry.coords[0]\n",
- "\n",
- "# Create bounds in projection\n",
- "size = 256\n",
- "gsd = 10\n",
- "bounds = (\n",
- " coords[0] - (size * gsd) // 2,\n",
- " coords[1] - (size * gsd) // 2,\n",
- " coords[0] + (size * gsd) // 2,\n",
- " coords[1] + (size * gsd) // 2,\n",
- ")"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "bbbd3f67-5f2c-46dc-9ee1-2ef1f50fa032",
- "metadata": {},
- "source": [
- "### Retrieve the imagery data."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "id": "8b8d3824-e48c-4f9d-9c7b-181c0800f96f",
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Working with stack of size (12, 4, 256, 256)\n"
- ]
- },
- {
- "data": {
- "text/html": [
- "
\n",
- "
<xarray.DataArray 'stackstac-7cbad7c129d678be53c9b6676bee564b' (time: 12,\n",
- " band: 4,\n",
- " y: 256, x: 256)> Size: 13MB\n",
- "array([[[[ 9136., 9232., 9544., ..., 1258., 1120., 930.],\n",
- " [ 9616., 9768., 9840., ..., 1230., 1208., 1030.],\n",
- " [ 9992., 10008., 10000., ..., 1418., 1336., 1242.],\n",
- " ...,\n",
- " [ 811., 655., 688., ..., 385., 362., 461.],\n",
- " [ 798., 675., 727., ..., 394., 415., 402.],\n",
- " [ 888., 673., 642., ..., 403., 454., 393.]],\n",
- "\n",
- " [[ 8656., 8656., 8864., ..., 1500., 1428., 1220.],\n",
- " [ 9016., 9160., 9224., ..., 1546., 1522., 1360.],\n",
- " [ 9248., 9328., 9384., ..., 1620., 1542., 1482.],\n",
- " ...,\n",
- " [ 1010., 831., 853., ..., 277., 276., 336.],\n",
- " [ 1016., 930., 927., ..., 276., 317., 293.],\n",
- " [ 1112., 885., 827., ..., 299., 369., 293.]],\n",
- "\n",
- " [[ 8416., 8416., 8640., ..., 1598., 1466., 1138.],\n",
- " [ 8744., 8880., 8928., ..., 1498., 1522., 1284.],\n",
- " [ 8952., 8944., 8960., ..., 1542., 1478., 1448.],\n",
- " ...,\n",
- "...\n",
- " [ 652., 640., 638., ..., 590., 821., 1008.],\n",
- " [ 622., 676., 630., ..., 606., 1092., 726.],\n",
- " [ 864., 786., 569., ..., 766., 1068., 630.]],\n",
- "\n",
- " [[ 201., 213., 195., ..., 1138., 1058., 749.],\n",
- " [ 196., 198., 169., ..., 861., 784., 768.],\n",
- " [ 216., 178., 191., ..., 870., 806., 820.],\n",
- " ...,\n",
- " [ 857., 838., 846., ..., 622., 800., 1332.],\n",
- " [ 922., 848., 771., ..., 786., 1046., 912.],\n",
- " [ 1118., 1010., 735., ..., 755., 977., 686.]],\n",
- "\n",
- " [[ 3264., 3352., 3304., ..., 3160., 3296., 3376.],\n",
- " [ 3356., 3300., 3212., ..., 3188., 3272., 3064.],\n",
- " [ 3288., 3372., 3344., ..., 3136., 3200., 2932.],\n",
- " ...,\n",
- " [ 1320., 1468., 1298., ..., 2492., 2556., 3018.],\n",
- " [ 1630., 1694., 1250., ..., 2318., 2684., 2894.],\n",
- " [ 2190., 2072., 1288., ..., 2544., 2942., 2928.]]]],\n",
- " dtype=float32)\n",
- "Coordinates: (12/53)\n",
- " * time (time) datetime64[ns] 96B 2018-0...\n",
- " id (time) <U24 1kB 'S2B_29SNB_20180...\n",
- " * band (band) <U5 80B 'blue' ... 'nir'\n",
- " * x (x) float64 2kB 5.366e+05 ... 5....\n",
- " * y (y) float64 2kB 4.131e+06 ... 4....\n",
- " platform (time) <U11 528B 'sentinel-2b' ....\n",
- " ... ...\n",
- " gsd int64 8B 10\n",
- " title (band) <U20 320B 'Blue (band 2) ...\n",
- " common_name (band) <U5 80B 'blue' ... 'nir'\n",
- " center_wavelength (band) float64 32B 0.49 ... 0.842\n",
- " full_width_half_max (band) float64 32B 0.098 ... 0.145\n",
- " epsg int64 8B 32629\n",
- "Attributes:\n",
- " spec: RasterSpec(epsg=32629, bounds=(536640.79691545, 4128000.7407...\n",
- " crs: epsg:32629\n",
- " transform: | 10.00, 0.00, 536640.80|\\n| 0.00,-10.00, 4130560.74|\\n| 0.0...\n",
- " resolution: 10
9.136e+03 9.232e+03 9.544e+03 ... 2.544e+03 2.942e+03 2.928e+03
array([[[[ 9136., 9232., 9544., ..., 1258., 1120., 930.],\n",
- " [ 9616., 9768., 9840., ..., 1230., 1208., 1030.],\n",
- " [ 9992., 10008., 10000., ..., 1418., 1336., 1242.],\n",
- " ...,\n",
- " [ 811., 655., 688., ..., 385., 362., 461.],\n",
- " [ 798., 675., 727., ..., 394., 415., 402.],\n",
- " [ 888., 673., 642., ..., 403., 454., 393.]],\n",
- "\n",
- " [[ 8656., 8656., 8864., ..., 1500., 1428., 1220.],\n",
- " [ 9016., 9160., 9224., ..., 1546., 1522., 1360.],\n",
- " [ 9248., 9328., 9384., ..., 1620., 1542., 1482.],\n",
- " ...,\n",
- " [ 1010., 831., 853., ..., 277., 276., 336.],\n",
- " [ 1016., 930., 927., ..., 276., 317., 293.],\n",
- " [ 1112., 885., 827., ..., 299., 369., 293.]],\n",
- "\n",
- " [[ 8416., 8416., 8640., ..., 1598., 1466., 1138.],\n",
- " [ 8744., 8880., 8928., ..., 1498., 1522., 1284.],\n",
- " [ 8952., 8944., 8960., ..., 1542., 1478., 1448.],\n",
- " ...,\n",
- "...\n",
- " [ 652., 640., 638., ..., 590., 821., 1008.],\n",
- " [ 622., 676., 630., ..., 606., 1092., 726.],\n",
- " [ 864., 786., 569., ..., 766., 1068., 630.]],\n",
- "\n",
- " [[ 201., 213., 195., ..., 1138., 1058., 749.],\n",
- " [ 196., 198., 169., ..., 861., 784., 768.],\n",
- " [ 216., 178., 191., ..., 870., 806., 820.],\n",
- " ...,\n",
- " [ 857., 838., 846., ..., 622., 800., 1332.],\n",
- " [ 922., 848., 771., ..., 786., 1046., 912.],\n",
- " [ 1118., 1010., 735., ..., 755., 977., 686.]],\n",
- "\n",
- " [[ 3264., 3352., 3304., ..., 3160., 3296., 3376.],\n",
- " [ 3356., 3300., 3212., ..., 3188., 3272., 3064.],\n",
- " [ 3288., 3372., 3344., ..., 3136., 3200., 2932.],\n",
- " ...,\n",
- " [ 1320., 1468., 1298., ..., 2492., 2556., 3018.],\n",
- " [ 1630., 1694., 1250., ..., 2318., 2684., 2894.],\n",
- " [ 2190., 2072., 1288., ..., 2544., 2942., 2928.]]]],\n",
- " dtype=float32)
time
(time)
datetime64[ns]
2018-07-04T11:30:35.271000 ... 2...
array(['2018-07-04T11:30:35.271000000', '2018-07-09T11:24:55.535000000',\n",
- " '2018-07-14T11:21:12.461000000', '2018-07-19T11:23:57.810000000',\n",
- " '2018-07-24T11:23:35.774000000', '2018-07-29T11:30:58.949000000',\n",
- " '2018-08-03T11:30:54.537000000', '2018-08-08T11:30:58.042000000',\n",
- " '2018-08-13T11:30:20.451000000', '2018-08-18T11:30:57.426000000',\n",
- " '2018-08-23T11:30:50.574000000', '2018-08-28T11:30:56.771000000'],\n",
- " dtype='datetime64[ns]')
id
(time)
<U24
'S2B_29SNB_20180704_0_L2A' ... '...
array(['S2B_29SNB_20180704_0_L2A', 'S2A_29SNB_20180709_0_L2A',\n",
- " 'S2B_29SNB_20180714_0_L2A', 'S2A_29SNB_20180719_0_L2A',\n",
- " 'S2B_29SNB_20180724_0_L2A', 'S2A_29SNB_20180729_1_L2A',\n",
- " 'S2B_29SNB_20180803_1_L2A', 'S2A_29SNB_20180808_1_L2A',\n",
- " 'S2B_29SNB_20180813_0_L2A', 'S2A_29SNB_20180818_1_L2A',\n",
- " 'S2B_29SNB_20180823_1_L2A', 'S2A_29SNB_20180828_1_L2A'],\n",
- " dtype='<U24')
band
(band)
<U5
'blue' 'green' 'red' 'nir'
array(['blue', 'green', 'red', 'nir'], dtype='<U5')
x
(x)
float64
5.366e+05 5.367e+05 ... 5.392e+05
array([536640.796915, 536650.796915, 536660.796915, ..., 539170.796915,\n",
- " 539180.796915, 539190.796915])
y
(y)
float64
4.131e+06 4.131e+06 ... 4.128e+06
array([4130560.740728, 4130550.740728, 4130540.740728, ..., 4128030.740728,\n",
- " 4128020.740728, 4128010.740728])
platform
(time)
<U11
'sentinel-2b' ... 'sentinel-2a'
array(['sentinel-2b', 'sentinel-2a', 'sentinel-2b', 'sentinel-2a',\n",
- " 'sentinel-2b', 'sentinel-2a', 'sentinel-2b', 'sentinel-2a',\n",
- " 'sentinel-2b', 'sentinel-2a', 'sentinel-2b', 'sentinel-2a'],\n",
- " dtype='<U11')
earthsearch:boa_offset_applied
(time)
bool
False False False ... True True
array([False, False, False, False, False, True, True, True, False,\n",
- " True, True, True])
updated
(time)
<U24
'2022-11-08T04:09:11.425Z' ... '...
array(['2022-11-08T04:09:11.425Z', '2022-11-08T04:09:10.062Z',\n",
- " '2022-11-08T04:08:41.139Z', '2022-11-08T04:09:08.935Z',\n",
- " '2022-11-08T04:11:26.056Z', '2024-03-06T03:11:05.253Z',\n",
- " '2024-03-04T17:22:55.171Z', '2024-03-03T08:08:18.522Z',\n",
- " '2022-11-08T04:08:27.837Z', '2024-02-27T00:46:31.012Z',\n",
- " '2024-02-29T15:41:03.823Z', '2024-02-29T16:09:36.670Z'],\n",
- " dtype='<U24')
eo:cloud_cover
(time)
float64
51.37 6.053 ... 0.001241 29.93
array([5.1370249e+01, 6.0531580e+00, 4.2236709e+01, 2.2241700e-01,\n",
- " 1.8131460e+00, 4.3988000e-02, 7.1184000e-02, 1.1340000e-02,\n",
- " 1.9226900e-01, 1.3464000e-02, 1.2410000e-03, 2.9934791e+01])
s2:unclassified_percentage
(time)
float64
5.947 1.368 7.637 ... 0.2319 0.5048
array([5.947329, 1.368473, 7.636892, 0.586415, 1.11941 , 0.27404 ,\n",
- " 0.18343 , 0.317564, 0.40834 , 0.306313, 0.231854, 0.504849])
s2:medium_proba_clouds_percentage
(time)
float64
5.48 1.358 6.706 ... 0.000883 1.105
array([5.479574e+00, 1.357958e+00, 6.705691e+00, 1.313850e-01,\n",
- " 6.336530e-01, 4.120100e-02, 2.120800e-02, 7.415000e-03,\n",
- " 9.804900e-02, 1.282300e-02, 8.830000e-04, 1.105073e+00])
instruments
()
<U3
'msi'
array('msi', dtype='<U3')
s2:processing_baseline
(time)
<U5
'02.08' '02.08' ... '05.00' '05.00'
array(['02.08', '02.08', '02.08', '02.08', '02.08', '05.00', '05.00',\n",
- " '05.00', '02.08', '05.00', '05.00', '05.00'], dtype='<U5')
s2:datastrip_id
(time)
<U64
'S2B_OPER_MSI_L2A_DS_SGS__201807...
array(['S2B_OPER_MSI_L2A_DS_SGS__20180704T173114_S20180704T113035_N02.08',\n",
- " 'S2A_OPER_MSI_L2A_DS_MPS__20180709T142305_S20180709T112455_N02.08',\n",
- " 'S2B_OPER_MSI_L2A_DS_SGS__20180714T154750_S20180714T112112_N02.08',\n",
- " 'S2A_OPER_MSI_L2A_DS_SGS__20180719T141416_S20180719T112357_N02.08',\n",
- " 'S2B_OPER_MSI_L2A_DS_SGS__20180724T155304_S20180724T112335_N02.08',\n",
- " 'S2A_OPER_MSI_L2A_DS_S2RP_20230814T193453_S20180729T112845_N05.00',\n",
- " 'S2B_OPER_MSI_L2A_DS_S2RP_20230731T111322_S20180803T112124_N05.00',\n",
- " 'S2A_OPER_MSI_L2A_DS_S2RP_20230709T143032_S20180808T112558_N05.00',\n",
- " 'S2B_OPER_MSI_L2A_DS_SGS__20180813T181703_S20180813T113020_N02.08',\n",
- " 'S2A_OPER_MSI_L2A_DS_S2RP_20230810T181646_S20180818T112627_N05.00',\n",
- " 'S2B_OPER_MSI_L2A_DS_S2RP_20230822T204933_S20180823T112334_N05.00',\n",
- " 'S2A_OPER_MSI_L2A_DS_S2RP_20230823T002226_S20180828T112246_N05.00'],\n",
- " dtype='<U64')
s2:datatake_type
()
<U8
'INS-NOBS'
array('INS-NOBS', dtype='<U8')
s2:reflectance_conversion_factor
(time)
float64
0.9674 0.9674 ... 0.9768 0.9789
array([0.96744349, 0.96736452, 0.96752085, 0.96791152, 0.96853402,\n",
- " 0.96938447, 0.97045742, 0.97174606, 0.97324208, 0.97493585,\n",
- " 0.97681629, 0.97887107])
earthsearch:s3_path
(time)
<U79
's3://sentinel-cogs/sentinel-s2-...
array(['s3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/7/S2B_29SNB_20180704_0_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/7/S2A_29SNB_20180709_0_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/7/S2B_29SNB_20180714_0_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/7/S2A_29SNB_20180719_0_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/7/S2B_29SNB_20180724_0_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/7/S2A_29SNB_20180729_1_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/8/S2B_29SNB_20180803_1_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/8/S2A_29SNB_20180808_1_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/8/S2B_29SNB_20180813_0_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/8/S2A_29SNB_20180818_1_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/8/S2B_29SNB_20180823_1_L2A',\n",
- " 's3://sentinel-cogs/sentinel-s2-l2a-cogs/29/S/NB/2018/8/S2A_29SNB_20180828_1_L2A'],\n",
- " dtype='<U79')
mgrs:latitude_band
()
<U1
'S'
s2:water_percentage
(time)
float64
3.858 4.802 5.2 ... 23.16 10.39
array([ 3.858252, 4.802034, 5.199604, 4.226216, 11.34233 , 22.941652,\n",
- " 22.935846, 23.064512, 18.959516, 23.006639, 23.155516, 10.392122])
grid:code
()
<U10
'MGRS-29SNB'
array('MGRS-29SNB', dtype='<U10')
s2:high_proba_clouds_percentage
(time)
float64
45.89 4.695 35.53 ... 5.6e-05 28.83
array([4.5890576e+01, 4.6951800e+00, 3.5531008e+01, 9.1032000e-02,\n",
- " 1.1792470e+00, 2.4850000e-03, 1.7290000e-03, 3.2080000e-03,\n",
- " 9.4071000e-02, 2.8500000e-04, 5.6000000e-05, 2.8829521e+01])
s2:thin_cirrus_percentage
(time)
object
0.0001 2e-05 ... 0.000302 0.000199
array([0.0001, 2e-05, 1e-05, 0, 0.000246, 0.000302, 0.048248, 0.000717,\n",
- " 0.000149, 0.000355, 0.000302, 0.000199], dtype=object)
s2:generation_time
(time)
<U27
'2018-07-04T17:31:14.000000Z' .....
array(['2018-07-04T17:31:14.000000Z', '2018-07-09T14:23:05.000000Z',\n",
- " '2018-07-14T15:47:50.000000Z', '2018-07-19T14:14:16.000000Z',\n",
- " '2018-07-24T15:53:04.000000Z', '2023-08-14T19:34:53.000000Z',\n",
- " '2023-07-31T11:13:22.000000Z', '2023-07-09T14:30:32.000000Z',\n",
- " '2018-08-13T18:17:03.000000Z', '2023-08-10T18:16:46.000000Z',\n",
- " '2023-08-22T20:49:33.000000Z', '2023-08-23T00:22:26.000000Z'],\n",
- " dtype='<U27')
s2:datatake_id
(time)
<U34
'GS2B_20180704T112109_006927_N02...
array(['GS2B_20180704T112109_006927_N02.08',\n",
- " 'GS2A_20180709T112121_015907_N02.08',\n",
- " 'GS2B_20180714T112109_007070_N02.08',\n",
- " 'GS2A_20180719T112121_016050_N02.08',\n",
- " 'GS2B_20180724T112109_007213_N02.08',\n",
- " 'GS2A_20180729T112111_016193_N05.00',\n",
- " 'GS2B_20180803T112109_007356_N05.00',\n",
- " 'GS2A_20180808T112111_016336_N05.00',\n",
- " 'GS2B_20180813T112109_007499_N02.08',\n",
- " 'GS2A_20180818T112111_016479_N05.00',\n",
- " 'GS2B_20180823T112109_007642_N05.00',\n",
- " 'GS2A_20180828T112111_016622_N05.00'], dtype='<U34')
s2:granule_id
(time)
<U62
'S2B_OPER_MSI_L2A_TL_SGS__201807...
array(['S2B_OPER_MSI_L2A_TL_SGS__20180704T173114_A006927_T29SNB_N02.08',\n",
- " 'S2A_OPER_MSI_L2A_TL_MPS__20180709T142305_A015907_T29SNB_N02.08',\n",
- " 'S2B_OPER_MSI_L2A_TL_SGS__20180714T154750_A007070_T29SNB_N02.08',\n",
- " 'S2A_OPER_MSI_L2A_TL_SGS__20180719T141416_A016050_T29SNB_N02.08',\n",
- " 'S2B_OPER_MSI_L2A_TL_SGS__20180724T155304_A007213_T29SNB_N02.08',\n",
- " 'S2A_OPER_MSI_L2A_TL_S2RP_20230814T193453_A016193_T29SNB_N05.00',\n",
- " 'S2B_OPER_MSI_L2A_TL_S2RP_20230731T111322_A007356_T29SNB_N05.00',\n",
- " 'S2A_OPER_MSI_L2A_TL_S2RP_20230709T143032_A016336_T29SNB_N05.00',\n",
- " 'S2B_OPER_MSI_L2A_TL_SGS__20180813T181703_A007499_T29SNB_N02.08',\n",
- " 'S2A_OPER_MSI_L2A_TL_S2RP_20230810T181646_A016479_T29SNB_N05.00',\n",
- " 'S2B_OPER_MSI_L2A_TL_S2RP_20230822T204933_A007642_T29SNB_N05.00',\n",
- " 'S2A_OPER_MSI_L2A_TL_S2RP_20230823T002226_A016622_T29SNB_N05.00'],\n",
- " dtype='<U62')
view:sun_elevation
(time)
float64
69.5 68.99 68.36 ... 60.08 58.68
array([69.50425853, 68.98740195, 68.35694132, 67.64362007, 66.82363556,\n",
- " 65.92875068, 64.92695245, 63.85302274, 62.67294368, 61.42841738,\n",
- " 60.0810333 , 58.68007442])
s2:sequence
(time)
<U1
'0' '0' '0' '0' ... '0' '1' '1' '1'
array(['0', '0', '0', '0', '0', '1', '1', '1', '0', '1', '1', '1'],\n",
- " dtype='<U1')
processing:software
(time)
object
{'sentinel2-to-stac': '0.1.0'} ....
array([{'sentinel2-to-stac': '0.1.0'}, {'sentinel2-to-stac': '0.1.0'},\n",
- " {'sentinel2-to-stac': '0.1.0'}, {'sentinel2-to-stac': '0.1.0'},\n",
- " {'sentinel2-to-stac': '0.1.0'}, {'sentinel2-to-stac': '0.1.1'},\n",
- " {'sentinel2-to-stac': '0.1.1'}, {'sentinel2-to-stac': '0.1.1'},\n",
- " {'sentinel2-to-stac': '0.1.0'}, {'sentinel2-to-stac': '0.1.1'},\n",
- " {'sentinel2-to-stac': '0.1.1'}, {'sentinel2-to-stac': '0.1.1'}],\n",
- " dtype=object)
s2:saturated_defective_pixel_percentage
()
int64
0
s2:degraded_msi_data_percentage
(time)
object
0 0 0 0 0 0.0001 0 0.0003 0 0 0 0
array([0, 0, 0, 0, 0, 0.0001, 0, 0.0003, 0, 0, 0, 0], dtype=object)
s2:product_type
()
<U7
'S2MSI2A'
array('S2MSI2A', dtype='<U7')
s2:nodata_pixel_percentage
(time)
object
3e-06 0 0 0.003915 ... 0 0 0 0
array([3e-06, 0, 0, 0.003915, 0.000368, 0, 0, 0, 0, 0, 0, 0], dtype=object)
s2:vegetation_percentage
(time)
float64
6.351 26.77 7.667 ... 18.39 12.85
array([ 6.351104, 26.767129, 7.667045, 26.040119, 23.777372, 25.403416,\n",
- " 13.053238, 22.950451, 22.447307, 20.319489, 18.38966 , 12.854452])
s2:dark_features_percentage
(time)
float64
16.12 13.06 11.69 ... 0.3938 0.3143
array([16.12432 , 13.057183, 11.687387, 18.505839, 12.184375, 0.074651,\n",
- " 0.048175, 0.252265, 3.87442 , 0.28829 , 0.393808, 0.314322])
view:sun_azimuth
(time)
float64
130.7 131.3 132.1 ... 146.5 148.6
array([130.70057492, 131.27737745, 132.14346945, 133.35254814,\n",
- " 134.77525486, 136.46832852, 138.273017 , 140.26450087,\n",
- " 142.27181246, 144.40090468, 146.45729597, 148.58961039])
created
(time)
<U24
'2022-11-08T04:09:11.425Z' ... '...
array(['2022-11-08T04:09:11.425Z', '2022-11-08T04:09:10.062Z',\n",
- " '2022-11-08T04:08:41.139Z', '2022-11-08T04:09:08.935Z',\n",
- " '2022-11-08T04:11:26.056Z', '2024-03-06T03:11:05.253Z',\n",
- " '2024-03-04T17:22:55.171Z', '2024-03-03T08:08:18.522Z',\n",
- " '2022-11-08T04:08:27.837Z', '2024-02-27T00:46:31.012Z',\n",
- " '2024-02-29T15:41:03.823Z', '2024-02-29T16:09:36.670Z'],\n",
- " dtype='<U24')
constellation
()
<U10
'sentinel-2'
array('sentinel-2', dtype='<U10')
mgrs:grid_square
()
<U2
'NB'
earthsearch:payload_id
(time)
<U74
'roda-sentinel2/workflow-sentine...
array(['roda-sentinel2/workflow-sentinel2-to-stac/e396ffa5a9a4ed92cb828fe9eea19fd6',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/f2fc5b274422cb6ce8cc1b0cb5ca77a2',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/aa564bb8afca7b3539b55c24541c2997',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/220d290c439964fd678d0f73a8a48f62',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/a0dd5492442d9e4e9159a517e31935ad',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/f3dd6f2d288c1b38e6f5f42bab329dc7',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/1ea3f6e075515d46e676c6168f6d782c',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/568aa9b0683af1d4455c65eb8015bd14',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/e1a04cc0a9b71296b591e04fba5211c8',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/e5a8283ba5b64d3998b48b152c7968f1',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/9cbc69acf15a270b204eacf3d2d4d9ed',\n",
- " 'roda-sentinel2/workflow-sentinel2-to-stac/31ec24ab0eb9b41ecd9df82bbc9780b6'],\n",
- " dtype='<U74')
s2:not_vegetated_percentage
(time)
float64
13.77 47.66 23.3 ... 57.83 45.99
array([13.766922, 47.659367, 23.300155, 50.044709, 49.182758, 51.25981 ,\n",
- " 63.702559, 53.398752, 53.67716 , 56.056434, 57.827902, 45.989844])
proj:epsg
()
int64
32629
mgrs:utm_zone
()
int64
29
s2:cloud_shadow_percentage
(time)
object
2.52675 0.291034 ... 0 0.009618
array([2.52675, 0.291034, 2.270056, 0.365282, 0.578394, 0.002442,\n",
- " 0.001891, 0.004117, 0.438764, 0, 0, 0.009618], dtype=object)
s2:snow_ice_percentage
(time)
object
0.055073 0.001622 ... 1.3e-05 0
array([0.055073, 0.001622, 0.002153, 0.009002, 0.00222, 0, 0.00367,\n",
- " 0.000999, 0.002226, 0.00937, 1.3e-05, 0], dtype=object)
s2:product_uri
(time)
<U65
'S2B_MSIL2A_20180704T112109_N020...
array(['S2B_MSIL2A_20180704T112109_N0208_R037_T29SNB_20180704T173114.SAFE',\n",
- " 'S2A_MSIL2A_20180709T112121_N0208_R037_T29SNB_20180709T142305.SAFE',\n",
- " 'S2B_MSIL2A_20180714T112109_N0208_R037_T29SNB_20180714T154750.SAFE',\n",
- " 'S2A_MSIL2A_20180719T112121_N0208_R037_T29SNB_20180719T141416.SAFE',\n",
- " 'S2B_MSIL2A_20180724T112109_N0208_R037_T29SNB_20180724T155304.SAFE',\n",
- " 'S2A_MSIL2A_20180729T112111_N0500_R037_T29SNB_20230814T193453.SAFE',\n",
- " 'S2B_MSIL2A_20180803T112109_N0500_R037_T29SNB_20230731T111322.SAFE',\n",
- " 'S2A_MSIL2A_20180808T112111_N0500_R037_T29SNB_20230709T143032.SAFE',\n",
- " 'S2B_MSIL2A_20180813T112109_N0208_R037_T29SNB_20180813T181703.SAFE',\n",
- " 'S2A_MSIL2A_20180818T112111_N0500_R037_T29SNB_20230810T181646.SAFE',\n",
- " 'S2B_MSIL2A_20180823T112109_N0500_R037_T29SNB_20230822T204933.SAFE',\n",
- " 'S2A_MSIL2A_20180828T112111_N0500_R037_T29SNB_20230823T002226.SAFE'],\n",
- " dtype='<U65')
proj:transform
()
object
{0, 4200000, 10, 499980, -10}
array({0, 4200000, 10, 499980, -10}, dtype=object)
proj:shape
()
object
{10980}
array({10980}, dtype=object)
gsd
()
int64
10
title
(band)
<U20
'Blue (band 2) - 10m' ... 'NIR 1...
array(['Blue (band 2) - 10m', 'Green (band 3) - 10m',\n",
- " 'Red (band 4) - 10m', 'NIR 1 (band 8) - 10m'], dtype='<U20')
common_name
(band)
<U5
'blue' 'green' 'red' 'nir'
array(['blue', 'green', 'red', 'nir'], dtype='<U5')
center_wavelength
(band)
float64
0.49 0.56 0.665 0.842
array([0.49 , 0.56 , 0.665, 0.842])
full_width_half_max
(band)
float64
0.098 0.045 0.038 0.145
array([0.098, 0.045, 0.038, 0.145])
epsg
()
int64
32629
PandasIndex
PandasIndex(DatetimeIndex(['2018-07-04 11:30:35.271000', '2018-07-09 11:24:55.535000',\n",
- " '2018-07-14 11:21:12.461000', '2018-07-19 11:23:57.810000',\n",
- " '2018-07-24 11:23:35.774000', '2018-07-29 11:30:58.949000',\n",
- " '2018-08-03 11:30:54.537000', '2018-08-08 11:30:58.042000',\n",
- " '2018-08-13 11:30:20.451000', '2018-08-18 11:30:57.426000',\n",
- " '2018-08-23 11:30:50.574000', '2018-08-28 11:30:56.771000'],\n",
- " dtype='datetime64[ns]', name='time', freq=None))
PandasIndex
PandasIndex(Index(['blue', 'green', 'red', 'nir'], dtype='object', name='band'))
PandasIndex
PandasIndex(Index([536640.79691545, 536650.79691545, 536660.79691545, 536670.79691545,\n",
- " 536680.79691545, 536690.79691545, 536700.79691545, 536710.79691545,\n",
- " 536720.79691545, 536730.79691545,\n",
- " ...\n",
- " 539100.79691545, 539110.79691545, 539120.79691545, 539130.79691545,\n",
- " 539140.79691545, 539150.79691545, 539160.79691545, 539170.79691545,\n",
- " 539180.79691545, 539190.79691545],\n",
- " dtype='float64', name='x', length=256))
PandasIndex
PandasIndex(Index([4130560.740728332, 4130550.740728332, 4130540.740728332,\n",
- " 4130530.740728332, 4130520.740728332, 4130510.740728332,\n",
- " 4130500.740728332, 4130490.740728332, 4130480.740728332,\n",
- " 4130470.740728332,\n",
- " ...\n",
- " 4128100.740728332, 4128090.740728332, 4128080.740728332,\n",
- " 4128070.740728332, 4128060.740728332, 4128050.740728332,\n",
- " 4128040.740728332, 4128030.740728332, 4128020.740728332,\n",
- " 4128010.740728332],\n",
- " dtype='float64', name='y', length=256))
- spec :
- RasterSpec(epsg=32629, bounds=(536640.79691545, 4128000.740728332, 539200.79691545, 4130560.740728332), resolutions_xy=(10, 10))
- crs :
- epsg:32629
- transform :
- | 10.00, 0.00, 536640.80|\n",
- "| 0.00,-10.00, 4130560.74|\n",
- "| 0.00, 0.00, 1.00|
- resolution :
- 10
"
- ],
- "text/plain": [
- " Size: 13MB\n",
- "array([[[[ 9136., 9232., 9544., ..., 1258., 1120., 930.],\n",
- " [ 9616., 9768., 9840., ..., 1230., 1208., 1030.],\n",
- " [ 9992., 10008., 10000., ..., 1418., 1336., 1242.],\n",
- " ...,\n",
- " [ 811., 655., 688., ..., 385., 362., 461.],\n",
- " [ 798., 675., 727., ..., 394., 415., 402.],\n",
- " [ 888., 673., 642., ..., 403., 454., 393.]],\n",
- "\n",
- " [[ 8656., 8656., 8864., ..., 1500., 1428., 1220.],\n",
- " [ 9016., 9160., 9224., ..., 1546., 1522., 1360.],\n",
- " [ 9248., 9328., 9384., ..., 1620., 1542., 1482.],\n",
- " ...,\n",
- " [ 1010., 831., 853., ..., 277., 276., 336.],\n",
- " [ 1016., 930., 927., ..., 276., 317., 293.],\n",
- " [ 1112., 885., 827., ..., 299., 369., 293.]],\n",
- "\n",
- " [[ 8416., 8416., 8640., ..., 1598., 1466., 1138.],\n",
- " [ 8744., 8880., 8928., ..., 1498., 1522., 1284.],\n",
- " [ 8952., 8944., 8960., ..., 1542., 1478., 1448.],\n",
- " ...,\n",
- "...\n",
- " [ 652., 640., 638., ..., 590., 821., 1008.],\n",
- " [ 622., 676., 630., ..., 606., 1092., 726.],\n",
- " [ 864., 786., 569., ..., 766., 1068., 630.]],\n",
- "\n",
- " [[ 201., 213., 195., ..., 1138., 1058., 749.],\n",
- " [ 196., 198., 169., ..., 861., 784., 768.],\n",
- " [ 216., 178., 191., ..., 870., 806., 820.],\n",
- " ...,\n",
- " [ 857., 838., 846., ..., 622., 800., 1332.],\n",
- " [ 922., 848., 771., ..., 786., 1046., 912.],\n",
- " [ 1118., 1010., 735., ..., 755., 977., 686.]],\n",
- "\n",
- " [[ 3264., 3352., 3304., ..., 3160., 3296., 3376.],\n",
- " [ 3356., 3300., 3212., ..., 3188., 3272., 3064.],\n",
- " [ 3288., 3372., 3344., ..., 3136., 3200., 2932.],\n",
- " ...,\n",
- " [ 1320., 1468., 1298., ..., 2492., 2556., 3018.],\n",
- " [ 1630., 1694., 1250., ..., 2318., 2684., 2894.],\n",
- " [ 2190., 2072., 1288., ..., 2544., 2942., 2928.]]]],\n",
- " dtype=float32)\n",
- "Coordinates: (12/53)\n",
- " * time (time) datetime64[ns] 96B 2018-0...\n",
- " id (time) "
- ]
- },
- "execution_count": 21,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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",
- "text/plain": [
- "