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.

Sentinel-1 processing from raw data to radiometrically terrain-corrected backscatter. one acquisition, four productsSLCcomplex, slantrangeGRDuint16 DN, no CRSσ⁰ calibratedLUTs, noise removedgeocodedDEM, map projectionRTC γ⁰float32, flattenedPhase goes at GRD, radar geometry at geocoding, slope brightness at flattening spatialworkflow.io
Each level removes something: phase at GRD, geometry at geocoding, slope brightness at RTC.

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.

SLC, GRD and RTC Sentinel-1 products compared. three products, three usesproductvaluesgeometryuseSLCcomplex I/Qslant rangeInSAR, coherenceGRDuint16 DNground range, GCPscustom processingRTCfloat32 γ⁰map CRS, 10 mmost analysisthe Valencia GRD frame: 26,394 Γ— 16,669 DN, 210 GCPs, crs NoneThe RTC item still reports sar:product_type GRD: trust the collection, not that field spatialworkflow.io
Three products from one acquisition, each suited to a different kind of question.

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.

Choosing a Sentinel-1 product by the question. which product?What does the analysis need?ground motionSLCphase is the signalbackscatterRTCready to compareown chainGRDcalibrate + correctFloods, crops, change detection and composites all want terrain-flattened γ⁰ spatialworkflow.io
The question decides the product; most questions want RTC.

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.

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.