Overview
Implementation of Sentinel-1 GRD γ0T RTC time-series GeoZarr V3 stores in the data-model codebase. S1Tiling (CNES/OTB) produces γ0T RTC GeoTIFFs on the S2 MGRS grid; this work converts those GeoTIFFs into GeoZarr V3 stores following the EOPF hierarchy.
Design document: .github/prompts/s1-grd-rtc-implementation-plan-v2.md (on s1-tiling branch)
Working branch: s1-tiling
Implementation Phases
Devlog
2026-03-23 — Phase 1 complete
Delivered: Pydantic-zarr V3 schema for S1 GRD RTC stores, aligned with the S2 model pattern.
Files:
src/eopf_geozarr/data_api/s1_rtc.py — 316 lines, model hierarchy (Root → OrbitGroup → Resolution → Arrays)
tests/_test_data/s1_rtc_examples/s1-grd-rtc-31TCH.json — realistic fixture (MGRS 31TCH, 3 timesteps, sharding codecs)
tests/test_data_api/test_s1_rtc.py — 11 tests (round-trip, structure, 5 negative cases)
Key decisions:
- Uses
pyz.v3 (Zarr V3) instead of pyz.v2 (Zarr V2) used by S2
extra="allow" on attrs models for forward compatibility
- Conditions group uses
dict[str, ArraySpec] (dynamic keys per orbit)
- Both
ascending/descending optional with at-least-one validator
PR #138 opened as draft for review by pydantic-zarr schema maintainers.
Open questions for reviewers:
- Should attrs models inherit from a shared base with S2?
- Is
extra="allow" the right choice, or lock down all fields?
- Should
multiscales use the typed zarr_cm model instead of dict[str, Any]?
- Should conditions enforce a regex pattern beyond
gamma_area_ prefix?
2026-03-22 — Phase 0 complete
Delivered: End-to-end prototype from S1Tiling Docker → GeoTIFF → GeoZarr V3.
- S1Tiling 1.4.0 ran on 3 acquisitions over MGRS 31TCH (orbits 008, 037, 110)
- Discovered EODAG 4.0.0 breaking changes (5 issues, monkey-patch created)
- Real-data conversion validated: 10980×10980 sharded arrays, border_mask, gamma_area conditions
- Inner chunk divisibility constraint: 10980 % 512 ≠ 0, solution:
best_chunk_size() → 366
- Store size: ~1.8 GB for 3 timesteps across all overview levels
- xarray readback verified for all levels
Overview
Implementation of Sentinel-1 GRD γ0T RTC time-series GeoZarr V3 stores in the
data-modelcodebase. S1Tiling (CNES/OTB) produces γ0T RTC GeoTIFFs on the S2 MGRS grid; this work converts those GeoTIFFs into GeoZarr V3 stores following the EOPF hierarchy.Design document:
.github/prompts/s1-grd-rtc-implementation-plan-v2.md(ons1-tilingbranch)Working branch:
s1-tilingImplementation Phases
1ae1b99,faad006)4bb1367)Devlog
2026-03-23 — Phase 1 complete
Delivered: Pydantic-zarr V3 schema for S1 GRD RTC stores, aligned with the S2 model pattern.
Files:
src/eopf_geozarr/data_api/s1_rtc.py— 316 lines, model hierarchy (Root → OrbitGroup → Resolution → Arrays)tests/_test_data/s1_rtc_examples/s1-grd-rtc-31TCH.json— realistic fixture (MGRS 31TCH, 3 timesteps, sharding codecs)tests/test_data_api/test_s1_rtc.py— 11 tests (round-trip, structure, 5 negative cases)Key decisions:
pyz.v3(Zarr V3) instead ofpyz.v2(Zarr V2) used by S2extra="allow"on attrs models for forward compatibilitydict[str, ArraySpec](dynamic keys per orbit)ascending/descendingoptional with at-least-one validatorPR #138 opened as draft for review by pydantic-zarr schema maintainers.
Open questions for reviewers:
extra="allow"the right choice, or lock down all fields?multiscalesuse the typedzarr_cmmodel instead ofdict[str, Any]?gamma_area_prefix?2026-03-22 — Phase 0 complete
Delivered: End-to-end prototype from S1Tiling Docker → GeoTIFF → GeoZarr V3.
best_chunk_size()→ 366