Sentinel-1 products explained: SLC, GRD and radiometrically terrain-corrected
On this page
Problem statement
Search a catalogue for Sentinel-1 and you get several products for the same pass: SLC, GRD, sometimes RTC, sometimes "analysis ready". They are the same acquisition at different stages of processing, and choosing the wrong one costs either days of preprocessing or the signal you needed. Open a GRD file expecting an image in map coordinates and you find unsigned integers with no CRS; open an RTC file expecting raw amplitudes and you find floating-point values already flattened for terrain.
The Valencia scene from 20 October 2024 shows the difference plainly. The GRD asset is a 26,394 Γ 16,669 array of uint16 digital numbers with no coordinate reference system, located only by 210 ground control points. The RTC asset for the same frame is a float32 array of calibrated backscatter in UTM zone 31N at 10 m spacing.
Quick answer
Use RTC for almost any analysis of backscatter; use GRD only if you will calibrate and terrain-correct it yourself; use SLC only for interferometry:
import rasterio
from sar_io import search
bbox = [-0.46, 39.25, -0.33, 39.45]
for coll in ["sentinel-1-grd", "sentinel-1-rtc"]:
item = search(bbox, "2024-10-20/2024-10-20", orbit=110, collection=coll)[0]
with rasterio.open(item.assets["vv"].href) as src:
print(f"{coll}: {src.dtypes[0]}, {src.width} x {src.height}, crs {src.crs}, "
f"ground control points {len(src.gcps[0])}")
sentinel-1-grd: uint16, 26394 x 16669, crs None, ground control points 210
sentinel-1-rtc: float32, 29338 x 21803, crs EPSG:32631, ground control points 0
The GRD has no CRS because it is still in radar geometry; its ground control points say roughly where each part lies. The RTC has been calibrated, projected and corrected for terrain.
SLC, GRD, calibration and terrain correction
1. SLC: single-look complex
Complex numbers β amplitude and phase β in slant range, one look, full resolution. Phase is what interferometry needs; nothing else does. Files are large and not in map geometry.
2. GRD: ground range detected
Phase discarded, multi-looked (five looks in range for Interferometric Wide mode), projected from slant range to an ellipsoid ground range, stored as uint16 digital numbers. Not calibrated, not terrain-corrected, not in a map projection.
3. Calibration: DN to sigma nought
GRD digital numbers become backscatter coefficients through calibration look-up tables delivered with the product. Thermal noise removal happens at this stage too. The result, sigma nought, is still in radar geometry.
4. Terrain correction: to a map
Geocoding with a DEM moves every pixel to its true position in a map projection. Without it, pixels on slopes are displaced by tens of metres or more.
5. Radiometric terrain flattening: gamma nought
Slopes facing the sensor collect energy from more ground per pixel. Normalising by the true illuminated area turns sigma nought into terrain-flattened gamma nought, the quantity in RTC products. This is what makes backscatter comparable between slopes and between passes.
6. Check what your catalogue calls "analysis ready"
"Analysis ready" and "RTC" are used by several providers for slightly different chains. Read the processing description, the DEM used and whether masks for layover and shadow are included.
What GRD values are, and are not
The data used on this page
Sentinel-1 radiometrically terrain-corrected backscatter (sentinel-1-rtc) from the Microsoft Planetary Computer, read through sar_io.py β the small module from the reading guide that searches, groups frames into passes and mosaics each pass onto a fixed grid.
%%writefile sar_io.py
"""Find, read and mosaic Sentinel-1 RTC scenes from Microsoft Planetary Computer."""
from collections import defaultdict
import numpy as np
import planetary_computer
import pystac_client
import rasterio
from rasterio.enums import Resampling
from rasterio.transform import from_origin
from rasterio.vrt import WarpedVRT
from rasterio.warp import transform_bounds
STAC = "https://planetarycomputer.microsoft.com/api/stac/v1"
def search(bbox, dates, orbit=None, direction=None, collection="sentinel-1-rtc"):
"""Items over bbox (lon/lat) in a date range, filtered by relative orbit and pass direction."""
cat = pystac_client.Client.open(STAC, modifier=planetary_computer.sign_inplace)
items = cat.search(collections=[collection], bbox=bbox, datetime=dates).item_collection()
keep = [i for i in items
if (orbit is None or i.properties["sat:relative_orbit"] == orbit)
and (direction is None or i.properties["sat:orbit_state"] == direction)]
return sorted(keep, key=lambda i: i.datetime)
def passes(items):
"""Group frames into passes: same day, same relative orbit."""
groups = defaultdict(list)
for i in items:
groups[(i.datetime.date(), i.properties["sat:relative_orbit"])].append(i)
return dict(sorted(groups.items()))
def grid(bbox, crs, res=10):
"""A fixed target grid: every pass is read onto this, so arrays line up."""
left, bottom, right, top = transform_bounds(4326, crs, *bbox)
width, height = int((right - left) // res), int((top - bottom) // res)
return {"crs": crs, "transform": from_origin(left, top, res, res),
"width": width, "height": height}
def read_pass(frames, band, g):
"""Mosaic one pass's frames for one band onto grid g. Linear power; NaN where no data."""
out = np.full((g["height"], g["width"]), np.nan, dtype="float32")
for item in frames:
with rasterio.open(item.assets[band].href) as src, WarpedVRT(
src, crs=g["crs"], transform=g["transform"], width=g["width"],
height=g["height"], resampling=Resampling.bilinear, nodata=np.nan) as vrt:
a = vrt.read(1)
a[a <= 0] = np.nan # -32768 nodata and zero-padding
fill = np.isnan(out) & np.isfinite(a)
out[fill] = a[fill]
return out
def to_db(linear):
return 10 * np.log10(linear)
Overwriting sar_io.py
Example 1 β what the metadata already says
item = search(bbox, "2024-10-20/2024-10-20", orbit=110)[0]
p = item.properties
print({k: p[k] for k in ["sar:product_type", "sar:instrument_mode", "sar:looks_range",
"sar:looks_azimuth", "sar:looks_equivalent_number",
"sar:pixel_spacing_range", "sar:observation_direction",
"s1:product_timeliness", "s1:orbit_source"]})
{'sar:product_type': 'GRD', 'sar:instrument_mode': 'IW', 'sar:looks_range': 5, 'sar:looks_azimuth': 1, 'sar:looks_equivalent_number': 4.4, 'sar:pixel_spacing_range': 10, 'sar:observation_direction': 'right', 's1:product_timeliness': 'NRT-3h', 's1:orbit_source': 'PREORB'}
This is the RTC item, and its sar:product_type still says GRD: the property describes the product it was made from, and only the collection name says it has been terrain-corrected. The equivalent number of looks, 4.4, is the same value measured from the pixels of a lagoon in the speckle guide. NRT-3h and PREORB say this is near-real-time processing with predicted orbits; reprocessed data with precise orbits is slightly better located.
Example 2 β GRD values are not backscatter
grd = search(bbox, "2024-10-20/2024-10-20", orbit=110, collection="sentinel-1-grd")[0]
with rasterio.open(grd.assets["vv"].href) as src:
dn = src.read(1, window=((5000, 5200), (5000, 5200)))
print(f"GRD digital numbers: min {dn.min()}, max {dn.max()}, mean {dn.mean():.1f}")
print("calibration tables shipped with it:", [k for k in grd.assets if "calibration" in k])
GRD digital numbers: min 30, max 253, mean 112.4
calibration tables shipped with it: ['schema-calibration-vh', 'schema-calibration-vv']
Digital numbers between tens and a few hundred mean nothing physically until they are passed through the calibration tables.
Why GRD is not in a map projection
Why GRD is not in a map projection
A radar image is naturally organised by time: azimuth along the orbit, slant range across it. GRD converts slant range to distance along an ellipsoid, which is close to ground distance on flat terrain but ignores relief. Without a DEM, nothing more can be done; so GRD stays in its own geometry and carries tie points that approximate its location.
Why terrain flattening matters for comparisons
Without flattening, a slope facing the sensor is bright simply because more ground fits in each pixel. That brightness changes with the orbit, so the same field looks different from ascending and descending passes, and a slope looks like a change whenever the geometry differs. Flattening removes most of that, which is why time series and multi-orbit composites should use gamma nought.
Why SLC is only for interferometry
Detected products keep amplitude and throw away phase. Phase is useless in a single image β it is random from pixel to pixel β but the difference in phase between two images of the same place measures motion to fractions of a wavelength. That is the only reason to carry the much larger complex files.
Sigma versus gamma nought, orbits and border noise
- Sigma nought vs gamma nought differ by the cosine of the incidence angle on flat ground and by much more on slopes; do not mix them.
- Orbit files. Precise orbits improve geolocation by metres over predicted ones.
- Border noise on older GRD products appears as dark strips at the swath edges.
- DEM choice in RTC processing matters in mountains; Copernicus DEM is typical.
- Tiling differences. Providers may split or merge frames differently; always mosaic by pass.
- Licensing of Sentinel-1 data is free and open; derived products carry their provider's terms.
Internal links
- SAR imagery explained β what backscatter is
- SAR geometry explained β what terrain correction corrects
- How to read Sentinel-1 RTC data in Python β using the RTC product
- InSAR explained β why phase matters
- How to find Sentinel-1 scenes in Python β the catalogue side
- STAC catalogues explained β how the catalogue describes items
FAQ
What is the difference between GRD and SLC?
SLC keeps amplitude and phase in slant range; GRD discards phase, multi-looks and projects to ground range.
What is RTC?
Radiometrically terrain-corrected backscatter: calibrated, geocoded with a DEM and normalised for slope, usually as gamma nought.
Can I use GRD values directly?
No. They are digital numbers that need calibration, and they are not in a map projection.
Which product should I use for flood mapping?
RTC, or GRD you have calibrated and terrain-corrected yourself.
When do I need SLC?
For interferometry β measuring ground motion or coherence from phase.
Why does my GRD have no CRS?
It is still in radar geometry. Its ground control points give approximate locations.