Satellite GeoTIFF — the Sentinel and Landsat satellite imagery standard

2026-06-129 min read
geotiffsentinellandsatsatelliteremote-sensingraster

Satellite GeoTIFF is not a separate format but a specialization of GeoTIFF for distributing satellite imagery. ESA Copernicus Sentinel-2 (Multi-Spectral Imager) and USGS Landsat 8/9 (Operational Land Imager) issue each scene as a set of GeoTIFF files: one file = one spectral band = one image. For Sentinel-2 this is 13 bands (from red 665 nm to shortwave infrared 2190 nm), for Landsat 8 — 11 bands. This multi-layered visual pie is the foundation of all modern remote sensing: NDVI computation, crop yield monitoring, fire detection, land-cover classification — everything starts with opening 5–10 GeoTIFF files in the correct order.

Map generation of Moscow city center
Moscow center, 200×200 m fragment. An osm2cdr.ru vector slot plus a Sentinel-2 GeoTIFF for the same area yields urban analytics — where greenery is, where dense development.

History: from Landsat 1972 to Sentinel-2 2015

Civilian satellite Earth observation began on July 23, 1972 — the NASA Landsat 1 launch. The world's first civilian Earth observation satellite. Data was distributed under NDA until 2008, when USGS released the entire Landsat archive into the public domain — the largest geospatial data release in history before SRTM 2014.

The GeoTIFF format appeared in 1995 through the efforts of Niles Ritter (Jet Propulsion Lab) and Mike Ruth (SoftDesk). Before GeoTIFF Landsat was distributed as HDF (Hierarchical Data Format) or raw ASCII bands. GeoTIFF simplified everything: one file = one image with georeferencing in TIFF tags. By 2010 USGS migrated to GeoTIFF as the primary Landsat distribution format — a format that any GIS, any image-processing tool, any image viewer can open.

In 2015 ESA launched Sentinel-2A as part of the Copernicus program. Sentinel-2B followed in 2017, Sentinel-2C in 2024. These satellites provide global coverage every 5 days at 10-meter resolution (visible bands), 20-meter (red-edge and SWIR), 60-meter (atmospheric bands). Data is free via Copernicus Open Access Hub and AWS Open Data. Format: GeoTIFF, each band in a separate file.

Today most of the world's ag-tech, climate monitoring, urban planning is built on these two sources. Startups Planet Labs, Maxar, BlackSky sell more frequent and higher-resolution imagery, but Landsat and Sentinel-2 are the open-data baseline that democratized remote sensing.

What's inside a Satellite GeoTIFF file

One .tif file contains one spectral band of one scene from one satellite on one date. For Sentinel-2 filenames look like T37VEK_20240615T084611_B04.jp2 (in JP2) or .tif. Decoding: T37VEK — tile ID by UTM grid, 20240615T084611 — capture date/time, B04 — band 4 (red, 665 nm).

Inside a GeoTIFF — standard TIFF tags + GeoTIFF tags for CRS. The spectral band is stored as a single-channel 16-bit unsigned integer (uint16) with value range 0–65,535. Real reflectance values (0.0–1.0) are recovered by dividing by a scale factor: for Sentinel-2 — by 10,000.

CRS for both systems is UTM (Universal Transverse Mercator) but different zones for different places. For Moscow it's UTM zone 37N (EPSG:32637). When processing scenes from different zones or for multi-region analysis you need gdalwarp to one common projection.

File size of a Sentinel-2 single band for one UTM tile (100×100 km) — about 100–200 MB at 10 m resolution. One full set of 13 bands — 1.5–2 GB. A Landsat 8 tile (170×185 km, 30 m resolution) — 50–100 MB per band, 600–900 MB per scene total.

Who needs Satellite GeoTIFF: five roles

Agronomist and precision farming specialist. Computing the NDVI (Normalized Difference Vegetation Index) for each field weekly is a standard operation. Sentinel-2 provides bands B04 (red) and B08 (near-infrared), formula NDVI = (B8 − B4) / (B8 + B4). Fields with below-average NDVI are candidates for additional fertilizer, irrigation, or disease diagnostics. Startups like ClimateField, Cropio, OneSoil automate this pipeline across thousands of farms.

Forester and ecologist. Monitoring deforestation, fires, and tree-cover change — primary Landsat/Sentinel use case. Algorithms like Hansen Global Forest Change are built precisely on multi-year Landsat analysis. For Russia monitoring of taiga via Sentinel is the only realistic path covering millions of hectares without aerial surveys.

Urbanist and architect. Urban heat-island analysis, mapping of green zones, monitoring density changes — Sentinel-2 provides weekly updates. Combined with OSM building vectors from osm2cdr.ru, you can compute "what percent of the district is covered by greenery" by exact district geometry.

Military analyst and OSINT journalist. Bellingcat, RUSI, Center for Strategic and International Studies use open satellite imagery to verify events. Sentinel-2 provides 10-meter resolution every 5 days — insufficient to see people but sufficient to count tanks on a range, track military construction, verify missile-strike claims. All this investigation is multi-band GeoTIFF work.

Climatologist and modeler. ESA Climate Data Store and Google Earth Engine store Sentinel and Landsat history over decades. Scientists compute trends: Arctic ice extent decrease, Sahel crop yield change, desert expansion. Pipeline — pandas + xarray + rasterio + Dask — processes thousands of GeoTIFFs in parallel on cloud clusters.

Software for Satellite GeoTIFF: seven tools

