Skip to content

Spatial

Remote sensing and spatial analysis, worked on free public data: airborne LiDAR, NAIP aerial imagery, Sentinel-2 time series, and Harmonized Landsat-Sentinel surface reflectance.

Both projects below are documented in full on their own pages, including the parts that did not hold up.


Primary case study · 2026

Denver Urban Tree Classification

A screening map for urban-forestry crews: every crown in one Denver neighborhood sorted into the five classes a forester treats differently, beginning with ash at risk from the Emerald Ash Borer.

Data
DRCOG 2020 airborne LiDAR, NAIP 2023 aerial imagery at 30 cm, a five-date Sentinel-2 series across the 2025 growing season, and Denver’s arborist inventory for training labels. All of it free and openly licensed.
Segmentation
A canopy height model built from the LiDAR, split by watershed segmentation into 18,272 individual tree crowns across the Hale neighborhood.
Features & model
109 features per crown: NAIP color and near-infrared statistics, seasonal change from the Sentinel-2 series, vegetation indices, and crown height and shape from the LiDAR. A gradient-boosted classifier won a four-model comparison.
Validation
69.0% overall accuracy on a random split. Holding out whole 200 m and 400 m spatial blocks lowers that to 66.4%, steady across block sizes, so the map generalizes across the neighborhood.
Limits
Maple is the weakest class; it overlaps the other deciduous trees in spectrum and structure. The model covers one neighborhood, and nothing here assumes it transfers elsewhere without retraining.

The project page also covers the exploratory extensions: species classification across 21 species (about 54% accuracy), a 2016 to 2025 canopy change comparison from Harmonized Landsat-Sentinel surface reflectance, and crown-scale tests of two foundation models against a purpose-built multimodal network. All of that is methods exploration, and the page says so where it applies.

Read the full case study →

Spatial telemetry · running

ADS-B Aircraft Tracking & Geospatial Analysis

The tracker stores every aircraft contact as PostGIS geometry, which makes the archive a spatial dataset: which aircraft passed within five kilometers of a point, where traffic concentrates, which compass directions the receiver hears best.

Terrain shows up directly in that last question. The Front Range masks coverage to the west, clear eastern sectors reach 80 to 120 km, and the peak measured range is 116.8 km to the southeast. Materialized views keep those queries fast enough to serve a live dashboard.

Read the full case study →

contact@tomshanks.dev · github.com/Tom-Shanks