Skip to content

xcube EOPF Data Store

xcube-eopf is a Python package that extends xcube with a new data store called "eopf-zarr". This plugin enables the creation of analysis-ready data cubes (ARDC) from Sentinel products published by the EOPF Sentinel Zarr Sample Service.

Overview

Once installed, the package gives access to EOPF data products in an analysis-ready data cube format through the standard xcube data store interface. You can:

  • List available data sources
  • Check data availability
  • Get metadata of the data sources
  • View available open parameters for each source
  • Open data source directly as xcube Dataset

To explore all available functions, see the Python API.

The data retrieval process uses the EOPF STAC API, which allows querying observations over a specified time range and spatial extent. The resulting datasets are mosaicked per time step and stacked into a 3D spatiotemporal data cube.

Each data variable is returned as a chunked Dask array, supporting efficient out-of-core computations and visualization.

Internally, the package uses the xarray-eopf backend for reading, and leverages xcube to construct spatiotemporal analysis-ready data cubes.

Features

IMPORTANT
xcube-eopf is currently under active development.
Some features may be partially implemented or still in progress.

The EOPF xcube data store is designed to provide analysis-ready data cubes from the EOPF Sentinel Zarr samples for Sentinel-1, Sentinel-2, and Sentinel-3 missions. The main features are summarized below. A more in depth documentation is given in the User Guide.

Currently, support is focused on Sentinel-2 and Sentinel-3 products.


Sentinel-1

The current implementation supports three Sentinel-1 product levels, available as data_id values:

  • sentinel-1-l1-grd: Level-1 Ground Range Detected (GRD)
  • sentinel-1-l1-slc: Level-1 Single Look Complex (SLC)
  • sentinel-1-l2-ocn: Level-2 Ocean (OCN)

Cube Generation Workflow

The workflow for building 3D analysis-ready cubes from Sentinel-1 products involves the following steps:

  1. Query products using the EOPF STAC API for a given time range and spatial extent.
  2. Group items by acquisition day, relative orbit, orbit direction, and satellite platform.
  3. Open products in analysis mode using the xarray-eopf backend.

    • GRD: Radiometric calibration, geocoding, and radiometric terrain correction.
    • SLC: Radiometric calibration, TOPSAR debursting and merging, geocoding, and radiometric terrain correction.
    • OCN: Rectification from the native irregular grid to a regular spatial grid.
  4. Mosaic adjacent tiles into seamless daily scenes.

  5. Stack the daily mosaics along the temporal axis to form 3D data cubes.

Note: For GRD ans SLC, if no DEM is given, CDSE S3 credentials must be configured to enable access to the CopDEM (30 m) dataset from CDSE. Instructions for generating credentials are available here. The Copernicus DEM GLO-30 is part of the Copernicus Contributing Missions (CCM) data and requires requesting access as described here. Note that it may take a few hours for access to CCM data to be granted.

Supported Variables

  • GRD: vv, vh, hh, hv (each GRD product contains only a subset of these bands)
  • SLC: vv, vh, hh, hv (each GRD product contains only a subset of these bands)
  • OCN: wind_speed, wind_direction, inversion_quality, wind_quality, percentage_bright_points

Note: Support for Sentinel-1 GRD and SLC products is currently experimental and undergoing validation. Some required processing parameters are not yet available in the new EOPF products and are therefore estimated.

Example: Sentinel-1 GRD

from xcube.core.store import new_data_store

store = new_data_store("eopf-stac")
ds = store.open_data(
    data_id="sentinel-1-l1-grd",
    bbox=[20.6, 37.6, 21., 38.],
    time_range=["2026-05-04", "2026-05-05"],
)

Sentinel-2

The current implementation supports two Sentinel-2 product levels, available as data_id values:

  • sentinel-2-l1c: Level-1C top-of-atmosphere reflectance
  • sentinel-2-l2a: Level-2A atmospherically corrected surface reflectance

Cube Generation Workflow

