From c9f519fab89f28441dff1f23e509d1347608b35f Mon Sep 17 00:00:00 2001 From: hrodmn Date: Thu, 17 Apr 2025 20:25:40 -0500 Subject: [PATCH 1/4] add notebook for working with pgstac --- docs/database.ipynb | 786 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 786 insertions(+) create mode 100644 docs/database.ipynb diff --git a/docs/database.ipynb b/docs/database.ipynb new file mode 100644 index 0000000..e1cc0ad --- /dev/null +++ b/docs/database.ipynb @@ -0,0 +1,786 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9edbdd3b-5b35-4bbb-9e15-e5152260aa24", + "metadata": {}, + "source": [ + "# The Database: `pgstac`\n", + "\n", + "`pgstac` is a PostgreSQL extension that enables STAC metadata management in a PostgreSQL database.\n", + "eoAPI is useful to many organizations because the other components are configured to work seamlessly with STAC metadata that is stored in your `pgstac` database.\n", + "\n", + "In this notebook you will learn how to interact with a `pgstac` database:\n", + "- Create and upload a collection\n", + "- Upload items\n", + "- Delete an item\n", + "\n", + "Fill in the input boxes below to get started with your own personal Sentinel-2 STAC collection!" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "196e7c1d-b82b-4d66-bf96-4942cd02392c", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide-input" + ] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b616294e1b8243808640bafd0dee8445", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Text(value='', description='username:', placeholder='Enter your username')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "54479d978a7744a9b05bdaee1ecc1994", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "BoundedFloatText(value=38.9, description='latitude:', max=90.0, min=-90.0)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9749fc3e41074f34b2ea1303918a3520", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "BoundedFloatText(value=-77.0, description='longitude:', max=180.0, min=-180.0)" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7d37a4c261444dd78a45efefdc88b194", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Text(value='', description='db host:', placeholder='Enter database host address')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4c2542823b0e42c8821d2055bcf9a78b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Text(value='pgstac_user', description='db user:', placeholder='Enter database username')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4697ebc2d2284dc698bc259f6e983f43", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Text(value='', description='db password:', placeholder='Enter database password')" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import ipywidgets as widgets\n", + "from IPython.display import display\n", + "\n", + "username_input = widgets.Text(\n", + " value=\"\", placeholder=\"Enter your username\", description=\"username:\", disabled=False\n", + ")\n", + "\n", + "lat_input = widgets.BoundedFloatText(\n", + " value=38.9,\n", + " min=-90,\n", + " max=90,\n", + " placeholder=\"enter the latitude of your hometown\",\n", + " description=\"latitude:\",\n", + " disabled=False,\n", + ")\n", + "lon_input = widgets.BoundedFloatText(\n", + " value=-77.0,\n", + " min=-180,\n", + " max=180,\n", + " placeholder=\"enter the longitude of your hometown\",\n", + " description=\"longitude:\",\n", + " disabled=False,\n", + ")\n", + "db_host_input = widgets.Text(\n", + " value=\"\",\n", + " placeholder=\"Enter database host address\",\n", + " description=\"db host:\",\n", + " disabled=False,\n", + ")\n", + "db_user_input = widgets.Text(\n", + " value=\"pgstac_user\",\n", + " placeholder=\"Enter database username\",\n", + " description=\"db user:\",\n", + " disabled=False,\n", + ")\n", + "db_password_input = widgets.Text(\n", + " value=\"\",\n", + " placeholder=\"Enter database password\",\n", + " description=\"db password:\",\n", + " disabled=False,\n", + ")\n", + "\n", + "# Display the widgets\n", + "display(username_input)\n", + "display(lat_input)\n", + "display(lon_input)\n", + "display(db_host_input)\n", + "display(db_user_input)\n", + "display(db_password_input)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6a49d4d2-ca06-4704-84bc-cbeef8103546", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "from datetime import datetime\n", + "\n", + "import pystac_client\n", + "from pystac import Collection, Extent, SpatialExtent, TemporalExtent\n", + "from pypgstac.db import PgstacDB\n", + "from pypgstac.load import Loader, Methods\n", + "from shapely.geometry import Point\n", + "\n", + "\n", + "stac_api_endpoint = \"https://pj44p72a3g.execute-api.us-west-2.amazonaws.com\"" + ] + }, + { + "cell_type": "markdown", + "id": "e6d710ec-c2b0-4784-a8ce-a9c3694abc35", + "metadata": {}, + "source": [ + "## Load a collection object\n", + "\n", + "Start by creating a collection that will contain items within ~2 degrees of your provided location between January 1 2025 and April 18 2025." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1a09b4e5-1727-4ee2-96ef-e0772267829d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
    \n", + " \n", + " \n", + " \n", + "
  • \n", + " type\n", + " \"Collection\"\n", + "
  • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
  • \n", + " id\n", + " \"hrodmn-sentinel-2-c1-l2a\"\n", + "
  • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
  • \n", + " stac_version\n", + " \"1.1.0\"\n", + "
  • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
  • \n", + " description\n", + " \"my collection\"\n", + "
  • \n", + " \n", + " \n", + " \n", + " \n", + "
  • \n", + " links[] 0 items\n", + " \n", + "
  • \n", + " \n", + " \n", + " \n", + " \n", + "
  • \n", + " extent\n", + "
      \n", + " \n", + " \n", + " \n", + "
    • \n", + " spatial\n", + "
        \n", + " \n", + " \n", + "
      • \n", + " bbox[] 1 items\n", + " \n", + "
          \n", + " \n", + " \n", + "
        • \n", + " 0[] 4 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " -79.0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 36.9\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " -75.0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 40.9\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + " \n", + "
      • \n", + " \n", + " \n", + "
      \n", + "
    • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    • \n", + " temporal\n", + "
        \n", + " \n", + " \n", + "
      • \n", + " interval[] 1 items\n", + " \n", + "
          \n", + " \n", + " \n", + "
        • \n", + " 0[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"2025-01-01T00:00:00Z\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"2025-04-18T00:00:00Z\"\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", + " license\n", + " \"other\"\n", + "
  • \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "collection_id = f\"{username_input.value}-sentinel-2-c1-l2a\"\n", + "bbox = Point(lon_input.value, lat_input.value).buffer(2).bounds\n", + "temporal_extent = [datetime(2025, 1, 1), datetime(2025, 4, 18)]\n", + "\n", + "my_collection = Collection(\n", + " id=collection_id,\n", + " description=\"my collection\",\n", + " extent=Extent(\n", + " spatial=SpatialExtent([[*bbox]]),\n", + " temporal=TemporalExtent([temporal_extent]),\n", + " ),\n", + ")\n", + "my_collection" + ] + }, + { + "cell_type": "markdown", + "id": "c5599078-40a9-49ed-a2a4-4c4dd409ce39", + "metadata": {}, + "source": [ + "To connect to the `pgstac` database and upload data we need to generate the `dsn` and instantiate a `PgstacDB` and `Loader` pair." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "0536d319-0b51-40b4-8fe2-4ceb3ceacfec", + "metadata": {}, + "outputs": [], + "source": [ + "db_creds = {\n", + " \"password\": db_password_input.value,\n", + " \"dbname\": \"pgstac\",\n", + " \"engine\": \"postgres\",\n", + " \"port\": 5432,\n", + " \"host\": db_host_input.value,\n", + " \"username\": db_user_input.value,\n", + "}\n", + "pgstac_dsn = \"postgresql://{username}:{password}@{host}:{port}/{dbname}\".format(\n", + " **db_creds\n", + ")\n", + "\n", + "db = PgstacDB(dsn=pgstac_dsn)\n", + "loader = Loader(db)" + ] + }, + { + "cell_type": "markdown", + "id": "af1fa92d-97b3-4b70-b7b9-b371a06741a3", + "metadata": {}, + "source": [ + "The `load_collections` method accepts an iterable of STAC collection dictionaries or a file path to a collection.json file or a .ndjson file with multiple collection records. You already have your `pystac.Collection` in memory in this session so you can just write it to a dictionary and upload it (in a list). \n", + "\n", + "The `upsert` method will add your collection to the `collections` table if it does not exist and update any fields with new values if the record does already exist." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "7ae2471c-8164-466f-a56d-745213cb7316", + "metadata": {}, + "outputs": [], + "source": [ + "loader.load_collections([my_collection.to_dict()], insert_mode=Methods.upsert)" + ] + }, + { + "cell_type": "markdown", + "id": "a607a1ca-d23d-4c42-bc55-e1def489599f", + "metadata": {}, + "source": [ + "Now if you run a query on the database you will find a record for your collection!" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "7d71b6b1-70c3-4e5d-9444-f1dddb4e98c3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('hrodmn-sentinel-2-c1-l2a',)]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(db.query(f\"SELECT id from collections where id = '{my_collection.id}';\"))" + ] + }, + { + "cell_type": "markdown", + "id": "e62c2e30-5e0a-4a9f-9a35-16bdd24e88e8", + "metadata": {}, + "source": [ + "## Upload items\n", + "\n", + "You already learned how to create STAC items from scratch in the [STAC metadata](./stac_metadata.ipynb) notebook so you get to take a shortcut for this one. Instead of creating STAC metadata from scratch you can just copy some from an existing STAC collection - this will be sufficient for our exercises during the workshop.\n", + "\n", + "This code will find Sentinel-2 L2A items for the first few months of 2025 that intersect the bounding box of a 2 degree radius around the coordinate that you entered at the top of the notebook." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "6a858a2d-57b7-40e9-8235-2c341f43a8de", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1430\n" + ] + } + ], + "source": [ + "source_client = pystac_client.Client.open(\"https://earth-search.aws.element84.com/v1\")\n", + "\n", + "search = source_client.search(\n", + " collections=\"sentinel-2-c1-l2a\",\n", + " bbox=bbox,\n", + " datetime=temporal_extent,\n", + " limit=100, # pagination limit\n", + ")\n", + "\n", + "items = search.item_collection()\n", + "\n", + "print(len(items))" + ] + }, + { + "cell_type": "markdown", + "id": "34af967a-b837-4910-afde-6145582cf216", + "metadata": {}, + "source": [ + "You are going to upload these items to the items table in the `pgstac` database but to do so you need to make sure the items' collection ID matches an existing collection - set it to match the collection that you uploaded in the previous step." + ] + }, + { + "cell_type": "markdown", + "id": "efc572c0-931f-409e-a4bb-4749c587d9f1", + "metadata": {}, + "source": [ + "# override the collection id to match your new collection\n", + "for item in items:\n", + " item.set_collection(my_collection)\n", + "\n", + "items[0]" + ] + }, + { + "cell_type": "markdown", + "id": "05a5a11e-9c20-41c0-aa5c-b078731173d8", + "metadata": {}, + "source": [ + "Now you can use the `load_items` method to upload the list of STAC item dictionaries to the items table in the `pgstac` database. The `insert_ignore` method will upload any items that do not exist in the table and skip records that already exist." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "82443eb2-0d59-46b2-9178-25acb3d0593e", + "metadata": {}, + "outputs": [], + "source": [ + "loader.load_items([item.to_dict() for item in items], insert_mode=Methods.insert_ignore)" + ] + }, + { + "cell_type": "markdown", + "id": "680a5d26-05c0-4cf9-ac7a-ccc555675a18", + "metadata": {}, + "source": [ + "Hooray you uploaded some items! Now run a query to verify that the records landed in the items table." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "48133d14-e301-45b4-973d-1b846a6c503a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "there are 1430 items\n" + ] + } + ], + "source": [ + "n_items = db.query_one(\n", + " f\"SELECT COUNT(*) FROM items where collection = '{my_collection.id}';\"\n", + ")\n", + "print(f\"there are {n_items} items\")" + ] + }, + { + "cell_type": "markdown", + "id": "579370f8-3cde-4f6f-bff2-796aa08344eb", + "metadata": {}, + "source": [ + "Here is your first glimpse of the power of STAC metadata. You just uploaded these items to the database and now you can browse the data in a beautiful interface without doing any more work!\n", + "\n", + "[Radiant Earth](https://radiant.earth/) built a tool called [STAC Browser](https://radiantearth.github.io/stac-browser/#/?.language=en) that is a human-readable interface to a STAC API. Your collection is immediately availble in the STAC API so you can browse it in STAC Browser. Take a tour around the STAC Browser page for your collection. " + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "ba5f6278-4d92-4386-af1d-94ca5aed6c30", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import IFrame\n", + "\n", + "IFrame(\n", + " f\"https://radiantearth.github.io/stac-browser/#/external/{stac_api_endpoint}/collections/{my_collection.id}\",\n", + " 900,\n", + " 500,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cdd2d506-7dad-48f1-acb4-4188b54c0346", + "metadata": {}, + "source": [ + "## Delete an item\n", + "\n", + "It is less common but you might want to delete a STAC record some day. There are not yet any `pypgstac` functions for doing this but it is relatively easy to do via PostgreSQL query.\n", + "\n", + "Try deleting the last item in the list." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "4c6782bf-b043-49a0-a338-7676ff52d005", + "metadata": {}, + "outputs": [], + "source": [ + "with db.connect() as conn:\n", + " cur = conn.cursor()\n", + " cur.execute(f\"DELETE FROM items where id = '{items[-1].id}';\")\n", + " cur.close()\n", + " conn.commit()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "d3030aa7-4aaa-4ead-8589-b88759968f99", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "there are now 1429 items\n" + ] + } + ], + "source": [ + "new_n_items = db.query_one(\n", + " f\"SELECT COUNT(*) FROM items where collection = '{my_collection.id}';\"\n", + ")\n", + "print(f\"there are now {new_n_items} items\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From e0c8b1d21a3a9acf2a4f823b4a519c57516580be Mon Sep 17 00:00:00 2001 From: hrodmn Date: Thu, 17 Apr 2025 20:53:03 -0500 Subject: [PATCH 2/4] clean up notebook --- docs/database.ipynb | 54 ++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/docs/database.ipynb b/docs/database.ipynb index e1cc0ad..7c504f6 100644 --- a/docs/database.ipynb +++ b/docs/database.ipynb @@ -10,6 +10,12 @@ "`pgstac` is a PostgreSQL extension that enables STAC metadata management in a PostgreSQL database.\n", "eoAPI is useful to many organizations because the other components are configured to work seamlessly with STAC metadata that is stored in your `pgstac` database.\n", "\n", + "Your STAC metadata generation and ingestion workflow will probably not take place in a notebook but the basic steps will be the same:\n", + "1. Generate STAC collection record\n", + "2. Add new record it to the collections table with `Loader.load_collections`\n", + "3. Generate STAC item records\n", + "4. Add new records to the items table with `Loader.load_items`\n", + "\n", "In this notebook you will learn how to interact with a `pgstac` database:\n", "- Create and upload a collection\n", "- Upload items\n", @@ -35,7 +41,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b616294e1b8243808640bafd0dee8445", + "model_id": "f42f19de526d4256bcf34e8f4a826608", "version_major": 2, "version_minor": 0 }, @@ -49,7 +55,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "54479d978a7744a9b05bdaee1ecc1994", + "model_id": "ccf707573718418bb427908b9a0aba8a", "version_major": 2, "version_minor": 0 }, @@ -63,7 +69,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "9749fc3e41074f34b2ea1303918a3520", + "model_id": "e98721a4af4c4e0989f0eca547d42a04", "version_major": 2, "version_minor": 0 }, @@ -77,7 +83,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "7d37a4c261444dd78a45efefdc88b194", + "model_id": "befc565c86564e6da76c68b5c1cc17e2", "version_major": 2, "version_minor": 0 }, @@ -91,7 +97,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4c2542823b0e42c8821d2055bcf9a78b", + "model_id": "eecfcb0340a24f759c9541fb718c81c6", "version_major": 2, "version_minor": 0 }, @@ -105,7 +111,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4697ebc2d2284dc698bc259f6e983f43", + "model_id": "d22d4fa8131c4e0c8e1375e8944ce3f6", "version_major": 2, "version_minor": 0 }, @@ -171,7 +177,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "6a49d4d2-ca06-4704-84bc-cbeef8103546", "metadata": { "editable": true, @@ -190,7 +196,7 @@ "from pypgstac.load import Loader, Methods\n", "from shapely.geometry import Point\n", "\n", - "\n", + "# deployed stac-fastapi-pgstac API\n", "stac_api_endpoint = \"https://pj44p72a3g.execute-api.us-west-2.amazonaws.com\"" ] }, @@ -206,7 +212,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "1a09b4e5-1727-4ee2-96ef-e0772267829d", "metadata": {}, "outputs": [ @@ -262,7 +268,7 @@ " \n", "
  • \n", " id\n", - " \"hrodmn-sentinel-2-c1-l2a\"\n", + " \"test-sentinel-2-c1-l2a\"\n", "
  • \n", " \n", " \n", @@ -453,10 +459,10 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -607,9 +613,11 @@ ] }, { - "cell_type": "markdown", - "id": "efc572c0-931f-409e-a4bb-4749c587d9f1", + "cell_type": "code", + "execution_count": null, + "id": "a410af0b-6d3c-4a8a-87ee-b16265afcd6a", "metadata": {}, + "outputs": [], "source": [ "# override the collection id to match your new collection\n", "for item in items:\n", @@ -677,7 +685,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 6, "id": "ba5f6278-4d92-4386-af1d-94ca5aed6c30", "metadata": {}, "outputs": [ @@ -686,9 +694,9 @@ "text/html": [ "\n", " " + "" ] }, - "execution_count": 26, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -709,8 +717,8 @@ "\n", "IFrame(\n", " f\"https://radiantearth.github.io/stac-browser/#/external/{stac_api_endpoint}/collections/{my_collection.id}\",\n", - " 900,\n", - " 500,\n", + " 1500,\n", + " 1000,\n", ")" ] }, @@ -758,7 +766,7 @@ "new_n_items = db.query_one(\n", " f\"SELECT COUNT(*) FROM items where collection = '{my_collection.id}';\"\n", ")\n", - "print(f\"there are now {new_n_items} items\")" + "print(f\"now there are {new_n_items} items\")" ] } ], From a515bf0f5cf84b5aeab183b0f3deed65df07e1cd Mon Sep 17 00:00:00 2001 From: hrodmn Date: Fri, 18 Apr 2025 09:27:44 -0500 Subject: [PATCH 3/4] rename database notebook --- docs/{database.ipynb => 02-database.ipynb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/{database.ipynb => 02-database.ipynb} (100%) diff --git a/docs/database.ipynb b/docs/02-database.ipynb similarity index 100% rename from docs/database.ipynb rename to docs/02-database.ipynb From cb4667bb379a326c9f57e34c5a798343a886961b Mon Sep 17 00:00:00 2001 From: hrodmn Date: Mon, 21 Apr 2025 10:52:30 -0500 Subject: [PATCH 4/4] add instructions for querying pgstac with pypgstac --- docs/02-database.ipynb | 8156 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 7968 insertions(+), 188 deletions(-) diff --git a/docs/02-database.ipynb b/docs/02-database.ipynb index 7c504f6..b4e62b0 100644 --- a/docs/02-database.ipynb +++ b/docs/02-database.ipynb @@ -5,17 +5,19 @@ "id": "9edbdd3b-5b35-4bbb-9e15-e5152260aa24", "metadata": {}, "source": [ - "# The Database: `pgstac`\n", + "# 2. The Database: pgstac\n", "\n", - "`pgstac` is a PostgreSQL extension that enables STAC metadata management in a PostgreSQL database.\n", - "eoAPI is useful to many organizations because the other components are configured to work seamlessly with STAC metadata that is stored in your `pgstac` database.\n", + "pgstac is a PostgreSQL extension that enables STAC metadata management in a PostgreSQL database.\n", + "eoAPI is useful to many organizations because the other components are configured to work seamlessly with STAC metadata that is stored in your pgstac database.\n", "\n", - "Your STAC metadata generation and ingestion workflow will probably not take place in a notebook but the basic steps will be the same:\n", + "**pypgstac** is a Python package for interacting with a pgstac database. You will learn how to use pypgstac to perform the following operations on a pgstac database:\n", "1. Generate STAC collection record\n", "2. Add new record it to the collections table with `Loader.load_collections`\n", "3. Generate STAC item records\n", "4. Add new records to the items table with `Loader.load_items`\n", "\n", + "Your STAC metadata generation and ingestion workflow will probably not take place in a notebook but the basic steps will be the same!\n", + "\n", "In this notebook you will learn how to interact with a `pgstac` database:\n", "- Create and upload a collection\n", "- Upload items\n", @@ -26,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 23, "id": "196e7c1d-b82b-4d66-bf96-4942cd02392c", "metadata": { "editable": true, @@ -41,7 +43,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "f42f19de526d4256bcf34e8f4a826608", + "model_id": "b3468380069e4e8695dfcbcc980ae450", "version_major": 2, "version_minor": 0 }, @@ -55,7 +57,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ccf707573718418bb427908b9a0aba8a", + "model_id": "702853028aef4a3caafeaa666dcced58", "version_major": 2, "version_minor": 0 }, @@ -69,7 +71,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e98721a4af4c4e0989f0eca547d42a04", + "model_id": "8ff11e4023684377be6da95dcc4eb433", "version_major": 2, "version_minor": 0 }, @@ -83,7 +85,35 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "befc565c86564e6da76c68b5c1cc17e2", + "model_id": "5604c7f519894306bc60f47bfd2b6969", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Text(value='pgstac_user', description='db user:', placeholder='Enter database username')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "0b2d19020bbf406d85697b4e5c021701", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Text(value='', description='db password:', placeholder='Enter database password')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1b39c69c596544118df5c3a9ed053690", "version_major": 2, "version_minor": 0 }, @@ -97,12 +127,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "eecfcb0340a24f759c9541fb718c81c6", + "model_id": "54941edb42034597b3e41624b6df2564", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Text(value='pgstac_user', description='db user:', placeholder='Enter database username')" + "Text(value='5432', description='db port:', placeholder='Enter database port')" ] }, "metadata": {}, @@ -111,12 +141,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d22d4fa8131c4e0c8e1375e8944ce3f6", + "model_id": "2bf96b244897464a8e59d0decf57ce26", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Text(value='', description='db password:', placeholder='Enter database password')" + "Text(value='pgstac', description='db dbname:', placeholder='Enter database dbname')" ] }, "metadata": {}, @@ -124,6 +154,8 @@ } ], "source": [ + "import os\n", + "\n", "import ipywidgets as widgets\n", "from IPython.display import display\n", "\n", @@ -147,37 +179,52 @@ " description=\"longitude:\",\n", " disabled=False,\n", ")\n", - "db_host_input = widgets.Text(\n", - " value=\"\",\n", - " placeholder=\"Enter database host address\",\n", - " description=\"db host:\",\n", - " disabled=False,\n", - ")\n", + "\n", "db_user_input = widgets.Text(\n", - " value=\"pgstac_user\",\n", + " value=os.getenv(\"POSTGRES_USER\", \"pgstac_user\"),\n", " placeholder=\"Enter database username\",\n", " description=\"db user:\",\n", " disabled=False,\n", ")\n", "db_password_input = widgets.Text(\n", - " value=\"\",\n", + " value=os.getenv(\"POSTGRES_PASSWORD\", \"\"),\n", " placeholder=\"Enter database password\",\n", " description=\"db password:\",\n", " disabled=False,\n", ")\n", + "db_host_input = widgets.Text(\n", + " value=os.getenv(\"POSTGRES_HOST\", \"\"),\n", + " placeholder=\"Enter database host address\",\n", + " description=\"db host:\",\n", + " disabled=False,\n", + ")\n", + "db_port_input = widgets.Text(\n", + " value=os.getenv(\"POSTGRES_PORT\", \"5432\"),\n", + " placeholder=\"Enter database port\",\n", + " description=\"db port:\",\n", + " disabled=False,\n", + ")\n", + "db_dbname_input = widgets.Text(\n", + " value=os.getenv(\"POSTGRES_DBNAME\", \"pgstac\"),\n", + " placeholder=\"Enter database dbname\",\n", + " description=\"db dbname:\",\n", + " disabled=False,\n", + ")\n", "\n", "# Display the widgets\n", "display(username_input)\n", "display(lat_input)\n", "display(lon_input)\n", - "display(db_host_input)\n", "display(db_user_input)\n", - "display(db_password_input)" + "display(db_password_input)\n", + "display(db_host_input)\n", + "display(db_port_input)\n", + "display(db_dbname_input)" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 24, "id": "6a49d4d2-ca06-4704-84bc-cbeef8103546", "metadata": { "editable": true, @@ -196,8 +243,7 @@ "from pypgstac.load import Loader, Methods\n", "from shapely.geometry import Point\n", "\n", - "# deployed stac-fastapi-pgstac API\n", - "stac_api_endpoint = \"https://pj44p72a3g.execute-api.us-west-2.amazonaws.com\"" + "stac_api_endpoint = os.getenv(\"STAC_API_ENDPOINT\")" ] }, { @@ -205,14 +251,14 @@ "id": "e6d710ec-c2b0-4784-a8ce-a9c3694abc35", "metadata": {}, "source": [ - "## Load a collection object\n", + "## 2.1 Load a collection object\n", "\n", "Start by creating a collection that will contain items within ~2 degrees of your provided location between January 1 2025 and April 18 2025." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 29, "id": "1a09b4e5-1727-4ee2-96ef-e0772267829d", "metadata": {}, "outputs": [ @@ -268,7 +314,7 @@ " \n", "
  • \n", " id\n", - " \"test-sentinel-2-c1-l2a\"\n", + " \"hrodmn-sentinel-2-c1-l2a\"\n", "
  • \n", " \n", " \n", @@ -286,7 +332,7 @@ " \n", "
  • \n", " description\n", - " \"my collection\"\n", + " \"hrodmn's personal Sentinel-2 L2A collection\"\n", "
  • \n", " \n", " \n", @@ -326,7 +372,7 @@ " \n", "
  • \n", " 0\n", - " -79.0\n", + " -94.0\n", "
  • \n", " \n", " \n", @@ -339,7 +385,7 @@ " \n", "
  • \n", " 1\n", - " 36.9\n", + " 45.0\n", "
  • \n", " \n", " \n", @@ -352,7 +398,7 @@ " \n", "
  • \n", " 2\n", - " -75.0\n", + " -90.0\n", "
  • \n", " \n", " \n", @@ -365,7 +411,7 @@ " \n", "
  • \n", " 3\n", - " 40.9\n", + " 49.0\n", "
  • \n", " \n", " \n", @@ -459,10 +505,10 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 5, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -474,7 +520,7 @@ "\n", "my_collection = Collection(\n", " id=collection_id,\n", - " description=\"my collection\",\n", + " description=f\"{username_input.value}'s personal Sentinel-2 L2A collection\",\n", " extent=Extent(\n", " spatial=SpatialExtent([[*bbox]]),\n", " temporal=TemporalExtent([temporal_extent]),\n", @@ -526,7 +572,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 31, "id": "7ae2471c-8164-466f-a56d-745213cb7316", "metadata": {}, "outputs": [], @@ -544,7 +590,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 32, "id": "7d71b6b1-70c3-4e5d-9444-f1dddb4e98c3", "metadata": {}, "outputs": [ @@ -554,7 +600,7 @@ "[('hrodmn-sentinel-2-c1-l2a',)]" ] }, - "execution_count": 19, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -568,7 +614,7 @@ "id": "e62c2e30-5e0a-4a9f-9a35-16bdd24e88e8", "metadata": {}, "source": [ - "## Upload items\n", + "## 2.2 Upload items\n", "\n", "You already learned how to create STAC items from scratch in the [STAC metadata](./stac_metadata.ipynb) notebook so you get to take a shortcut for this one. Instead of creating STAC metadata from scratch you can just copy some from an existing STAC collection - this will be sufficient for our exercises during the workshop.\n", "\n", @@ -577,7 +623,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 33, "id": "6a858a2d-57b7-40e9-8235-2c341f43a8de", "metadata": {}, "outputs": [ @@ -585,7 +631,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "1430\n" + "1205\n" ] } ], @@ -614,159 +660,7893 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "id": "a410af0b-6d3c-4a8a-87ee-b16265afcd6a", "metadata": {}, - "outputs": [], - "source": [ - "# override the collection id to match your new collection\n", - "for item in items:\n", - " item.set_collection(my_collection)\n", - "\n", - "items[0]" - ] - }, - { - "cell_type": "markdown", - "id": "05a5a11e-9c20-41c0-aa5c-b078731173d8", - "metadata": {}, - "source": [ - "Now you can use the `load_items` method to upload the list of STAC item dictionaries to the items table in the `pgstac` database. The `insert_ignore` method will upload any items that do not exist in the table and skip records that already exist." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "82443eb2-0d59-46b2-9178-25acb3d0593e", - "metadata": {}, - "outputs": [], - "source": [ - "loader.load_items([item.to_dict() for item in items], insert_mode=Methods.insert_ignore)" - ] - }, - { - "cell_type": "markdown", - "id": "680a5d26-05c0-4cf9-ac7a-ccc555675a18", - "metadata": {}, - "source": [ - "Hooray you uploaded some items! Now run a query to verify that the records landed in the items table." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "48133d14-e301-45b4-973d-1b846a6c503a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "there are 1430 items\n" - ] - } - ], - "source": [ - "n_items = db.query_one(\n", - " f\"SELECT COUNT(*) FROM items where collection = '{my_collection.id}';\"\n", - ")\n", - "print(f\"there are {n_items} items\")" - ] - }, - { - "cell_type": "markdown", - "id": "579370f8-3cde-4f6f-bff2-796aa08344eb", - "metadata": {}, - "source": [ - "Here is your first glimpse of the power of STAC metadata. You just uploaded these items to the database and now you can browse the data in a beautiful interface without doing any more work!\n", - "\n", - "[Radiant Earth](https://radiant.earth/) built a tool called [STAC Browser](https://radiantearth.github.io/stac-browser/#/?.language=en) that is a human-readable interface to a STAC API. Your collection is immediately availble in the STAC API so you can browse it in STAC Browser. Take a tour around the STAC Browser page for your collection. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "ba5f6278-4d92-4386-af1d-94ca5aed6c30", - "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", - " \n", + ".pystac-summary {\n", + " cursor: pointer;\n", + " display: list-item;\n", + " list-style: revert;\n", + " margin-bottom: 0 !important;\n", + "\n", + " .pystac-l {\n", + " padding-left: 0.5em;\n", + " color: rgb(64, 128, 128);\n", + " font-style: italic;\n", + " }\n", + "}\n", + ".pystac-row {\n", + " overflow-wrap: break-word;\n", + " padding-left: .825em;\n", + "\n", + " .pystac-k {\n", + " display: inline-block;\n", + " margin: 0px 0.5em 0px 0px;\n", + " }\n", + " .pystac-v {\n", + " color: rgb(186, 33, 33);\n", + " }\n", + "}\n", + ".pystac-k {\n", + " color: rgb(0, 128, 0);\n", + " font-weight: 700;\n", + "}\n", + "\n", + "
    \n", + "
    \n", + "
      \n", " \n", - " >\n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from IPython.display import IFrame\n", - "\n", - "IFrame(\n", - " f\"https://radiantearth.github.io/stac-browser/#/external/{stac_api_endpoint}/collections/{my_collection.id}\",\n", - " 1500,\n", - " 1000,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "cdd2d506-7dad-48f1-acb4-4188b54c0346", - "metadata": {}, - "source": [ - "## Delete an item\n", - "\n", - "It is less common but you might want to delete a STAC record some day. There are not yet any `pypgstac` functions for doing this but it is relatively easy to do via PostgreSQL query.\n", - "\n", - "Try deleting the last item in the list." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "4c6782bf-b043-49a0-a338-7676ff52d005", - "metadata": {}, - "outputs": [], - "source": [ - "with db.connect() as conn:\n", - " cur = conn.cursor()\n", - " cur.execute(f\"DELETE FROM items where id = '{items[-1].id}';\")\n", - " cur.close()\n", - " conn.commit()" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "d3030aa7-4aaa-4ead-8589-b88759968f99", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "there are now 1429 items\n" - ] - } - ], - "source": [ - "new_n_items = db.query_one(\n", - " f\"SELECT COUNT(*) FROM items where collection = '{my_collection.id}';\"\n", - ")\n", - "print(f\"now there are {new_n_items} items\")" + " \n", + " \n", + "
    • \n", + " type\n", + " \"Feature\"\n", + "
    • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    • \n", + " stac_version\n", + " \"1.1.0\"\n", + "
    • \n", + " \n", + " \n", + " \n", + " \n", + "
    • \n", + " stac_extensions[] 10 items\n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 0\n", + " \"https://stac-extensions.github.io/eo/v1.1.0/schema.json\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 1\n", + " \"https://stac-extensions.github.io/file/v2.1.0/schema.json\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 2\n", + " \"https://stac-extensions.github.io/grid/v1.1.0/schema.json\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 3\n", + " \"https://stac-extensions.github.io/mgrs/v1.0.0/schema.json\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 4\n", + " \"https://stac-extensions.github.io/processing/v1.1.0/schema.json\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 5\n", + " \"https://stac-extensions.github.io/projection/v2.0.0/schema.json\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 6\n", + " \"https://stac-extensions.github.io/raster/v1.1.0/schema.json\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 7\n", + " \"https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 8\n", + " \"https://stac-extensions.github.io/storage/v1.0.0/schema.json\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 9\n", + " \"https://stac-extensions.github.io/view/v1.0.0/schema.json\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
    • \n", + " \n", + " \n", + " \n", + " \n", + "
    • \n", + " id\n", + " \"S2B_T15TXK_20250417T170051_L2A\"\n", + "
    • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    • \n", + " geometry\n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " type\n", + " \"Polygon\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " coordinates[] 1 items\n", + " \n", + "
          \n", + " \n", + " \n", + "
        • \n", + " 0[] 5 items\n", + " \n", + "
            \n", + " \n", + " \n", + "
          • \n", + " 0[] 2 items\n", + " \n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " 0\n", + " -91.04160367127255\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + " \n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " 1\n", + " 45.137034349441834\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + " \n", + "
          • \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + "
          • \n", + " 1[] 2 items\n", + " \n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " 0\n", + " -91.37153573660719\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + " \n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " 1\n", + " 44.15376770955927\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + " \n", + "
          • \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + "
          • \n", + " 2[] 2 items\n", + " \n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " 0\n", + " -90.37727088068323\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + " \n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " 1\n", + " 44.135260005438454\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + " \n", + "
          • \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + "
          • \n", + " 3[] 2 items\n", + " \n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " 0\n", + " -90.33239204379824\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + " \n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " 1\n", + " 45.122663184970506\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + " \n", + "
          • \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + "
          • \n", + " 4[] 2 items\n", + " \n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " 0\n", + " -91.04160367127255\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + " \n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " 1\n", + " 45.137034349441834\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", + " bbox[] 4 items\n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 0\n", + " -91.371536\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 1\n", + " 44.13526\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 2\n", + " -90.332392\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 3\n", + " 45.137034\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
    • \n", + " \n", + " \n", + " \n", + " \n", + "
    • \n", + " properties\n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " created\n", + " \"2025-04-17T22:14:12.641Z\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " platform\n", + " \"sentinel-2b\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " constellation\n", + " \"sentinel-2\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " instruments[] 1 items\n", + " \n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " 0\n", + " \"msi\"\n", + "
        • \n", + " \n", + " \n", + " \n", + "
        \n", + " \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " eo:cloud_cover\n", + " 67.094147\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " proj:centroid\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " lat\n", + " 44.60973\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " lon\n", + " -90.78602\n", + "
        • \n", + " \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " mgrs:utm_zone\n", + " 15\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " mgrs:latitude_band\n", + " \"T\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " mgrs:grid_square\n", + " \"XK\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " grid:code\n", + " \"MGRS-15TXK\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " view:azimuth\n", + " 106.2286391063633\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " view:incidence_angle\n", + " 9.170521123835382\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " view:sun_azimuth\n", + " 153.666198048965\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " view:sun_elevation\n", + " 53.5455128231177\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:tile_id\n", + " \"S2B_OPER_MSI_L2A_TL_2BPS_20250417T205117_A042380_T15TXK_N05.11\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:degraded_msi_data_percentage\n", + " 0.0267\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:nodata_pixel_percentage\n", + " 38.269615\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:saturated_defective_pixel_percentage\n", + " 0\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:cloud_shadow_percentage\n", + " 1.165042\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:vegetation_percentage\n", + " 1.691512\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:not_vegetated_percentage\n", + " 27.563539\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:water_percentage\n", + " 0.04955\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:unclassified_percentage\n", + " 2.383836\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:medium_proba_clouds_percentage\n", + " 15.105227\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:high_proba_clouds_percentage\n", + " 34.076107\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:thin_cirrus_percentage\n", + " 17.912817\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:snow_ice_percentage\n", + " 0\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:product_type\n", + " \"S2MSI2A\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:processing_baseline\n", + " \"05.11\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:product_uri\n", + " \"S2B_MSIL2A_20250417T164839_N0511_R026_T15TXK_20250417T205117.SAFE\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:generation_time\n", + " \"2025-04-17T20:51:17.000000Z\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:datatake_id\n", + " \"GS2B_20250417T164839_042380_N05.11\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:datatake_type\n", + " \"INS-NOBS\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:datastrip_id\n", + " \"S2B_OPER_MSI_L2A_DS_2BPS_20250417T205117_S20250417T170051_N05.11\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " s2:reflectance_conversion_factor\n", + " 0.994711640627317\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " datetime\n", + " \"2025-04-17T17:01:22.226000Z\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " earthsearch:payload_id\n", + " \"roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/d98c430b8314231290bc2fab4ab5c7a0\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " storage:platform\n", + " \"AWS\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " storage:region\n", + " \"us-west-2\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " storage:requester_pays\n", + " False\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " processing:software\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " sentinel-2-c1-l2a-to-stac\n", + " \"v2024.02.01\"\n", + "
        • \n", + " \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " updated\n", + " \"2025-04-17T22:14:12.641Z\"\n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " proj:code\n", + " \"EPSG:32615\"\n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + "
    • \n", + " \n", + " \n", + " \n", + " \n", + "
    • \n", + " links[] 7 items\n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 0\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " rel\n", + " \"self\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T15TXK_20250417T170051_L2A\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"application/geo+json\"\n", + "
        • \n", + " \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 1\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " rel\n", + " \"canonical\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/S2B_T15TXK_20250417T170051_L2A.json\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"application/json\"\n", + "
        • \n", + " \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 2\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " rel\n", + " \"via\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"s3://sentinel-s2-l2a/tiles/15/T/XK/2025/4/17/0/metadata.xml\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"application/xml\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Granule Metadata in Sinergize RODA Archive\"\n", + "
        • \n", + " \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 3\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " rel\n", + " \"parent\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"application/json\"\n", + "
        • \n", + " \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 4\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " rel\n", + " \"root\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://earth-search.aws.element84.com/v1\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"application/json\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Earth Search by Element 84\"\n", + "
        • \n", + " \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 5\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " rel\n", + " \"thumbnail\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T15TXK_20250417T170051_L2A/thumbnail\"\n", + "
        • \n", + " \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " 6\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " rel\n", + " \"collection\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " None\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"application/json\"\n", + "
        • \n", + " \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + " \n", + "
    • \n", + " \n", + " \n", + " \n", + " \n", + "
    • \n", + " assets\n", + "
        \n", + " \n", + " \n", + " \n", + "
      • \n", + " red\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B04.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Red - 10m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B04\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"red\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.665\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.038\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 10\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 10980\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 10980\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 10\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -10\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 10\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220bc9671d22931eb0d2c0804872e86c923a1d89ca3e74219eebe0b2a07cedcb945\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 134108289\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " green\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B03.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Green - 10m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B03\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"green\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.56\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.045\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 10\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 10980\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 10980\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 10\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -10\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 10\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220c65c0da45550852a9469a8237aca4b80fb717389d339688efb91e856ae18fae5\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 133530287\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " blue\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B02.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Blue - 10m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B02\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"blue\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.49\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.098\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 10\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 10980\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 10980\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 10\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -10\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 10\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220117bccd7b673a08dea75610c24bcf86a3d7720160e5d13ad82e654bda505eaf3\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 134333114\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " visual\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/TCI.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"True color image\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 3 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B04\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"red\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.665\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.038\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B03\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"green\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.56\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.045\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B02\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"blue\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.49\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.098\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 3 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint8\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 10\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint8\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 10\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint8\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 10\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 10\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 10980\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 10980\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 10\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -10\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220fe372b2cd7ae6693787ab84a30e4dc1045205f36181a5d141f0ae4595cc3a803\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 129302021\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"visual\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " nir\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B08.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"NIR 1 - 10m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B08\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"nir\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.842\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.145\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 10\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 10980\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 10980\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 10\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -10\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 10\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"12208670874ac4e82a6e5a1ff23d5f95f5dbeb371e64d6c2f5ec86f9b2adb2b7600c\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 131808398\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " swir22\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B12.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"SWIR 2.2μm - 20m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B12\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"swir22\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 2.19\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.242\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 20\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220a0f445d1203aad21a6d5a970918331b5ac41dff117200f94b32dad1e42a1a495\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 36919364\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " rededge2\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B06.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Red Edge 2 - 20m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B06\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"rededge\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.74\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.018\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 20\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220a9de7d7b59d13bb4327551bd53024f5437bba453250244f7a02074e7626c2953\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 37837353\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " rededge3\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B07.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Red Edge 3 - 20m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B07\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"rededge\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.783\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.028\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 20\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"122056daf1949f9dd838b5b8d8042b98fb543192ba0f9ab4c9b82dcc32b16ce12989\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 37865807\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " rededge1\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B05.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Red Edge 1 - 20m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B05\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"rededge\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.704\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.019\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 20\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"122022573dab24b68dba0a45283a982db1512f9810d2cac6319aa756ebc119c0b079\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 37833718\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " swir16\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B11.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"SWIR 1.6μm - 20m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B11\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"swir16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 1.61\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.143\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 20\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"12203cdd3545ee35f230b0e53a1ac40687daa09542c768604da3d5ed39ca33d54bc0\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 37368371\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " wvp\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/WVP.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Water Vapour (WVP)\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 20\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " unit\n", + " \"cm\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220dcdb9d38ad122aa27649e3080df3c6badc8603a023686484179a5234ff6811c8\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 10072854\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " nir08\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B8A.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"NIR 2 - 20m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B8A\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"nir08\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.865\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.033\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 20\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"12209b0e114a9ced2fcbb8996195c475d6092c97287c00ecda58f481d44e74fd4e58\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 37844394\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " scl\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/SCL.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Scene classification map (SCL)\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 20\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint8\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220444630e1ad3a76a6e9724c753fcadaaefc135ce0f5bde094d5374c5b786fb9c2\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 1645249\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " aot\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/AOT.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Aerosol optical thickness (AOT)\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 20\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220341a3293f1899f00131224dfde2d2b2c2d6e6852594863a6496b25aeff0a7ef9\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 1521584\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " coastal\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B01.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Coastal - 60m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B01\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"coastal\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.443\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.027\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 60\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 1830\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 1830\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 60\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -60\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 60\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"12206eba1240cec8cf65bbf1c4b3e238d30ef154f50a65becc3f6ddb0a8be00880ac\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 4372913\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " nir09\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B09.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"NIR 3 - 60m\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B09\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"nir09\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.945\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.026\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 60\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 1830\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 1830\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 60\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -60\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint16\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 60\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " scale\n", + " 0.0001\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " offset\n", + " -0.1\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"12209b96b741483cc4dfd09390b2719dead248aebf833bb983fc59456f3b8c61b1bd\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 4475010\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"reflectance\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " cloud\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/CLD_20m.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Cloud Probabilities\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " gsd\n", + " 20\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint8\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220d5acc6d6ffe9780ed315e2c29204dd90b123f94e66052844d0c56db913ca31c9\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 5207828\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"cloud\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " snow\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/SNW_20m.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Snow Probabilities\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:shape[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 5490\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " proj:transform[] 6 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " 20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + " 600000\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 3\n", + " 0\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 4\n", + " -20\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 5\n", + " 5000040\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + "
        • \n", + " raster:bands[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " nodata\n", + " 0\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " data_type\n", + " \"uint8\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " spatial_resolution\n", + " 20\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"122034c567ebd1c5c3c7b2c2c67aec97278b287b454bf83ad6361e4d7241a62a968a\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 56824\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 2 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"data\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + " \"snow-ice\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " preview\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/L2A_PVI.tif\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/tiff; application=geotiff; profile=cloud-optimized\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"True color preview\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " eo:bands[] 3 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B04\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"red\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.665\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.038\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 1\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B03\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"green\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.56\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.045\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 2\n", + "
              \n", + " \n", + " \n", + " \n", + "
            • \n", + " name\n", + " \"B02\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " common_name\n", + " \"blue\"\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " center_wavelength\n", + " 0.49\n", + "
            • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
            • \n", + " full_width_half_max\n", + " 0.098\n", + "
            • \n", + " \n", + " \n", + " \n", + "
            \n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220d5b775e51e4acb6bc64fa641e13e3d1fab4b087ca1931a6cd512aea22d4d75c4\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 158802\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"overview\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " granule_metadata\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/metadata.xml\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"application/xml\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"12205fdeb80dfbe1a6843c2d8b69b0b3b0831a741179b79e10af7678420e2dc74dbe\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 369199\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"metadata\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " tileinfo_metadata\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/tileInfo.json\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"application/json\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"12207874af8e014f1b08ef672a25ecc1255423922aba0e11596df89e81d09424158e\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 1514\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"metadata\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " product_metadata\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/product_metadata.xml\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"application/xml\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220e9e1e841fb6278e8dc0b49d429e99be15613a93ce1c912322485bf1b16600475\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 55001\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"metadata\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
      • \n", + " thumbnail\n", + "
          \n", + " \n", + " \n", + " \n", + "
        • \n", + " href\n", + " \"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/L2A_PVI.jpg\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " type\n", + " \"image/jpeg\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " title\n", + " \"Thumbnail of preview image\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:checksum\n", + " \"1220b7a5d2409293ba9437913e9a808a7edaf20e99ef3fbad6e07c8eec65d05b2515\"\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " file:size\n", + " 27914\n", + "
        • \n", + " \n", + " \n", + " \n", + " \n", + "
        • \n", + " roles[] 1 items\n", + " \n", + "
            \n", + " \n", + " \n", + " \n", + "
          • \n", + " 0\n", + " \"thumbnail\"\n", + "
          • \n", + " \n", + " \n", + " \n", + "
          \n", + " \n", + "
        • \n", + " \n", + " \n", + "
        \n", + "
      • \n", + " \n", + " \n", + " \n", + "
      \n", + "
    • \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    • \n", + " collection\n", + " \"hrodmn-sentinel-2-c1-l2a\"\n", + "
    • \n", + " \n", + " \n", + " \n", + "
    \n", + "
    \n", + "
    " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# override the collection id to match your new collection\n", + "for item in items:\n", + " item.set_collection(my_collection)\n", + "\n", + "items[0]" + ] + }, + { + "cell_type": "markdown", + "id": "05a5a11e-9c20-41c0-aa5c-b078731173d8", + "metadata": {}, + "source": [ + "Now you can use the `load_items` method to upload the list of STAC item dictionaries to the items table in the `pgstac` database. The `insert_ignore` method will upload any items that do not exist in the table and skip records that already exist." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "82443eb2-0d59-46b2-9178-25acb3d0593e", + "metadata": {}, + "outputs": [], + "source": [ + "loader.load_items([item.to_dict() for item in items], insert_mode=Methods.insert_ignore)" + ] + }, + { + "cell_type": "markdown", + "id": "680a5d26-05c0-4cf9-ac7a-ccc555675a18", + "metadata": {}, + "source": [ + "Hooray you uploaded some items! Now run a query to verify that the records landed in the items table." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "48133d14-e301-45b4-973d-1b846a6c503a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "there are 1205 items\n" + ] + } + ], + "source": [ + "n_items = db.query_one(\n", + " f\"SELECT COUNT(*) FROM items where collection = '{my_collection.id}';\"\n", + ")\n", + "print(f\"there are {n_items} items\")" + ] + }, + { + "cell_type": "markdown", + "id": "579370f8-3cde-4f6f-bff2-796aa08344eb", + "metadata": {}, + "source": [ + "Here is your first glimpse of the power of STAC metadata. You just uploaded these items to the database and now you can browse the data in a beautiful interface without doing any more work!\n", + "\n", + "[Radiant Earth](https://radiant.earth/) built a tool called [STAC Browser](https://radiantearth.github.io/stac-browser/#/?.language=en) that is a human-readable interface to a STAC API. Your collection is immediately availble in the STAC API so you can browse it in STAC Browser. Take a tour around the STAC Browser page for your collection. " + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "ba5f6278-4d92-4386-af1d-94ca5aed6c30", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import IFrame\n", + "\n", + "IFrame(\n", + " f\"https://radiantearth.github.io/stac-browser/#/external/{stac_api_endpoint}/collections/{my_collection.id}\",\n", + " 1200,\n", + " 800,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "cdd2d506-7dad-48f1-acb4-4188b54c0346", + "metadata": {}, + "source": [ + "## 2.3 Delete an item\n", + "\n", + "It is less common but you might want to delete a STAC record some day. There are not yet any `pypgstac` functions for doing this but it is relatively easy to do via PostgreSQL query.\n", + "\n", + "Try deleting the last item in the list." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "4c6782bf-b043-49a0-a338-7676ff52d005", + "metadata": {}, + "outputs": [], + "source": [ + "with db.connect() as conn:\n", + " cur = conn.cursor()\n", + " cur.execute(f\"DELETE FROM items where id = '{items[-1].id}';\")\n", + " cur.close()\n", + " conn.commit()" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "d3030aa7-4aaa-4ead-8589-b88759968f99", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "now there are 1204 items\n" + ] + } + ], + "source": [ + "new_n_items = db.query_one(\n", + " f\"SELECT COUNT(*) FROM items where collection = '{my_collection.id}';\"\n", + ")\n", + "print(f\"now there are {new_n_items} items\")" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "dd34e829-0fc7-4abd-88ed-6fce8e73d1bf", + "metadata": {}, + "outputs": [], + "source": [ + "# put it back :)\n", + "loader.load_items([items[-1].to_dict()], insert_mode=Methods.insert_ignore)" + ] + }, + { + "cell_type": "markdown", + "id": "14f29b16-f8f3-4533-af79-98b471c21671", + "metadata": {}, + "source": [ + "## 2.4 Search with pypgstac\n", + "\n", + "It is not going to be the best option for searching a pgstac database in most cases (you should probably send a request to stac-fastapi-pgstac), but you can use pypgstac to search for items. You can provide a JSON request body like you would provide to a STAC API in the `query` arg of `PgstacDB.search`:" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "7137a06e-135c-478a-a79f-d7134bd48d3d", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"type\":\"FeatureCollection\",\"links\":[{\"rel\":\"root\",\"href\":\".\",\"type\":\"application/json\"},{\"rel\":\"self\",\"href\":\"./search\",\"type\":\"application/json\"},{\"rel\":\"next\",\"href\":\"./search?token=next:hrodmn-sentinel-2-c1-l2a:S2B_T15TXK_20250417T170051_L2A\",\"type\":\"application/geo+json\",\"method\":\"GET\"}],\"features\":[{\"id\":\"S2B_T15TXK_20250417T170051_L2A\",\"bbox\":[-91.371536,44.13526,-90.332392,45.137034],\"type\":\"Feature\",\"links\":[{\"rel\":\"self\",\"href\":\"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T15TXK_20250417T170051_L2A\",\"type\":\"application/geo+json\"},{\"rel\":\"canonical\",\"href\":\"s3://e84-earth-search-sentinel-data/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/S2B_T15TXK_20250417T170051_L2A.json\",\"type\":\"application/json\"},{\"rel\":\"via\",\"href\":\"s3://sentinel-s2-l2a/tiles/15/T/XK/2025/4/17/0/metadata.xml\",\"type\":\"application/xml\",\"title\":\"Granule Metadata in Sinergize RODA Archive\"},{\"rel\":\"parent\",\"href\":\"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a\",\"type\":\"application/json\"},{\"rel\":\"root\",\"href\":\"https://earth-search.aws.element84.com/v1\",\"type\":\"application/json\",\"title\":\"Earth Search by Element 84\"},{\"rel\":\"thumbnail\",\"href\":\"https://earth-search.aws.element84.com/v1/collections/sentinel-2-c1-l2a/items/S2B_T15TXK_20250417T170051_L2A/thumbnail\"},{\"rel\":\"collection\",\"type\":\"application/json\"}],\"assets\":{\"aot\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/AOT.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\"],\"title\":\"Aerosol optical thickness (AOT)\",\"file:size\":1521584,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.001,\"nodata\":0,\"offset\":0,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"1220341a3293f1899f00131224dfde2d2b2c2d6e6852594863a6496b25aeff0a7ef9\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"nir\":{\"gsd\":10,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B08.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"NIR 1 - 10m\",\"eo:bands\":[{\"name\":\"B08\",\"common_name\":\"nir\",\"center_wavelength\":0.842,\"full_width_half_max\":0.145}],\"file:size\":131808398,\"proj:shape\":[10980,10980],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":10}],\"file:checksum\":\"12208670874ac4e82a6e5a1ff23d5f95f5dbeb371e64d6c2f5ec86f9b2adb2b7600c\",\"proj:transform\":[10,0,600000,0,-10,5000040]},\"red\":{\"gsd\":10,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B04.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Red - 10m\",\"eo:bands\":[{\"name\":\"B04\",\"common_name\":\"red\",\"center_wavelength\":0.665,\"full_width_half_max\":0.038}],\"file:size\":134108289,\"proj:shape\":[10980,10980],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":10}],\"file:checksum\":\"1220bc9671d22931eb0d2c0804872e86c923a1d89ca3e74219eebe0b2a07cedcb945\",\"proj:transform\":[10,0,600000,0,-10,5000040]},\"scl\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/SCL.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\"],\"title\":\"Scene classification map (SCL)\",\"file:size\":1645249,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":20}],\"file:checksum\":\"1220444630e1ad3a76a6e9724c753fcadaaefc135ce0f5bde094d5374c5b786fb9c2\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"wvp\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/WVP.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\"],\"title\":\"Water Vapour (WVP)\",\"file:size\":10072854,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"unit\":\"cm\",\"scale\":0.001,\"nodata\":0,\"offset\":0,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"1220dcdb9d38ad122aa27649e3080df3c6badc8603a023686484179a5234ff6811c8\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"blue\":{\"gsd\":10,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B02.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Blue - 10m\",\"eo:bands\":[{\"name\":\"B02\",\"common_name\":\"blue\",\"center_wavelength\":0.49,\"full_width_half_max\":0.098}],\"file:size\":134333114,\"proj:shape\":[10980,10980],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":10}],\"file:checksum\":\"1220117bccd7b673a08dea75610c24bcf86a3d7720160e5d13ad82e654bda505eaf3\",\"proj:transform\":[10,0,600000,0,-10,5000040]},\"snow\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/SNW_20m.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"snow-ice\"],\"title\":\"Snow Probabilities\",\"file:size\":56824,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":20}],\"file:checksum\":\"122034c567ebd1c5c3c7b2c2c67aec97278b287b454bf83ad6361e4d7241a62a968a\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"cloud\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/CLD_20m.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"cloud\"],\"title\":\"Cloud Probabilities\",\"file:size\":5207828,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":20}],\"file:checksum\":\"1220d5acc6d6ffe9780ed315e2c29204dd90b123f94e66052844d0c56db913ca31c9\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"green\":{\"gsd\":10,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B03.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Green - 10m\",\"eo:bands\":[{\"name\":\"B03\",\"common_name\":\"green\",\"center_wavelength\":0.56,\"full_width_half_max\":0.045}],\"file:size\":133530287,\"proj:shape\":[10980,10980],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":10}],\"file:checksum\":\"1220c65c0da45550852a9469a8237aca4b80fb717389d339688efb91e856ae18fae5\",\"proj:transform\":[10,0,600000,0,-10,5000040]},\"nir08\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B8A.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"NIR 2 - 20m\",\"eo:bands\":[{\"name\":\"B8A\",\"common_name\":\"nir08\",\"center_wavelength\":0.865,\"full_width_half_max\":0.033}],\"file:size\":37844394,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"12209b0e114a9ced2fcbb8996195c475d6092c97287c00ecda58f481d44e74fd4e58\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"nir09\":{\"gsd\":60,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B09.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"NIR 3 - 60m\",\"eo:bands\":[{\"name\":\"B09\",\"common_name\":\"nir09\",\"center_wavelength\":0.945,\"full_width_half_max\":0.026}],\"file:size\":4475010,\"proj:shape\":[1830,1830],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":60}],\"file:checksum\":\"12209b96b741483cc4dfd09390b2719dead248aebf833bb983fc59456f3b8c61b1bd\",\"proj:transform\":[60,0,600000,0,-60,5000040]},\"swir16\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B11.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"SWIR 1.6μm - 20m\",\"eo:bands\":[{\"name\":\"B11\",\"common_name\":\"swir16\",\"center_wavelength\":1.61,\"full_width_half_max\":0.143}],\"file:size\":37368371,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"12203cdd3545ee35f230b0e53a1ac40687daa09542c768604da3d5ed39ca33d54bc0\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"swir22\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B12.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"SWIR 2.2μm - 20m\",\"eo:bands\":[{\"name\":\"B12\",\"common_name\":\"swir22\",\"center_wavelength\":2.19,\"full_width_half_max\":0.242}],\"file:size\":36919364,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"1220a0f445d1203aad21a6d5a970918331b5ac41dff117200f94b32dad1e42a1a495\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"visual\":{\"gsd\":10,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/TCI.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"visual\"],\"title\":\"True color image\",\"eo:bands\":[{\"name\":\"B04\",\"common_name\":\"red\",\"center_wavelength\":0.665,\"full_width_half_max\":0.038},{\"name\":\"B03\",\"common_name\":\"green\",\"center_wavelength\":0.56,\"full_width_half_max\":0.045},{\"name\":\"B02\",\"common_name\":\"blue\",\"center_wavelength\":0.49,\"full_width_half_max\":0.098}],\"file:size\":129302021,\"proj:shape\":[10980,10980],\"raster:bands\":[{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":10},{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":10},{\"nodata\":0,\"data_type\":\"uint8\",\"spatial_resolution\":10}],\"file:checksum\":\"1220fe372b2cd7ae6693787ab84a30e4dc1045205f36181a5d141f0ae4595cc3a803\",\"proj:transform\":[10,0,600000,0,-10,5000040]},\"coastal\":{\"gsd\":60,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B01.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Coastal - 60m\",\"eo:bands\":[{\"name\":\"B01\",\"common_name\":\"coastal\",\"center_wavelength\":0.443,\"full_width_half_max\":0.027}],\"file:size\":4372913,\"proj:shape\":[1830,1830],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":60}],\"file:checksum\":\"12206eba1240cec8cf65bbf1c4b3e238d30ef154f50a65becc3f6ddb0a8be00880ac\",\"proj:transform\":[60,0,600000,0,-60,5000040]},\"preview\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/L2A_PVI.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"overview\"],\"title\":\"True color preview\",\"eo:bands\":[{\"name\":\"B04\",\"common_name\":\"red\",\"center_wavelength\":0.665,\"full_width_half_max\":0.038},{\"name\":\"B03\",\"common_name\":\"green\",\"center_wavelength\":0.56,\"full_width_half_max\":0.045},{\"name\":\"B02\",\"common_name\":\"blue\",\"center_wavelength\":0.49,\"full_width_half_max\":0.098}],\"file:size\":158802,\"file:checksum\":\"1220d5b775e51e4acb6bc64fa641e13e3d1fab4b087ca1931a6cd512aea22d4d75c4\"},\"rededge1\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B05.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Red Edge 1 - 20m\",\"eo:bands\":[{\"name\":\"B05\",\"common_name\":\"rededge\",\"center_wavelength\":0.704,\"full_width_half_max\":0.019}],\"file:size\":37833718,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"122022573dab24b68dba0a45283a982db1512f9810d2cac6319aa756ebc119c0b079\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"rededge2\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B06.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Red Edge 2 - 20m\",\"eo:bands\":[{\"name\":\"B06\",\"common_name\":\"rededge\",\"center_wavelength\":0.74,\"full_width_half_max\":0.018}],\"file:size\":37837353,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"1220a9de7d7b59d13bb4327551bd53024f5437bba453250244f7a02074e7626c2953\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"rededge3\":{\"gsd\":20,\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/B07.tif\",\"type\":\"image/tiff; application=geotiff; profile=cloud-optimized\",\"roles\":[\"data\",\"reflectance\"],\"title\":\"Red Edge 3 - 20m\",\"eo:bands\":[{\"name\":\"B07\",\"common_name\":\"rededge\",\"center_wavelength\":0.783,\"full_width_half_max\":0.028}],\"file:size\":37865807,\"proj:shape\":[5490,5490],\"raster:bands\":[{\"scale\":0.0001,\"nodata\":0,\"offset\":-0.1,\"data_type\":\"uint16\",\"spatial_resolution\":20}],\"file:checksum\":\"122056daf1949f9dd838b5b8d8042b98fb543192ba0f9ab4c9b82dcc32b16ce12989\",\"proj:transform\":[20,0,600000,0,-20,5000040]},\"thumbnail\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/L2A_PVI.jpg\",\"type\":\"image/jpeg\",\"roles\":[\"thumbnail\"],\"title\":\"Thumbnail of preview image\",\"file:size\":27914,\"file:checksum\":\"1220b7a5d2409293ba9437913e9a808a7edaf20e99ef3fbad6e07c8eec65d05b2515\"},\"granule_metadata\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/metadata.xml\",\"type\":\"application/xml\",\"roles\":[\"metadata\"],\"file:size\":369199,\"file:checksum\":\"12205fdeb80dfbe1a6843c2d8b69b0b3b0831a741179b79e10af7678420e2dc74dbe\"},\"product_metadata\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/product_metadata.xml\",\"type\":\"application/xml\",\"roles\":[\"metadata\"],\"file:size\":55001,\"file:checksum\":\"1220e9e1e841fb6278e8dc0b49d429e99be15613a93ce1c912322485bf1b16600475\"},\"tileinfo_metadata\":{\"href\":\"https://e84-earth-search-sentinel-data.s3.us-west-2.amazonaws.com/sentinel-2-c1-l2a/15/T/XK/2025/4/S2B_T15TXK_20250417T170051_L2A/tileInfo.json\",\"type\":\"application/json\",\"roles\":[\"metadata\"],\"file:size\":1514,\"file:checksum\":\"12207874af8e014f1b08ef672a25ecc1255423922aba0e11596df89e81d09424158e\"}},\"geometry\":{\"type\":\"Polygon\",\"coordinates\":[[[-91.04160367127255,45.137034349441834],[-91.37153573660719,44.15376770955927],[-90.37727088068323,44.135260005438454],[-90.33239204379824,45.122663184970506],[-91.04160367127255,45.137034349441834]]]},\"collection\":\"hrodmn-sentinel-2-c1-l2a\",\"properties\":{\"created\":\"2025-04-17T22:14:12.641Z\",\"updated\":\"2025-04-17T22:14:12.641Z\",\"datetime\":\"2025-04-17T17:01:22.226000Z\",\"platform\":\"sentinel-2b\",\"grid:code\":\"MGRS-15TXK\",\"proj:code\":\"EPSG:32615\",\"s2:tile_id\":\"S2B_OPER_MSI_L2A_TL_2BPS_20250417T205117_A042380_T15TXK_N05.11\",\"instruments\":[\"msi\"],\"view:azimuth\":106.2286391063633,\"constellation\":\"sentinel-2\",\"mgrs:utm_zone\":15,\"proj:centroid\":{\"lat\":44.60973,\"lon\":-90.78602},\"eo:cloud_cover\":67.094147,\"s2:datatake_id\":\"GS2B_20250417T164839_042380_N05.11\",\"s2:product_uri\":\"S2B_MSIL2A_20250417T164839_N0511_R026_T15TXK_20250417T205117.SAFE\",\"storage:region\":\"us-west-2\",\"s2:datastrip_id\":\"S2B_OPER_MSI_L2A_DS_2BPS_20250417T205117_S20250417T170051_N05.11\",\"s2:product_type\":\"S2MSI2A\",\"mgrs:grid_square\":\"XK\",\"s2:datatake_type\":\"INS-NOBS\",\"storage:platform\":\"AWS\",\"view:sun_azimuth\":153.666198048965,\"mgrs:latitude_band\":\"T\",\"s2:generation_time\":\"2025-04-17T20:51:17.000000Z\",\"view:sun_elevation\":53.5455128231177,\"processing:software\":{\"sentinel-2-c1-l2a-to-stac\":\"v2024.02.01\"},\"s2:water_percentage\":0.04955,\"view:incidence_angle\":9.170521123835382,\"earthsearch:payload_id\":\"roda-sentinel-2-c1-l2a/workflow-sentinel-2-c1-l2a-to-stac/d98c430b8314231290bc2fab4ab5c7a0\",\"s2:processing_baseline\":\"05.11\",\"s2:snow_ice_percentage\":0,\"storage:requester_pays\":false,\"s2:vegetation_percentage\":1.691512,\"s2:thin_cirrus_percentage\":17.912817,\"s2:cloud_shadow_percentage\":1.165042,\"s2:nodata_pixel_percentage\":38.269615,\"s2:unclassified_percentage\":2.383836,\"s2:not_vegetated_percentage\":27.563539,\"s2:degraded_msi_data_percentage\":0.0267,\"s2:high_proba_clouds_percentage\":34.076107,\"s2:reflectance_conversion_factor\":0.994711640627317,\"s2:medium_proba_clouds_percentage\":15.105227,\"s2:saturated_defective_pixel_percentage\":0},\"stac_version\":\"1.1.0\",\"stac_extensions\":[\"https://stac-extensions.github.io/eo/v1.1.0/schema.json\",\"https://stac-extensions.github.io/file/v2.1.0/schema.json\",\"https://stac-extensions.github.io/grid/v1.1.0/schema.json\",\"https://stac-extensions.github.io/mgrs/v1.0.0/schema.json\",\"https://stac-extensions.github.io/processing/v1.1.0/schema.json\",\"https://stac-extensions.github.io/projection/v2.0.0/schema.json\",\"https://stac-extensions.github.io/raster/v1.1.0/schema.json\",\"https://stac-extensions.github.io/sentinel-2/v1.0.0/schema.json\",\"https://stac-extensions.github.io/storage/v1.0.0/schema.json\",\"https://stac-extensions.github.io/view/v1.0.0/schema.json\"]}],\"numberReturned\":1}\n" + ] + } + ], + "source": [ + "search_results = db.search(query={\"collections\": [my_collection.id], \"limit\": 1})\n", + "\n", + "print(search_results)" ] } ],