SAR Backscatter (Sentinel-1)¶
sar_backscatter calibrates Sentinel-1 GRD digital numbers (DN) into physical radar
backscatter. This is Phase 1: ellipsoid-referenced coefficients only. Terrain
correction (DEM-based geometric orthorectification, radiometric terrain flattening) is
not implemented and is tracked as later phases — see the
design reference below for the full rationale and what is planned.
Supported collections¶
sentinel-1-grd is served from CDSE, Earth Search and Planetary Computer. Any STAC
catalogue configured for this backend works the same way, as long as its items expose
the same asset shape those three do: one measurement asset per polarisation (vv,
vh, hh, hv) plus its schema-calibration-<pol> and schema-noise-<pol> sibling
annotation assets.
Acceptance is capability-gated, not identity-gated: sar_backscatter does not
require a specific product:type or sar:product_type value (these are inconsistent
across catalogues), only that the assets it needs actually resolve. It does reject
sar:product_type values positively known to be unsupported (SLC, OCN) — the
process assumes detected GRD amplitude data.
Calibration happens per source item, before mosaicking, so a spatial extent whose acquisition datetime spans more than one item (e.g. adjacent orbit swaths captured at the same pass) calibrates correctly — each item's own calibration/noise LUTs are used for its own pixels, never blended with another item's.
Supported parameters¶
| Parameter | Phase 1 support |
|---|---|
coefficient |
beta0, sigma0-ellipsoid, gamma0-ellipsoid, null. Not sigma0-terrain or gamma0-terrain (the openEO spec's own default) — callers must opt into an ellipsoid coefficient explicitly. |
elevation_model |
Must be null. No DEM is used. |
mask |
Supported. Adds a mask band: 1.0 valid, 0.0 invalid/no-data. |
noise_removal |
Supported (default true). Subtracts ESA's thermal noise LUT before calibration; negative results are clamped to 0 and counted. |
ellipsoid_incidence_angle |
Supported. Adds an ellipsoid_incidence_angle band, in degrees, recovered from the calibration LUTs alone (no orbit geometry needed). |
contributing_area |
Not supported — requires a DEM. |
local_incidence_angle |
Not supported — requires a DEM. |
Every unsupported parameter raises a clear error rather than silently approximating:
| Condition | Error |
|---|---|
coefficient is sigma0-terrain or gamma0-terrain |
ProcessParameterInvalid |
contributing_area=true or local_incidence_angle=true |
FeatureUnsupported |
elevation_model is not null |
DigitalElevationModelInvalid |
data is not a STAC-item-backed load_collection/load_stac stack |
ProcessParameterInvalid |
An expected calibration/noise band (e.g. vv_sigma0_lut) is missing from data |
ProcessParameterInvalid, naming the missing band |
sar:product_type is positively SLC or OCN |
ProcessParameterInvalid |
Scientific accuracy statement¶
Reproduced verbatim from the design ADR (§5), which governs Phase 1's radiometric and geometric accuracy claims:
Radiometric accuracy — excellent. The computation
σ⁰ = (DN² − η) / A_σ²is exactly the relation ESA specifies (ESA-EOPG-CSCOP-TN-0002 §4), with the same supplied LUTs, and is what SNAP's Calibration operator implements. The absolute calibration constant K is already folded into the LUTs and must not be applied again. Agreement with SNAP is expected to be limited only by resampling choice, well inside Sentinel-1's ~0.3–0.5 dB absolute radiometric accuracy. Decimation bias is ≤ 0.06 dB, and ESA explicitly endorses averaging in power — "the average backscatter coefficient over an area of interest can be used instead: σ⁰ = ⟨DN²⟩ / A_σ²".A nuance on "ellipsoid". The Earth model behind the LUTs is not the bare WGS84 ellipsoid: ESA defines it as "the ellipsoid inflated with an average height" for the scene. So
sigma0-ellipsoidis already referenced to a mean scene elevation, which slightly reduces — but does not remove — the terrain error below. The openEO coefficient namesigma0-ellipsoidis still the correct label; these docs should just not overstate it as "sea-level referenced".Geometric accuracy — terrain-dependent, but less so than first stated. ESA computes the geolocation grid against a terrain model — sampled 10 CDSE products across 2015–2026 show GCP height is 0 m over ocean and sea ice, but 196–253 m and 251–351 m over European land at 52–56°N, and 0–835 m over the tropics at 4–7°N. Geocoding through these GCPs therefore already accounts for terrain at grid resolution — a coarse ~10–25 km sampling. What remains uncorrected is local relief relative to the smoothly interpolated grid, not the full terrain height. The figures below are consequently an upper bound, pessimistic for large-scale topography while remaining valid for local relief.
This does not change the radiometry:
sigma0-ellipsoid/gamma0-ellipsoiduse the ellipsoid incidence angle from the calibration LUTs regardless of what the geolocation grid does. The geometric and radiometric senses of "ellipsoid" are independent.Planimetric error, as an upper bound:
For IW (θ ≈ 29°–46°) that is 1.0× to 1.8× the height above the grid's own reference — which is the terrain-sampled grid rather than the bare ellipsoid. Concretely: 100 m of relief → 100–180 m of horizontal displacement; 500 m → 0.5–0.9 km. Over flat coastal or agricultural terrain the error is metres. Over mountains it is catastrophic for any per-pixel analysis.
Radiometric terrain effects — uncorrected. On sloping terrain the illuminated area per pixel departs from the ellipsoid assumption;
gamma0-ellipsoidtypically deviates fromgamma0-terrainby ±3 dB on moderate slopes and >6 dB on steep foreslopes. Layover and shadow are neither detected nor masked.Fit for purpose: open water and flood mapping, agriculture, wetlands, sea ice, oil spill and ship detection, urban change over low-relief terrain, and any application that compares same-geometry acquisitions (same relative orbit) where the terrain bias largely cancels.
Not fit for purpose: mountainous terrain, cross-orbit (ascending vs descending) comparison, biomass or soil-moisture retrieval, anything requiring CARD4L compliance.
Worked examples¶
Ellipsoid sigma0, with a validity mask, over VV/VH:
{
"process_graph": {
"load1": {
"process_id": "load_collection",
"arguments": {
"id": "sentinel-1-grd",
"spatial_extent": {"west": 139.5, "south": 35.2, "east": 140.2, "north": 35.8},
"temporal_extent": ["2026-07-08T20:42:00Z", "2026-07-08T20:44:00Z"],
"bands": ["vv", "vh"]
}
},
"sar1": {
"process_id": "sar_backscatter",
"arguments": {
"data": {"from_node": "load1"},
"coefficient": "sigma0-ellipsoid",
"noise_removal": true,
"mask": true
}
},
"save1": {
"process_id": "save_result",
"arguments": {
"data": {"from_node": "sar1"},
"format": "GTiff"
},
"result": true
}
}
}
Gamma0, with the ellipsoid incidence angle also requested (e.g. to build a polarimetric or terrain-aware downstream index):
{
"process_graph": {
"load1": {
"process_id": "load_collection",
"arguments": {
"id": "sentinel-1-grd",
"spatial_extent": {"west": 139.5, "south": 35.2, "east": 140.2, "north": 35.8},
"temporal_extent": ["2026-07-08T20:42:00Z", "2026-07-08T20:44:00Z"],
"bands": ["vv", "vh"]
}
},
"sar1": {
"process_id": "sar_backscatter",
"arguments": {
"data": {"from_node": "load1"},
"coefficient": "gamma0-ellipsoid",
"ellipsoid_incidence_angle": true
}
},
"save1": {
"process_id": "save_result",
"arguments": {
"data": {"from_node": "sar1"},
"format": "GTiff"
},
"result": true
}
}
}
See the Sentinel-1 SAR Backscatter RGB Composite notebook for an end-to-end run producing a VH/VV/VH:VV false-colour composite, a useful visual sanity check of a real calibrated product (water dark, vegetation reddish, urban bright).
Calibration and noise bands¶
sar_backscatter calibrates by reading the calibration constant and thermal noise
value from six bands per polarisation, derived directly from each item's own
calibration/noise annotation XML. These are ordinary cube bands — load_collection
can request any of them directly, independent of sar_backscatter, for building a
coefficient this process does not itself provide.
| Band | Description |
|---|---|
<pol>_sigma0_lut |
Sigma0 (σ⁰) calibration constant A |
<pol>_beta0_lut |
Beta0 (β⁰) calibration constant A |
<pol>_gamma0_lut |
Gamma0 (γ⁰) calibration constant A |
<pol>_dn_lut |
Raw-DN calibration constant (rarely needed directly — the other three already have the absolute calibration constant folded in, per the accuracy statement above) |
<pol>_ellipsoid_incidence_angle |
Ellipsoid incidence angle in degrees, recovered from the sigma0/gamma0 LUTs alone |
<pol>_noise_lut |
Thermal noise, in DN² |
<pol> is the polarisation code (vv, vh, hh, hv). Calling sar_backscatter
with a given coefficient requests the matching LUT band (and the noise band, if
noise_removal is true) on your behalf automatically — you only need to request one of
these bands yourself if you want its value directly, e.g. to inspect the calibration
constant independent of any DN:
{
"process_graph": {
"load1": {
"process_id": "load_collection",
"arguments": {
"id": "sentinel-1-grd",
"spatial_extent": {"west": 139.5, "south": 35.2, "east": 140.2, "north": 35.8},
"temporal_extent": ["2026-07-08T20:42:00Z", "2026-07-08T20:44:00Z"],
"bands": ["vv", "vv_sigma0_lut", "vv_ellipsoid_incidence_angle"]
}
},
"save1": {
"process_id": "save_result",
"arguments": {
"data": {"from_node": "load1"},
"format": "GTiff"
},
"result": true
}
}
}
Need CARD4L or terrain-corrected gamma0?¶
This backend does not produce terrain-corrected (gamma0-terrain/sigma0-terrain)
or CARD4L-compliant output. If you need that today, use a pre-computed Radiometric
Terrain Correction (RTC) collection instead — for example
OPERA RTC-S1, which
ships CARD4L-compliant terrain-flattened gamma0 directly as a STAC collection you can
load_collection like any other. sar_backscatter's terrain correction (Phase 2:
geometric orthorectification, then Phase 3: radiometric terrain flattening and
registering ard_normalized_radar_backscatter) is on the roadmap but not built yet.
Design reference¶
The full design rationale, empirical findings, and phased implementation plan live in
ADR 0001.
The calibration/noise bands documented above — how they are discovered, read per item
before mosaicking, and how sar_backscatter consumes them — are
ADR 0002's
subject. ADRs are repo-only documentation (like docs/audits/) and are not published
on this site — follow the links on GitHub.