Skip to content

S1 RTC STAC items: metadata incoherences & gaps vs the S2 L2A reference (cube + per-acquisition) #195

Description

@lhoupert

Summary

A metadata-coherence review of the live staging S1 RTC STAC items, benchmarked against the Sentinel‑2 L2A reference, surfaces several incoherences (bugs) and missing fields. Both item types are built by build_s1_rtc_stac_item in this repo (the data-pipeline register step only adds alternate-assets/storage/store/via/render links).

Items reviewed (2026-06-18, …explorer.eopf.copernicus.eu/stac):

  • cube / "tile" item: sentinel-1-grd-rtc-staging/items/s1-rtc-30TWM
  • per-acquisition item: sentinel-1-grd-rtc-acquisitions-staging/items/s1-rtc-30TWM-20260610t061718

Reference: sentinel-2-l2a/items/S2A_MSIL2A_20260617T135751_N0512_R010_T26WME_20260617T221913.

Reference baseline (S2 L2A)

  • Extensions: timestamps, eo v2, sat, projection v2, mgrs, grid, view, processing v1.2, product, scientific, eopf, version, raster v2, alternate-assets, storage.
  • Properties: platform (sentinel-2a), constellation (sentinel-2), instruments ([msi]), mission, gsd, created, updated, processing:level/software/facility/version, providers, proj:bbox+proj:code, sat:*, view:*.
  • Data assets carry data_type, nodata, gsd, raster:scale/offset, description.

S1 RTC items carry only: sar:*, sat:orbit_state, proj:code, renders (+ datetime/range). Big delta.

Incorrect (bugs)

  1. vv and vh data assets have identical hrefs (both → the orbit group …/s1-rtc-{tile}.zarr/{orbit}, not the VV vs VH arrays). Two data assets, different titles, byte-identical href → a non-titiler client cannot resolve VV vs VH. Affects both item types.
  2. Cube item represents a dual-orbit cube as ascending-only. The store has both /ascending and /descending groups, but sat:orbit_state: "ascending" and the vv/vh/thumbnail/render reference /ascending only → there is no dedicated typed vv/vh asset for the /descending group. Its data is reachable only via the whole-store zarr-store asset (the store root contains both groups), not as a polarization asset, and sat:orbit_state is a misleading single value for a dual-orbit cube.
  3. Per-acquisition data assets don't represent the item's own acquisition. The single-datetime per-acq item's vv/vh point at the whole cube orbit group (all time slices); only the render links carry sel=time={datetime}. A 1-datetime item whose data assets span N datetimes is incoherent for any non-render consumer.

Ambiguity (borderline bug vs gap)

  • sar:product_type: "GRD" does not capture the RTC nature. GRD is the legitimate source product, and the SAR extension defines no standard RTC value — so this is not strictly a wrong value, but nothing marks the item as radiometric-terrain-corrected γ⁰ or records the radiometry. Worth an explicit RTC/radiometry indication.

Proposed asset model (resolves bugs #1#2)

Replace the two duplicate vv/vh assets (identical href, indistinguishable) with one data asset per orbit group, named for what it is — γ⁰ RTC backscatter — with the polarizations expressed as bands:

  • Cube item (dual-orbit) → two assets:
    • gamma0-rtc-backscatter-asc → href …/s1-rtc-{tile}.zarr/ascending
    • gamma0-rtc-backscatter-desc → href …/s1-rtc-{tile}.zarr/descending
  • Per-acquisition item (single orbit) → one asset gamma0-rtc-backscatter-{asc|desc} for the item's orbit.

Each asset carries bands: [{name: vv, …}, {name: vh, …}] plus data_type, nodata, unit (γ⁰ linear), gsd: 10, statistics. This makes VV vs VH addressable via bands (no more duplicate hrefs, bug #1) and gives the /descending group a first-class asset on the cube item (bug #2). The titiler render expressions (/{orbit}:vv;…) reference zarr paths, so the asset-key rename doesn't affect rendering.

Missing (vs S2)

Both item types lack:

  • Identity: platform, constellation: sentinel-1, instruments: [c-sar], mission (note the cube mixes S1A+S1C → platform is multi-valued, an argument it belongs per-acquisition).
  • gsd (10 m), item and asset level.
  • Projection detail: only proj:code; add proj:bbox, proj:shape, proj:transform (S2 has proj:bbox+proj:code).
  • Band/asset metadata on vv/vh: data_type, nodata, unit (γ⁰ linear), statistics (cf. Add statstics for visualization to bands or assets #157), raster:*. (S2 data assets have all of these.)
  • Processing provenance (processing: ext): processing:level, processing:software (eopf-geozarr / s1tiling / OTB versions), processing:facility, and the DEM used for terrain correction (lineage). Essential for an RTC product.
  • Timestamps: created / updated (timestamps ext). updated especially — the cube is appended over time.
  • providers, title, description.
  • border_mask variable exists in the store but is not exposed as a valid-data mask asset.

Per-acquisition only:

  • derived_from link to its parent cube item and/or the source S1 GRD product (provenance); consider the version ext.

Cube ("tile") items: add the datacube extension

The cube items are genuine datacubes (dims time, y, x; variables vv/vh/border_mask per orbit group) but carry no structural metadata. Add the datacube extension (cube:dimensions + cube:variables) so the temporal/spatial structure is discoverable without opening the store. (S2 single-acquisition items don't need this — it's specific to the S1 cubes.)

Suggested target field set (mirror S2)

platform, constellation, instruments, mission, gsd, created, updated, providers, title/description, proj:bbox/shape/transform, per-asset data_type/nodata/unit/statistics, processing:level/software/facility + DEM lineage, datacube ext on cubes, derived_from on per-acq items; fix the vv/vh href + dual-orbit asset gap + RTC product_type label.

Notes

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions