Values, scale and offset
Both missions store pixel values as integers. To get reflectance you apply a scale and an offset, as the STAC raster extension defines:
value = scale × DN + offsetDN is the stored integer (“digital number”). The scale and offset are published per band, and for Sentinel-2 the offset depends on the scene.
Scale and offset by collection
Section titled “Scale and offset by collection”| Collection | Bands | Scale | Offset | Result |
|---|---|---|---|---|
sentinel-2-l2a |
B01 to B12 | 0.0001 | -0.1 for processing baseline 04.00 or later, 0 before | reflectance |
landsat-ot-l2 |
SR_B1 to SR_B7 | 0.0000275 | -0.2 | reflectance |
landsat-ot-l2 |
ST_B10 (lwir11) |
0.00341802 | 149.0 | kelvin |
So Sentinel-2 Collection 1 reflectance is DN × 0.0001 − 0.1, and Landsat Collection 2 reflectance is DN × 0.0000275 − 0.2.
The Sentinel-2 offset
Section titled “The Sentinel-2 offset”From processing baseline 04.00 on, Sentinel-2 L2A values carry an extra 1,000 (ESA’s BOA_ADD_OFFSET), which is where the −0.1 comes from: −1,000 / 10,000. Earth Search’s Collection 1 includes older scenes reprocessed to the same convention. The right offset is chosen per item from its s2:processing_baseline property, never from the acquisition date.
Getting this wrong biases any ratio. NDVI computed as (nir - red) / (nir + red) on raw Collection 1 integers is not the NDVI of the reflectances, because both bands carry the extra 1,000. Convert first, or ask the API for reflectance.
Class and QA layers
Section titled “Class and QA layers”Layers that are classes, probabilities or bit fields, such as Sentinel-2 SCL and Landsat QA_PIXEL, have no scale. They always come back exactly as stored, whatever options you choose.
Choosing what you get
Section titled “Choosing what you get”Available now Three options control the numbers in a GeoTIFF. In POST /v1/process they sit in input.data[].processing; the older download API on tiles.satellitedata.net takes them at the top level with different defaults.
| Option | POST /v1/process |
Download API |
|---|---|---|
| units | units, default REFLECTANCE |
units, default DN |
| harmonization | harmonize, default offset_removed |
harmonize, default none |
| negatives to zero | clipNegative, default false |
clamp, default false |
| Value | You get | Type | Nodata |
|---|---|---|---|
DN |
Stored integers, with the scale and offset written into the GeoTIFF | the band’s own type, usually uint16 | 0 |
REFLECTANCE |
Physical values: reflectance for spectral bands, kelvin for lwir11, kilometres for ST_CDIST |
float32 | NaN |
With DN, read the scale and offset from the file (GDAL and rasterio expose them) and apply them yourself.
harmonize
Section titled “harmonize”| Value | Effect |
|---|---|
none |
No adjustment. Sentinel-2 DN keep the +1,000 offset of baseline 04.00 and later. |
offset_removed |
Sentinel-2 DN from baseline 04.00 on are shifted by −1,000, so every baseline shares DN = 10,000 × reflectance. Output becomes int16, so negative values survive. Other collections are unchanged. |
offset_removed applies to DN output. With REFLECTANCE the offset is already applied, so the two levels give the same values. See Harmonization levels.
clipNegative and clamp
Section titled “clipNegative and clamp”clipNegative: true (process) or clamp: true (download API) sets converted values below zero to zero, which is what Sentinel Hub does with harmonizeValues. It applies to harmonize: "offset_removed" and to units: "REFLECTANCE". Stored DN are never negative, so the download API rejects clamp with units: "DN" and harmonize: "none", and process ignores clipNegative there. Class and QA layers are untouched.
In process, the GeoTIFF type follows from the options: REFLECTANCE gives FLOAT32; DN with offset_removed on Sentinel-2 gives INT16; DN with none, or any Landsat DN, gives UINT16. output.sampleType, if given, must match.
Equivalent requests
Section titled “Equivalent requests”| You want | POST /v1/process processing |
Download API |
|---|---|---|
| Reflectance as float | nothing (the default) | units: "REFLECTANCE" |
| Reflectance as float, never below 0 | clipNegative: true |
units: "REFLECTANCE", clamp: true |
| Raw stored integers | units: "DN", harmonize: "none" |
nothing (the default) |
| Integers that keep negative reflectance | units: "DN" |
harmonize: "offset_removed" |
| Sentinel Hub’s harmonized integers (DN = 10,000 × reflectance, negatives clipped to 0) | units: "DN", clipNegative: true |
harmonize: "offset_removed", clamp: true |
Presets handle the offsets
Section titled “Presets handle the offsets”The render presets account for the offsets. The NDVI recipes subtract each collection’s offset before taking the ratio, so Sentinel-2 and Landsat NDVI agree, and the Landsat true-colour stretch from DN 7,273 to 18,182 is reflectance 0 to 0.3. See Map tiles.
Coming later
Section titled “Coming later”- More units:
KELVIN,CELSIUS, and units for radar, elevation, angles and fractions. bandpass_adjustedandnbarharmonization.- Response metadata reporting the units and harmonization each scene received.