The workflow for building 3D analysis-ready cubes from Sentinel-2 products involves the following steps:

  1. Query products using the EOPF STAC API for a given time range and spatial extent.
  2. Retrieve observations as cloud-optimized Zarr chunks via the xarray-eopf backend.
  3. Mosaic spatial tiles into single images per timestamp.
  4. Stack the mosaicked scenes along the temporal axis to form a 3D cube.

Supported Variables

  • Surface reflectance bands:
    b01, b02, b03, b04, b05, b06, b07, b08, b8a, b09, b11, b12
  • Classification/Quality layers (L2A only):
    cld, scl, snw

Example: Sentinel-2 L2A

from xcube.core.store import new_data_store

store = new_data_store("eopf-stac")
ds = store.open_data(
    data_id="sentinel-2-l2a",
    bbox=[9.7, 53.4, 10.3, 53.7],
    time_range=["2025-05-01", "2025-05-07"],
    spatial_res=10 / 111320,  # meters to degrees (approx.)
    crs="EPSG:4326",
    variables=["b02", "b03", "b04", "scl"],
)


Sentinel-3

The current implementation supports three Sentinel-3 product levels, available as data_id values:

  • sentinel-3-olci-l1-efr: Level-1 top-of-atmosphere radiance from OLCI instrument
  • sentinel-3-olci-l2-lfr: Level-2 land and atmospheric geophysical parameters derived from OLCI instrument
  • sentinel-3-slstr-l1-rbt: Level-1 radiances and brightness temperatures (RBT) derived from SLSTR instrument
  • sentinel-3-slstr-l2-lst: Level-2 land surface temperature derived from SLSTR instrument

Cube Generation Workflow

The workflow for building 3D analysis-ready cubes from Sentinel-3 products involves the following steps:

  1. Query tiles using the EOPF Zarr Sample Service STAC API for a given time range and spatial extent.
  2. Group items by solar day.
  3. Rectify data from the native 2D irregular grid to a regular grid using xcube-resampling.
  4. Mosaic adjacent tiles into seamless daily scenes.
  5. Stack the daily mosaics along the temporal axis to form 3D data cubes for each variable (e.g., spectral bands).

Supported Variables

  • sentinel-3-olci-l1-efr:
    oa01_radiance, oa02_radiance, oa03_radiance, oa04_radiance, oa05_radiance, oa06_radiance, oa07_radiance, oa08_radiance, oa09_radiance, oa10_radiance, oa11_radiance, oa12_radiance, oa13_radiance, oa14_radiance, oa15_radiance, oa16_radiance, oa17_radiance, oa18_radiance, oa19_radiance, oa20_radiance, oa21_radiance
  • sentinel-3-olci-l2-lfr:
    gifapar, iwv, otci, rc681, rc865
  • sentinel-3-slstr-l1-rbt:
    s1_radiance_an, s2_radiance_an, s3_radiance_an, s4_radiance_an, s5_radiance_an, s6_radiance_an, s1_radiance_ao, s2_radiance_ao, s3_radiance_ao, s4_radiance_ao, s5_radiance_ao, s6_radiance_ao, s4_radiance_bn, s5_radiance_bn, s6_radiance_bn, s4_radiance_bo, s5_radiance_bo, s6_radiance_bo, f1_bt_fn, f1_bt_fo, f2_bt_in, f2_bt_io, s7_bt_in, s8_bt_in, s9_bt_in, s7_bt_io, s8_bt_io, s9_bt_io
  • sentinel-3-slstr-l2-lst:
    lst

Example: Sentinel-3 SLSTR Level-2 LST

from xcube.core.store import new_data_store

store = new_data_store("eopf-stac")
ds = store.open_data(
    data_id="sentinel-3-slstr-l2-lst",
    bbox=[9., 53., 11., 54.],
    time_range=["2025-06-01", "2025-06-05"],
    spatial_res=300 / 111320, # conversion to degree approx.
    crs="EPSG:4326"
)


License

The package is open source and released under the Apache 2.0 license license. ❤