← Back to all projects

Geospatial · Disaster Resilience

Airport Thermal Survey

PythonGeospatialLandsatSTACVanilla JS

A Landsat surface-temperature pipeline over nine US airfields, built as part of my volunteer disaster resilience work. It pulls Landsat Collection 2 Level-2 surface temperature through the Microsoft Planetary Computer STAC API, masks it with USGS quality-assurance bitmasks, clips it to OpenStreetMap airfield geometry (runway, taxiway, apron, and terminal polygons, buffered in each scene's own UTM projection rather than in degrees), and emits per-surface zonal statistics rendered into a self-contained HTML atlas. The interesting decision was scene selection. The obvious move is to sort candidate satellite scenes by lowest cloud cover, but that anti-selects the exact days you care about, because hot days are hazy. I inverted it: rank candidates by hottest local-day maximum temperature and gate acceptance on validity instead, requiring 70 percent valid in-fence pixels and a minimum cloud distance. All nine scenes landed between 97.8 and 100 percent clean coverage. The finding: apron surfaces run 24 to 43 degrees Fahrenheit above the airport's own reported air temperature at the same overpass minute, across all nine airfields. Two caveats matter and are part of why this is worth showing. Every scene is a late-morning satellite overpass, so it structurally misses the afternoon peak and is a conservative lower bound. And the defensible comparison is surface temperature against air temperature, not pavement against grass. The frontend is dependency-free vanilla JavaScript: canvas raster decoding from base64, hand-rolled SVG charts, and no mapping library.

What it does

Landsat Collection 2 Level-2 surface temperature via the Microsoft Planetary Computer STAC API

USGS QA bitmask cloud and quality masking, clipped to OpenStreetMap airfield geometry buffered in each scene's UTM projection

Scene selection inverted: ranked by hottest local-day maximum and gated on validity, not on lowest cloud cover

All nine scenes landed between 97.8 and 100 percent clean in-fence coverage

Finding: apron surfaces run 24 to 43°F above reported air temperature at the same overpass minute, across all nine airfields

Stated limits: a late-morning overpass misses the afternoon peak (a conservative lower bound), and the defensible comparison is surface vs air temperature

Dependency-free vanilla JS frontend: base64 canvas raster decoding, hand-rolled SVG charts, no mapping library

Tech stack

DataLandsat C2 L2 surface temperature (STAC)
SourceMicrosoft Planetary Computer
MaskingUSGS QA bitmasks
GeometryOpenStreetMap airfields, per-scene UTM buffering
OutputSelf-contained HTML atlas, per-surface zonal stats
FrontendVanilla JS, canvas + hand-rolled SVG, no libraries
CoverageNine airfields, 97.8 to 100% clean
← Back to all projects