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-eopfis 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:
- Query products using the EOPF STAC API for a given time range and spatial extent.
- Group items by acquisition day, relative orbit, orbit direction, and satellite platform.
-
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.
-
Mosaic adjacent tiles into seamless daily scenes.
- 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 reflectancesentinel-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:
- Query products using the EOPF STAC API for a given time range and spatial extent.
- Retrieve observations as cloud-optimized Zarr chunks via the xarray-eopf backend.
- Mosaic spatial tiles into single images per timestamp.
- 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 instrumentsentinel-3-olci-l2-lfr: Level-2 land and atmospheric geophysical parameters derived from OLCI instrumentsentinel-3-slstr-l1-rbt: Level-1 radiances and brightness temperatures (RBT) derived from SLSTR instrumentsentinel-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:
- Query tiles using the EOPF Zarr Sample Service STAC API for a given time range and spatial extent.
- Group items by solar day.
- Rectify data from the native 2D irregular grid to a regular grid using xcube-resampling.
- Mosaic adjacent tiles into seamless daily scenes.
- 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_radiancesentinel-3-olci-l2-lfr:
gifapar,iwv,otci,rc681,rc865sentinel-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_iosentinel-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.