Compositing
A composite combines many burst products into one image per grid square. ResolutionWeighter writes composites on the 10 km squares of the Military Grid Reference System (MGRS), so results from different bursts, orbits and dates line up pixel for pixel.
Get the grid squares
MGRSGrid lists the grid squares that overlap an area. Its resolution is the pixel size of the composite and must equal the grid_spacing the products were processed with:
from shapely.geometry import box
from s1bursts import MGRSGrid
aoi = box(7.03, 46.06, 7.12, 46.14)
squares = list(MGRSGrid(aoi, resolution=20))Each square is an MGRSGeoBox, which knows its MGRS code, its pixel grid and its UTM zone, square.crs. Both classes come from freezebase, whose guide The MGRS grid explains the grid and why it suits composites.
The products must be in the zone of the square: process them with crs=square.crs and keep the default align_to_standard_grid=True. A product on a different grid is rejected.
crs="auto"
"auto" takes each burst’s own zone, and a burst whose center lies in the neighboring zone would be projected there, not in the zone of the square.
From an area to composites shows the whole loop from an area to the composites of its squares.
Compose with local resolution weighting
compose_rtc_lrw() for backscatter and compose_coherence_lrw() for coherence combine all products that cover a square, whatever their orbit or direction. Each pixel is weighted toward the acquisitions with the highest spatial resolution at that pixel. This is called local resolution weighting (LRW). Local resolution weighting explains how it works.
from s1bursts import ResolutionWeighter, TimeRange
weighter = ResolutionWeighter(fm)
window = TimeRange("2025-08-01", "2025-08-31")
for square in squares:
composite = weighter.compose_rtc_lrw(
rtc.products, square, write_qa=True, time_range=window,
)The method returns the composite, a record whose file fm.get_product_path(composite) holds the backscatter. Pass the TimeRange of your search as time_range, so that every square records the same compositing window.
The weights come from the RTC products, so compose_coherence_lrw() takes the RTC products of the same dates as well:
coherence_composite = weighter.compose_coherence_lrw(
coherence.products, rtc.products, square, write_qa=True, time_range=window,
)Quality layers
With write_qa=True, two quality layers are written beside an LRW composite:
- The number of observations (
QA-NUM): how many acquisitions contributed to each pixel. - The composite quality map (
QA-CQM): how fine the combined detail of each pixel is.
The composite lists them in its layers, and fm.open() reads each layer’s file:
from s1bursts.product import Layer
with fm.open(composite, Layer.QA_CQM) as src:
cqm = src.read(1)Composites per pass direction
The pass composites keep ascending and descending orbits apart:
| Method | Combines | Use it for |
|---|---|---|
| compose_rtc_by_pass() | RTC | Backscatter by viewing direction |
| compose_gtc_by_pass() | GTC | Backscatter without terrain flattening |
| compose_coherence_by_pass() | Coherence | Coherence by viewing direction |
They return a dictionary of composites keyed by pass direction, "Ascending" and "Descending". They take a plain average without resolution weights, and their only quality layer is the number of observations.
Choose how to combine
Every method uses aggregation="mean" by default. Pass aggregation="median", or a number between 0 and 1 for a quantile, to reduce the influence of outliers.
Composites are written in linear units, like the products they combine. Convert backscatter to decibels after reading it, as 10 * np.log10(gamma0), so that the averaging has already happened on linear values.
All inputs of one call must share a polarization, the processing settings and the SNAP version, the inputs of both pass directions included, and coherence inputs must share a temporal baseline. A pass composite that already exists must match the settings and SNAP version of the direction being added. A SNAP version that could not be determined matches any. The RTC products that weight a coherence composite must share their settings among themselves, and the DEM and SNAP version with the coherence products. The composite records the settings of the coherence products only.
Like processing, compositing skips a square whose files already exist, after checking that they were made on the same grid and with the same settings. Pass overwrite=True to replace composites made with other settings.