From db403b9ab4047931c439c787f191fb558c23fc43 Mon Sep 17 00:00:00 2001 From: Scartography Date: Thu, 31 Jul 2025 10:57:24 +0200 Subject: [PATCH 01/10] start somewhere, else I wll never actually work on this --- README.md | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e4091919..08379a87 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,32 @@ -# Mapchete EO driver +# mapchete-eo +A collection of Earth Observation–specific driver extensions for [Mapchete](https://github.com/ungarj/mapchete). + +This package provides custom input and output drivers tailored for common EO data formats and workflows, enabling seamless integration of satellite data sources into the Mapchete tile-based geoprocessing framework. + +--- + +## What is this? + +**mapchete-eo** extends Mapchete by adding support for: + +- Custom **input drivers** to read EO datasets, from STAC search or metadata (catalogs, collections, items) +- Metadata extraction and band management for optical satellite products + +This package is intended for advanced users or developers who are working with remote sensing workflows using Mapchete. + +--- + +## 📦 Installation + +You must have `mapchete` installed: + +```bash +pip install mapchete +``` + +Then install mapchete-eo: + +```bash +pip install mapchete-eo +``` From 93ef3af6584645a48396a2e7fb4b4cffb64e4df1 Mon Sep 17 00:00:00 2001 From: Scartography Date: Mon, 4 Aug 2025 14:11:56 +0200 Subject: [PATCH 02/10] readme as rst add logo to readme top --- README.md => README.rst | 26 ++++---- logo/mapchete_eo.png | Bin 0 -> 12749 bytes logo/mapchete_eo_grey.svg | 132 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+), 14 deletions(-) rename README.md => README.rst (70%) create mode 100644 logo/mapchete_eo.png create mode 100644 logo/mapchete_eo_grey.svg diff --git a/README.md b/README.rst similarity index 70% rename from README.md rename to README.rst index 08379a87..319004c9 100644 --- a/README.md +++ b/README.rst @@ -1,12 +1,11 @@ -# mapchete-eo +.. image:: logo/mapchete_eo_grey.svg -A collection of Earth Observation–specific driver extensions for [Mapchete](https://github.com/ungarj/mapchete). +A collection of Earth Observation–specific driver extensions for `Mapchete `_. This package provides custom input and output drivers tailored for common EO data formats and workflows, enabling seamless integration of satellite data sources into the Mapchete tile-based geoprocessing framework. ---- - -## What is this? +What is this? +------------- **mapchete-eo** extends Mapchete by adding support for: @@ -15,18 +14,17 @@ This package provides custom input and output drivers tailored for common EO dat This package is intended for advanced users or developers who are working with remote sensing workflows using Mapchete. ---- +Installation +------------ -## 📦 Installation +You must have ``mapchete`` installed: -You must have `mapchete` installed: +.. code-block:: bash -```bash -pip install mapchete -``` + pip install mapchete Then install mapchete-eo: -```bash -pip install mapchete-eo -``` +.. code-block:: bash + + pip install mapchete-eo diff --git a/logo/mapchete_eo.png b/logo/mapchete_eo.png new file mode 100644 index 0000000000000000000000000000000000000000..e425b3201b7f2a3f7f9e58de0b2d6662689b78ee GIT binary patch literal 12749 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 sz17Q9)&!z99sF%1McX=SO352iu?1G(THc>n+a literal 0 HcmV?d00001 diff --git a/logo/mapchete_eo_grey.svg b/logo/mapchete_eo_grey.svg new file mode 100644 index 00000000..e42ca7e8 --- /dev/null +++ b/logo/mapchete_eo_grey.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + mapchete EO + + From c65cd89d86c528f1bdc9dbb5cb476bc5d97099a9 Mon Sep 17 00:00:00 2001 From: Scartography Date: Mon, 4 Aug 2025 14:25:56 +0200 Subject: [PATCH 03/10] README.rst into pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 375de8b3..6edfc75d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "hatchling.build" name = "mapchete-eo" dynamic = ["version"] description = "mapchete EO data reader" -readme = "README.md" +readme = "README.rst" license = "MIT" authors = [ { name = "Joachim Ungar", email = "joachim.ungar@eox.at" }, From 63fbc4c8dcbf78791cf48fb77f1ab36dd56afea6 Mon Sep 17 00:00:00 2001 From: Scartography Date: Mon, 4 Aug 2025 14:29:02 +0200 Subject: [PATCH 04/10] align logo files with main --- logo/mapchete_eo.png | Bin 12749 -> 0 bytes logo/mapchete_eo_grey.svg | 132 -------------------------------------- 2 files changed, 132 deletions(-) delete mode 100644 logo/mapchete_eo.png delete mode 100644 logo/mapchete_eo_grey.svg diff --git a/logo/mapchete_eo.png b/logo/mapchete_eo.png deleted file mode 100644 index e425b3201b7f2a3f7f9e58de0b2d6662689b78ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12749 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 sz17Q9)&!z99sF%1McX=SO352iu?1G(THc>n+a diff --git a/logo/mapchete_eo_grey.svg b/logo/mapchete_eo_grey.svg deleted file mode 100644 index e42ca7e8..00000000 --- a/logo/mapchete_eo_grey.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - mapchete EO - - From eff2d359470245b4a1894ad83fe1d88f793149bf Mon Sep 17 00:00:00 2001 From: Scartography Date: Tue, 5 Aug 2025 13:09:56 +0200 Subject: [PATCH 05/10] lemme see the logo --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 319004c9..5614c759 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -.. image:: logo/mapchete_eo_grey.svg +.. image:: logo/mapchete_eo.svg A collection of Earth Observation–specific driver extensions for `Mapchete `_. From 5c3b88ce2460116ab9290e62e598af4cb5b00377 Mon Sep 17 00:00:00 2001 From: Scartography Date: Tue, 5 Aug 2025 14:05:58 +0200 Subject: [PATCH 06/10] try using badges as is --- README.rst | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 5614c759..32fa5a98 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,21 @@ .. image:: logo/mapchete_eo.svg -A collection of Earth Observation–specific driver extensions for `Mapchete `_. +Earth Observation–specific driver extensions for `Mapchete `_. + +.. image:: https://img.shields.io/pypi/v/mapchete-eo.svg + :target: https://pypi.org/project/mapchete-eo/ + +.. image:: https://img.shields.io/pypi/l/mapchete-eo.svg + :target: https://github.com/mapchete/mapchete-eo/blob/main/LICENSE + +.. image:: https://img.shields.io/github/actions/workflow/status/mapchete/mapchete-eo/python-package.yml?label=tests + :target: https://github.com/mapchete/mapchete-eo/actions + +.. image:: https://codecov.io/gh/mapchete/mapchete-eo/graph/badge.svg?token=VD1YOF3QA2 + :target: https://codecov.io/gh/mapchete/mapchete-eo + +.. image:: https://img.shields.io/github/repo-size/mapchete/mapchete-eo + :target: https://github.com/mapchete/mapchete-eo This package provides custom input and output drivers tailored for common EO data formats and workflows, enabling seamless integration of satellite data sources into the Mapchete tile-based geoprocessing framework. From b638584c3d15012180f72e30d25dc4a8f1b49a1f Mon Sep 17 00:00:00 2001 From: Scartography Date: Tue, 5 Aug 2025 14:49:17 +0200 Subject: [PATCH 07/10] steal codecov CI from mapchete hub --- .github/workflows/python-package.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 71646d5a..9ca8bde5 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -60,4 +60,16 @@ jobs: CDSE_S3_ACCESS_KEY: ${{ secrets.CDSE_S3_ACCESS_KEY }} CDSE_S3_ACCESS_SECRET: ${{ secrets.CDSE_S3_ACCESS_SECRET }} CURL_CA_BUNDLE: /etc/ssl/certs/ca-certificates.crt - run: pytest -v --cov mapchete-eo --cov-report xml:coverage.xml --cov-report=term-missing:skip-covered + run: pytest -v --cov mapchete_eo --cov-report xml:coverage.xml --cov-report=term-missing:skip-covered --junitxml=pytest.xml + + # Upload the report to Codecov + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v5 + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: mapchete/mapchete-eo + + # this will let the workflow fail if coverage is below 100% + - name: Pytest coverage + run: coverage report --skip-covered --show-missing + # --fail-under 100 \ No newline at end of file From 1ac25c89aea94d7cc2bc8a2c3245db283e927ddc Mon Sep 17 00:00:00 2001 From: Scartography Date: Thu, 7 Aug 2025 14:36:31 +0200 Subject: [PATCH 08/10] one example, minimal into readme with pip install itself and mapchete[complete] --- .github/workflows/docs.yml | 36 +++ .gitignore | 1 + README.rst | 5 +- doc/Makefile | 20 -- doc/source/conf.py | 186 -------------- doc/source/configuration_parameters.rst | 240 ------------------ doc/source/examples.rst | 80 ------ doc/source/index.rst | 2 - docs/source/cli.rst | 16 ++ docs/source/conf.py | 65 +++++ docs/source/examples.rst | 24 ++ docs/source/index.rst | 31 +++ examples/first_pixel_process.py | 46 ++++ ...tinel-2_2025-may-june_first_pixel.mapchete | 37 +++ pyproject.toml | 4 + 15 files changed, 263 insertions(+), 530 deletions(-) create mode 100644 .github/workflows/docs.yml delete mode 100644 doc/Makefile delete mode 100644 doc/source/conf.py delete mode 100644 doc/source/configuration_parameters.rst delete mode 100644 doc/source/examples.rst delete mode 100644 doc/source/index.rst create mode 100644 docs/source/cli.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/examples.rst create mode 100644 docs/source/index.rst create mode 100644 examples/first_pixel_process.py create mode 100644 examples/sentinel-2_2025-may-june_first_pixel.mapchete diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..bbb6705a --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,36 @@ +name: Docs + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build-docs: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install .[docs] + pip install sphinx sphinx-rtd-theme + + - name: Build HTML docs + run: | + sphinx-build -b html docs/source build + + - name: Upload artifact (optional) + uses: actions/upload-artifact@v4 + with: + name: html-docs + path: build/ diff --git a/.gitignore b/.gitignore index 9341c92e..25140ce4 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ dist/ *.gfs .vscode/ __pycache__ +examples/sentinel-2*/ \ No newline at end of file diff --git a/README.rst b/README.rst index 32fa5a98..d1430466 100644 --- a/README.rst +++ b/README.rst @@ -26,17 +26,18 @@ What is this? - Custom **input drivers** to read EO datasets, from STAC search or metadata (catalogs, collections, items) - Metadata extraction and band management for optical satellite products +- Reading data from sources via **STAC assets** This package is intended for advanced users or developers who are working with remote sensing workflows using Mapchete. Installation ------------ -You must have ``mapchete`` installed: +You must have ``mapchete`` with ``s3`` installed, so let's grab the ``complete`` dependencies in this case for convenience: .. code-block:: bash - pip install mapchete + pip install mapchete[complete] Then install mapchete-eo: diff --git a/doc/Makefile b/doc/Makefile deleted file mode 100644 index ab80500e..00000000 --- a/doc/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -SPHINXPROJ = mapchete_satellite -SOURCEDIR = source -BUILDDIR = build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100644 index 0448b346..00000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,186 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- Project information ----------------------------------------------------- - -project = "mapchete_eo" -copyright = "2022, Petr Sevcik, Joachim Ungar" -author = "Petr Sevcik, Joachim Ungar" - -with open("../../mapchete_eo/__init__.py") as f: - for line in f: - if line.find("__version__") >= 0: - version = line.split("=")[1].strip() - version = version.strip('"') - version = version.strip("'") - continue -release = version - - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ["sphinx.ext.autodoc", "sphinx.ext.doctest", "numpydoc"] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -# language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns: list = [] - -# The name of the Pygments (syntax highlighting) style to use. -# pygments_style = None - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - - -# -- Options for HTMLHelp output --------------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "mapchete_eo_doc" - - -# -- Options for LaTeX output ------------------------------------------------ - -latex_elements: dict = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ( - master_doc, - "orgonite.tex", - "orgonite Documentation", - "Petr Sevcik, Joachim Ungar", - "manual", - ), -] - - -# -- Options for manual page output ------------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, "mapchete_eo", "Mapchete Satellite Documentation", [author], 1) -] - - -# -- Options for Texinfo output ---------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "mapchete_eo", - "Mapchete Satellite Documentation", - author, - "mapchete_eo", - "Mapchete input plugin for satellite archives on AWS and Mundi.", - "Miscellaneous", - ), -] - - -# -- Options for Epub output ------------------------------------------------- - -# Bibliographic Dublin Core info. -epub_title = project - -# The unique identifier of the text. This can be a ISBN number -# or the project homepage. -# -# epub_identifier = '' - -# A unique identification for the text. -# -# epub_uid = '' - -# A list of files that should not be packed into the epub file. -epub_exclude_files = ["search.html"] - - -# -- Extension configuration ------------------------------------------------- diff --git a/doc/source/configuration_parameters.rst b/doc/source/configuration_parameters.rst deleted file mode 100644 index 4b175496..00000000 --- a/doc/source/configuration_parameters.rst +++ /dev/null @@ -1,240 +0,0 @@ -Configuration Parameters -======================== - -All configuration parameters can be either set in the mapchete file or via environment -variables as long as the variables are provided in uppercase letters and have the -:code:`MP_SATELLITE_` prefix. - -Some parameters also come with default values. Please note that the values coming from -environment variables overrule mapchete file values which themselves overrule default -values. - - ------------------ -Common Parameters ------------------ - -:code:`start_time` / :code:`end_time` ---------------------------------------- -*(required)* - -Start and end time filter settings for input products. - -:code:`remote_timeout` ----------------------- -*(default: 5)* - -Timeout in seconds used for all packages which make calls to external services. These -packages are :code:`urllib`, :code:`requests`, :code:`rasterio`, :code:`fiona` and -:code:`boto`. - -:code:`metadata_concurrency` ----------------------------- -*(default: True)* - -Parse and prepare metadata in parallel. - -:code:`metadata_concurrency_parallelization` --------------------------------------------- -*(one of "threads" or "processes"; default: "threads")* - -Parallelization strategy. - -:code:`metadata_concurrency_threads` ------------------------------------- -*(default: number of CPU cores but 8 at maximum)* - -Number of parallel threads used. - -:code:`metadata_concurrency_processes` --------------------------------------- -*(default: number of CPU cores but 8 at maximum)* - -Number of parallel processes used. - -:code:`footprint_buffer` ------------------------- -*(default: -500)* - -Buffer used to make footprints a bit smaller. The reason is that product bands do not -exactly overlap at the edges and therefore can cause artefacts ("unicorn trails"). - -:code:`max_products` --------------------- -*(default: 4500)* - -Maximum number of products allowed to be parsed before plugin raises an error. - -:code:`max_cloud_percent` -------------------------- -*(default: 100)* - -Filter setting for maximum cloud coverage. - -:code:`first_granule_only` --------------------------- -*(default: False)* - -Only use the first product of the day, e.g. in higher latitudes where multiple products -overlap in one day, the plugin only uses the first product and omits the rest. This avoids -reading unnecessary amounts of data in regions which are covered multiple times by day. - - -Common Caching Parameters -------------------------- - -:code:`path` ------------- -*(required)* - -Local path to cache products. - - -:code:`intersection_percent` ----------------------------- -*(default: 100)* - -Only cache products which intersect to x percent with process bounds. - -:code:`keep` ------------- -*(default: False)* - -Don't clean cache after process is finished. This setting makes debugging easier. - -:code:`max_disk_usage` ------------------------------------- -*(default: 90)* - -Stop caching products if disk is more thatn x % full. - - -------------------- -Sentinel-1 Specific -------------------- - -:code:`level` -------------- -*(currently only "L1" supported; default: "L1")* - -Filter setting for processing level. - -:code:`sensormode` ------------------- -*(currently only "IW" supported; default: "IW")* - -Filter setting for sensor mode. - -:code:`producttype` -------------------- -*(one of "GRD", "IW_SLC" or "EW_SLC"; default: "GRD")* - -Filter setting for product type. - - -Specific Caching Parameters ---------------------------- - -Note: caching is required for Sentinel-1! - -:code:`resampling` ------------------- -*(default: nearest)* - -Resampling method used when projecting raw data. - -:code:`sar_calibration` ------------------------ -*(one of "Beta", "Gamma" or "Sigma"; default: "Gamma")* - -SNAP calibration method used when preprocessing data. - -:code:`tnr` ------------ -*(default: True)* - -SNAP TNR magic. - -:code:`zoom` ------------- -*(default: 13)* - -Process pyramid zoom level to determine projection target grid. - - -------------------- -Sentinel-2 Specific -------------------- - -:code:`level` -------------- -*(one of "L1C" or "L2A"; default: "L1")* - -Filter setting for processing level. Note: "L2A" is currently only available on Mundi. - - -Specific Caching Parameters ---------------------------- - -:code:`scl` ------------ -*(default: False)* - -Also cache SCL data. (Only relevant when using Level-2.) - - ------------- -AWS Specific ------------- - -:code:`cat_baseurl` -------------------- -*(default: "http://opensearch.sentinel-hub.com/resto/api/collections/Sentinel2/search.json?q=&")* - -URL to opensearch catalog. - -:code:`bucket_baseurl` ----------------------- -*(default: "s3://sentinel-s2-l1c/")* - -Base URL to bucket containing the data. - -:code:`metadata_baseurl` ------------------------- -*(default: "s3://sentinel-s2-l1c/")* - -Base URL to bucket containing metadata. - - -------------------------- -Sentinel-1 Mundi Specific -------------------------- - -:code:`cat_baseurl` -------------------- -*(default: "https://mundiwebservices.com/acdc/catalog/proxy/search/Sentinel1/opensearch?&")* - -URL to opensearch catalog. - -:code:`bucket_baseurl` ----------------------- -*(default: "https://obs.eu-de.otc.t-systems.com/")* - -Base URL to bucket containing the data. - - -------------------------- -Sentinel-2 Mundi Specific -------------------------- - -:code:`cat_baseurl` -------------------- -*(default: "https://mundiwebservices.com/acdc/catalog/proxy/search/Sentinel2/opensearch?&")* - -URL to opensearch catalog. - -:code:`bucket_baseurl` ----------------------- -*(default: "https://obs.eu-de.otc.t-systems.com/")* - -Base URL to bucket containing the data. diff --git a/doc/source/examples.rst b/doc/source/examples.rst deleted file mode 100644 index f06c031a..00000000 --- a/doc/source/examples.rst +++ /dev/null @@ -1,80 +0,0 @@ -Examples -======== - - -S2AWS ------ - -.. code-block:: yaml - - input: - s2: - format: S2AWS - start_time: 2018-04-02 # required - end_time: 2018-04-03 # required - with_cloudmasks: True # also get cloud masks - metadata_concurrency: True # parse source metadata concurrently - metadata_concurrency_threads: 4 # use n threads - footprint_buffer: -500 # negative buffer applied to footprints (default: -500) - max_products: 4500 # maximum number of products to be fetched - first_granule_only: False # only use first granule of each day (for Sentinel-2) - cache: # optional - path: cache # path to cache - bands: [1] # specify which bands to cache - keep: true # don't delete cached data after process is finished - intersection_percent: 0 # only cache products with minimum intersection - max_cloud_percent: 10 # only cache products with maximum cloud cover - max_disk_usage: 90 # stop further caching if disk is n% full - - -S2Mundi -------- - -.. code-block:: yaml - - input: - s2: - format: S2Mundi - start_time: 2018-04-02 # required - end_time: 2018-04-03 # required - level: L1C # or 'L2A' for Level 2A data - with_cloudmasks: True # also get cloud masks - metadata_concurrency: True # parse source metadata concurrently - metadata_concurrency_threads: 4 # use n threads - footprint_buffer: -500 # negative buffer applied to footprints (default: -500) - max_products: 4500 # maximum number of products to be fetched - first_granule_only: False # only use first granule of each day (for Sentinel-2) - cache: # optional - path: cache # path to cache - bands: [1] # specify which bands to cache - keep: true # don't delete cached data after process is finished - intersection_percent: 0 # only cache products with minimum intersection - max_cloud_percent: 10 # only cache products with maximum cloud cover - max_disk_usage: 90 # stop further caching if disk is n% full - -S1Mundi -------- - -.. code-block:: yaml - - input: - s2: - format: S1Mundi - start_time: 2018-04-02 # required - end_time: 2018-04-03 # required - level: L1_ - sensormode: IW - producttype: GRD - metadata_concurrency: True # parse source metadata concurrently - metadata_concurrency_threads: 4 # use n threads - footprint_buffer: -500 # negative buffer applied to footprints (default: -500) - max_products: 4500 # maximum number of products to be fetched - first_granule_only: False # only use first granule of each day (for Sentinel-2) - cache: # optional - path: cache # path to cache - resampling: bilinear_interpolation # interpolation used when regridding data - sar_calibration: gamma0 - tnr: true - keep: true # don't delete cached data after process is finished - max_disk_usage: 90 # stop further caching if disk is n% full - zoom: 13 \ No newline at end of file diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100644 index 0d9da235..00000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,2 +0,0 @@ -mapchete_eo -=========== diff --git a/docs/source/cli.rst b/docs/source/cli.rst new file mode 100644 index 00000000..30a1e06d --- /dev/null +++ b/docs/source/cli.rst @@ -0,0 +1,16 @@ +Mapchete-EO Command Line Interface (CLI) +======================================== + +The `mapchete-eo` package extends Mapchete with Earth Observation (EO) data processing +commands accessible via the `mapchete` CLI. + +Usage +----- + +The CLI commands are registered under `mapchete` as subcommands. + +The test/help for mapchete EO command is: + +.. code-block:: bash + + mapchete eo --help diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 00000000..bcc039e6 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,65 @@ +import os +import sys +import re +import tomllib # Python 3.11+; use 'tomli' for earlier versions + +sys.path.insert(0, os.path.abspath("..")) + +# -- Project metadata from pyproject.toml ------------------------------------ + +def get_metadata(): + pyproject_path = os.path.join(os.path.dirname(__file__), "..", "..", "pyproject.toml") + pyproject_path = os.path.abspath(pyproject_path) + with open(pyproject_path, "rb") as f: + pyproject_data = tomllib.load(f) + project = pyproject_data.get("project", {}) + authors = project.get("authors", []) + author_names = ", ".join(a.get("name", "") for a in authors if "name" in a) + + init_path = os.path.join(os.path.dirname(__file__), "..", "..", "mapchete_eo", "__init__.py") + init_path = os.path.abspath(init_path) + with open(init_path, "r", encoding="utf-8") as f: + content = f.read() + version_match = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', content, re.MULTILINE) + version = version_match.group(1) if version_match else "0.0.0" + + return version, author_names + +release, author = get_metadata() + +# -- General configuration --------------------------------------------------- + + +version, author = get_metadata() + +project = "mapchete-eo" +author = author + +release = version + +version, author = get_metadata() + +rst_prolog = f""" +.. |author| replace:: {author} +.. |version| replace:: {version} +""" + + +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.napoleon", + "sphinx.ext.viewcode", + "sphinx.ext.autosummary", +] + +autosummary_generate = True + +# Optional: include tests folder on path (if you want to import tests modules) +sys.path.insert(0, os.path.abspath("../..")) + + +templates_path = ["_templates"] +exclude_patterns = [] + +html_theme = "sphinx_rtd_theme" +html_static_path = ["_static"] diff --git a/docs/source/examples.rst b/docs/source/examples.rst new file mode 100644 index 00000000..8b2c8eba --- /dev/null +++ b/docs/source/examples.rst @@ -0,0 +1,24 @@ +Examples +========================================== + +Examples can be found in the `examples` directory of this repository. + +List of available examples: + +1) `sentinel-2_2025-may-june_first-pixel.mapchete` +2) *placeholder* + +Usage +----- + +Here is how to execute the `mapchete-eo` drivers via `mapchete execute` on one of the examples. + +.. code-block:: bash + + $ mapchete execute sentinel-2_2025-may-june_first-pixel.mapchete + +This will run `mapchete executor` (default: processes) and output the processing into the `path` under `output` specified in the mapchete file config. + +The `sentinel-2_2025-may-june_first-pixel.mapchete` example shows capabilities by reading the Element84 curated Sentinel-2 Cloud-Optimized GeoTiff (COG) data, which can be read publicly without incurring costs. + +For data discovery we are using the STAC API EarthSearch (https://earth-search.aws.element84.com/v1). \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 00000000..3343e9e6 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,31 @@ +Welcome to mapchete‑eo Documentation +==================================== + +Version: |release| +Authors: |author| + +Overview +-------- + +**mapchete-eo** builds upon Mapchete, adding Earth Observation processing capabilities: +cloud masking, temporal compositing, BRDF, etc. + +With STAC API and catalogs handling for data sources. + +CLI +--- + +.. toctree:: + :maxdepth: 2 + :caption: Generic Info + + cli + +Example Usage +------------- + +.. toctree:: + :maxdepth: 2 + :caption: Basic Examples + + examples diff --git a/examples/first_pixel_process.py b/examples/first_pixel_process.py new file mode 100644 index 00000000..9e0a278e --- /dev/null +++ b/examples/first_pixel_process.py @@ -0,0 +1,46 @@ +import logging +import numpy.ma as ma +from rasterio.enums import Resampling +from typing import List, Optional, Union + +from mapchete import Timer + +from mapchete_eo.platforms.sentinel2.config import MaskConfig +from mapchete_eo.platforms.sentinel2.driver import Sentinel2Cube +from mapchete_eo.sort import TargetDateSort +from mapchete_eo.types import DateTimeLike, MergeMethod + + +logger = logging.getLogger(__name__) + + +def execute( + element84_sentinel2: Sentinel2Cube, + assets: List[str], + target_height: int = 1, + resampling: str = "bilinear", + nodata: float = 0.0, + merge_products_by: str = "s2:datastrip_id", + mask_config: Union[MaskConfig, dict] = MaskConfig(scl_classes= ["nodata", "saturated_or_defected", "cloud_shadows", "thin_cirrus", "cloud_medium_probability", "cloud_high_probability"]), + target_date: Optional[DateTimeLike] = None, +) -> ma.MaskedArray: + ''' + This mapchete execute process reads the time-series and tries to fill an array with singular data value from the time-series. + + ''' + logger.debug("Reading Sentinel-2 data stack.") + with Timer() as t: + data_stack = element84_sentinel2.read_levelled_np_array( + target_height=target_height, + assets=assets, + resampling=Resampling[resampling], + nodatavals=nodata, + merge_products_by=merge_products_by, + merge_method=MergeMethod.average, + raise_empty=True, + mask_config=MaskConfig.parse(mask_config), + sort=TargetDateSort(target_date=target_date), + ) + logger.debug("Sentinel-2 stack of shape %s read took %s", data_stack.shape, t) + + return data_stack[0] \ No newline at end of file diff --git a/examples/sentinel-2_2025-may-june_first_pixel.mapchete b/examples/sentinel-2_2025-may-june_first_pixel.mapchete new file mode 100644 index 00000000..8ac2b779 --- /dev/null +++ b/examples/sentinel-2_2025-may-june_first_pixel.mapchete @@ -0,0 +1,37 @@ +process: first_pixel_process.py +input: + element84_sentinel2: + format: Sentinel-2 + level: L2A + # The process only masks by SCL masks and is not evaluating values from the timeseries, thus we are taking perfect scenes only (up to 2% cloudcover) + # Note: This could lead to granule and/or tile stripes in the output + max_cloud_percent: 2 + time: + start: 2025-05-01 + end: 2025-06-30 +output: + format: GTiff + # In this example we will be getting Sentinel 2 bands: B04, B03, B02, B08, B11, B12 (RGB, NIR, SWIR) + bands: 6 + path: sentinel-2_2025-may-june_first_pixel + dtype: uint16 +pyramid: + grid: geodetic + metatiling: 8 +zoom_levels: + min: 8 + max: 13 +baselevels: + lower: cubic + min: 13 + +# Some bounds around Vienna +bounds: [16.20, 48.00, 16.75,48.5] + +process_parameters: + target_height: 1 + target_date: 2025-05-01 + assets: [red, green, blue, nir, swir16, swir22] + mask_config: + footprint: true + scl_classes: ["nodata", "saturated_or_defected", "cloud_shadows", "thin_cirrus", "cloud_medium_probability", "cloud_high_probability"] diff --git a/pyproject.toml b/pyproject.toml index 6edfc75d..a24eefb6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,10 @@ dependencies = [ ] [project.optional-dependencies] +docs = [ + "sphinx", + "sphinx-rtd-theme" +] test = [ "pytest<8", "pytest-coverage", From 2e89a8f3df07c3248cc5673cd7d0cb7832928ab8 Mon Sep 17 00:00:00 2001 From: Scartography Date: Thu, 7 Aug 2025 14:43:07 +0200 Subject: [PATCH 09/10] lint all --- docs/source/conf.py | 16 ++++++++++++---- examples/first_pixel_process.py | 19 ++++++++++++++----- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index bcc039e6..7362f570 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -7,8 +7,11 @@ # -- Project metadata from pyproject.toml ------------------------------------ + def get_metadata(): - pyproject_path = os.path.join(os.path.dirname(__file__), "..", "..", "pyproject.toml") + pyproject_path = os.path.join( + os.path.dirname(__file__), "..", "..", "pyproject.toml" + ) pyproject_path = os.path.abspath(pyproject_path) with open(pyproject_path, "rb") as f: pyproject_data = tomllib.load(f) @@ -16,15 +19,20 @@ def get_metadata(): authors = project.get("authors", []) author_names = ", ".join(a.get("name", "") for a in authors if "name" in a) - init_path = os.path.join(os.path.dirname(__file__), "..", "..", "mapchete_eo", "__init__.py") + init_path = os.path.join( + os.path.dirname(__file__), "..", "..", "mapchete_eo", "__init__.py" + ) init_path = os.path.abspath(init_path) with open(init_path, "r", encoding="utf-8") as f: content = f.read() - version_match = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', content, re.MULTILINE) + version_match = re.search( + r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', content, re.MULTILINE + ) version = version_match.group(1) if version_match else "0.0.0" return version, author_names + release, author = get_metadata() # -- General configuration --------------------------------------------------- @@ -59,7 +67,7 @@ def get_metadata(): templates_path = ["_templates"] -exclude_patterns = [] +# exclude_patterns = [] html_theme = "sphinx_rtd_theme" html_static_path = ["_static"] diff --git a/examples/first_pixel_process.py b/examples/first_pixel_process.py index 9e0a278e..402e9af4 100644 --- a/examples/first_pixel_process.py +++ b/examples/first_pixel_process.py @@ -21,13 +21,22 @@ def execute( resampling: str = "bilinear", nodata: float = 0.0, merge_products_by: str = "s2:datastrip_id", - mask_config: Union[MaskConfig, dict] = MaskConfig(scl_classes= ["nodata", "saturated_or_defected", "cloud_shadows", "thin_cirrus", "cloud_medium_probability", "cloud_high_probability"]), + mask_config: Union[MaskConfig, dict] = MaskConfig( + scl_classes=[ + "nodata", + "saturated_or_defected", + "cloud_shadows", + "thin_cirrus", + "cloud_medium_probability", + "cloud_high_probability", + ] + ), target_date: Optional[DateTimeLike] = None, ) -> ma.MaskedArray: - ''' + """ This mapchete execute process reads the time-series and tries to fill an array with singular data value from the time-series. - ''' + """ logger.debug("Reading Sentinel-2 data stack.") with Timer() as t: data_stack = element84_sentinel2.read_levelled_np_array( @@ -42,5 +51,5 @@ def execute( sort=TargetDateSort(target_date=target_date), ) logger.debug("Sentinel-2 stack of shape %s read took %s", data_stack.shape, t) - - return data_stack[0] \ No newline at end of file + + return data_stack[0] From 8efbd589f3b4d52b2170df139ae863fd66c44e49 Mon Sep 17 00:00:00 2001 From: Scartography Date: Thu, 7 Aug 2025 15:18:34 +0200 Subject: [PATCH 10/10] figure out readthedocs --- .github/workflows/docs.yml | 36 ------------------------------------ CHANGELOG.rst | 6 ++++++ mapchete_eo/__init__.py | 2 +- readthedocs.yaml | 17 +++++++++++++++++ 4 files changed, 24 insertions(+), 37 deletions(-) delete mode 100644 .github/workflows/docs.yml create mode 100644 readthedocs.yaml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index bbb6705a..00000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Docs - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - build-docs: - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install .[docs] - pip install sphinx sphinx-rtd-theme - - - name: Build HTML docs - run: | - sphinx-build -b html docs/source build - - - name: Upload artifact (optional) - uses: actions/upload-artifact@v4 - with: - name: html-docs - path: build/ diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 3c5a6054..ec1e473f 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -3,6 +3,12 @@ Changelog ######### +2025.8.0 - 2025-08-07 +---------------------- + +* add rudimentary example +* add init docs and readthedocs.yaml for docs build and publish + 2025.7.0 - 2025-07-30 ---------------------- diff --git a/mapchete_eo/__init__.py b/mapchete_eo/__init__.py index f3474be7..117f7b0d 100644 --- a/mapchete_eo/__init__.py +++ b/mapchete_eo/__init__.py @@ -1 +1 @@ -__version__ = "2025.7.0" +__version__ = "2025.8.0" diff --git a/readthedocs.yaml b/readthedocs.yaml new file mode 100644 index 00000000..336b7221 --- /dev/null +++ b/readthedocs.yaml @@ -0,0 +1,17 @@ +# .readthedocs.yaml +version: 2 + +build: + os: ubuntu-24.04 + tools: + python: "3.12" + +sphinx: + configuration: docs/source/conf.py + +python: + install: + - method: pip + path: . + extra_requirements: + - docs