SNAP (Sentinel Application Platform). Official ESA software for Sentinel. Free, GPL, cross-platform. Atmospheric corrections, NDVI, land-cover classification, time series. Standard tool in the ESA research community. step.esa.int/main/toolboxes/snap

Python: rasterio + xarray + rioxarray. Industry standard for serious work. rasterio.open('B04.tif') for one file, xarray.open_dataset(..., engine='rasterio') for multi-band stacks. Infinitely extensible via scipy/scikit-learn. rasterio.readthedocs.io

QGIS Semi-Automatic Classification Plugin. Free QGIS plugin specifically for remote sensing: Sentinel/Landsat loading, atmospheric correction, supervised classification. Ideal for academic work and for those who dislike command line. fromgistors.blogspot.com/p/semi-automatic-classification-plugin.html

ENVI / ENVI Modeler. Paid, NV5 Geospatial (formerly Harris). Industry standard in defense and intelligence sectors. Complex, expensive, but unmatched in spectral analysis. nv5geospatialsoftware.com

Google Earth Engine. Free for academic use, paid for commercial. No imagery downloads required — analysis runs on Google servers over the entire Landsat/Sentinel/MODIS archive. Changes the game for climate research. earthengine.google.com

Sentinel Hub. Paid SaaS from Sinergise (now part of Planet Labs). API for querying any Sentinel product on any date/region. Used in SaaS startups. sentinel-hub.com

GDAL/OGR. Universal bridge. gdal_translate, gdalwarp, gdal_calc.py — everything you need for most operations without Python programming. gdal.org

Pitfalls and tips

Clouds — the main enemy. In a typical Sentinel-2 scene 30–70% of the area is cloud-covered. Each scene carries a cloud mask (QA band) where clouds are marked. Analysis requires either picking cloudless tiles only, or mosaicking multiple temporal scenes. Algorithms like Sen2Cor (ESA) automate this.

Atmospheric correction is mandatory for NDVI. "Raw" reflectance values (Level-1C product) include atmospheric contribution. For correct NDVI you need Level-2A product (Bottom-of-Atmosphere reflectance) — generated via Sen2Cor or downloaded pre-processed from Copernicus. Computing NDVI on L1C is acceptable only for rough first estimate.

Bands of different resolution. Sentinel-2 has 10-meter resolution for visible bands (B2, B3, B4, B8), 20-meter for red-edge and SWIR (B5, B6, B7, B8A, B11, B12), 60-meter for atmospheric (B1, B9, B10). When stacking into a single multi-channel numpy array you need to resample lower-resolution bands to 10 m.

UTM zone boundary problems. One Sentinel-2 scene covers one UTM zone. If your region falls on a zone boundary (e.g., Moscow — UTM 37N and 38N), you'll need to process scenes from two zones and reproject. gdalwarp -t_srs EPSG:32637 brings everything to one zone.

Archive size. One Sentinel-2 tile = 1.5–2 GB. One year for a France-sized region = 50–100 TB. Local storage isn't realistic; standard path — Google Earth Engine, AWS Sentinel-2 bucket, or on-demand fetch.

Sentinel-2 orbital inclination doesn't cover poles. Inclination 98.62° means Sentinel-2 sees from 84°S to 84°N. The high Arctic and Antarctica — Landsat 8/9 only (98.22° inclination, slightly better).

JP2 vs GeoTIFF. ESA Copernicus Hub distributes Sentinel-2 in JPEG 2000 (.jp2) — lossy wavelet compression. For most uses .jp2 is fine, but for high-precision analysis better to download L1C and immediately convert to lossless GeoTIFF: gdal_translate -of GTiff -co COMPRESS=DEFLATE.

Geometric vs radiometric calibration. A GeoTIFF file carries correctness of both: pixel position on Earth (geometric) and value in it (radiometric). When cross-comparing with other sources (e.g., Landsat and Sentinel in one pipeline) verify both — especially if you want NDVI compatible with the historical archive.

How to use Satellite GeoTIFF with an OSM export from osm2cdr.ru

Satellite GeoTIFF is multi-band raster data; osm2cdr.ru produces OSM vector layers. The combination: satellite analysis of some metric (NDVI, urban heat) within urban-object boundaries (park, district, block) from OSM. This is "zonal statistics" — a standard GIS operation.

Step 1. Download a Sentinel-2 L2A scene from Copernicus Browser for the needed date. For Moscow — tile T37UDB, date 2024-06-15. Extract the archive, find B04_10m.jp2, B08_10m.jp2.

Step 2. Convert to GeoTIFF and compute NDVI:

gdal_translate B04_10m.jp2 B04.tif
gdal_translate B08_10m.jp2 B08.tif
gdal_calc.py -A B08.tif -B B04.tif \
  --outfile=ndvi.tif \
  --calc="(A.astype(float)-B)/(A.astype(float)+B)" \
  --NoDataValue=-9999

Step 3. On osm2cdr.ru export landuse=park, leisure=park, landuse=residential layers from Moscow to SHP or GeoJSON.

Step 4. Compute zonal statistics in Python:

import rasterio
from rasterio.mask import mask
import geopandas as gpd

parks = gpd.read_file('moscow_parks.geojson')
with rasterio.open('ndvi.tif') as src:
    parks = parks.to_crs(src.crs)
    parks['ndvi_mean'] = parks.geometry.apply(
        lambda g: mask(src, [g], crop=True)[0].mean()
    )

# Parks with highest greenery density
print(parks.nlargest(10, 'ndvi_mean')[['name', 'ndvi_mean']])

You get a ranked list of Moscow parks by actual vegetation density measured by satellite. A ready dataset for urban planning or journalism.

Sources

← All articles