Skip to content
Labs · 01Earth observation

The fire you can’t unsee.

In July 2026 the La Mierla wildfire burned through ~35,000 hectares of the Sierra Norte de Guadalajara — the largest Spanish fire of the year. I rebuilt its story from open Landsat 8/9 data: in optical imagery the fire is a subtle dark stain you could mistake for terrain shadow. In thermal, it is unmissable.

16 Jul
detected 13:55
21 Jul
pass · day 5
29 Jul
pass · day 13
30 Jul
pass · day 15
3 Aug
controlled
7 Aug
scar pass
Ground segment · La Mierla fireLandsat 8/9 · 100 m thermal · 30 m grid
30 Jul 2026 — fire day 15drag to compare
La Mierla fire, 30 Jul 2026 — thermal
La Mierla fire, 30 Jul 2026 — optical
⇤⇥
opticalthermal
scene LC08_L2SP_200032_20260730_02_T1 · same instant, two bands
Before · during · afterhover for °C · ⌘+scroll to zoom
35 °C
65 °C

Only thermally anomalous terrain is drawn — each pixel fades in as it moves beyond 2σ from its own June–July baseline. Before the fire, the map is quiet on purpose.

Same satellite, same instant. In the comparator, the left half is surface reflectance — what a camera sees; the right half is land surface temperature from the thermal infrared band, where the burn area radiates at over 60 °C while the surrounding terrain sits 20 degrees cooler.

17σ

hottest pixel against its own June–July baseline

20,530 ha

burned at moderate severity or above — official figure: 35,268 ha

~60 °C

scar temperature four days after the fire was declared controlled

The work4 scripts · Python
01
Search

STAC query against Microsoft Planetary Computer. Twelve Landsat scenes chosen by role: seven for the thermal baseline, one before the fire, three during, one after.

12 scenes · 4 roles
02
Fetch

Only the study area is read from each remote cloud-optimized GeoTIFF, via HTTP range requests — no full-scene downloads.

41 MB instead of ~5 GB
03
Measure

Sensor counts become °C on one common 30 m grid; clouds are masked with the QA band, and every scene is checked against physical bounds before it moves on.

invariants on every step
04
Detect

Per-pixel z-scores against each pixel's own June–July statistics, plus dNBR burn severity with water masked out of the equation.

17σ · 20,530 ha

Those checks failed twice along the way, and both failures were real bugs: a study area six times smaller than the fire, and reservoirs classified as high-severity burn. The write-up tells that story.

What this is — and isn’t

This is a personal learning project built on open data. Landsat’s thermal band is 100 m resolution with a days-long revisit; commercial thermal constellations operate at another level entirely. The gap between my detected area and the official figure (20,530 vs 35,268 ha) is itself informative: official figures count the full perimeter, while dNBR ≥ 0.27 excludes low-severity ground and unburned islands.

Pipeline: STAC search on Microsoft Planetary Computer → windowed reads from cloud-optimized GeoTIFFs → land surface temperature → per-pixel z-scores against a June–July baseline → dNBR burn severity. Every step validates physical invariants and aborts loudly when one fails — in thermal remote sensing, a wrong number usually looks perfectly fine.

Code on GitHub·Read the write-up·Labs · 02 — the tide you can ride