← Back home
🔬 The pipeline

How it works

From a single map click to a habitat score — every step is deterministic and grounded in remote-sensing conventions.

📍 Click lat / lon 🛰️ Fetch Sentinel-2 tile 🌿 Indices NDVI·NDWI·NDBI 🦅 Score habitat · risk 📄 Report PDF export

1 · Sentinel-2 imagery

When you click a location, a serverless function requests a small tile of Sentinel-2 L2A surface-reflectance imagery around that point from the Sentinel Hub Process API (via the Copernicus Data Space Ecosystem), filtered to low cloud cover. Five bands are requested:

Bands = B02 (Blue) · B03 (Green) · B04 (Red) · B08 (NIR) · B11 (SWIR)

The multiband GeoTIFF is parsed in pure Python with tifffile — no GDAL or rasterio — which keeps the function bundle small enough for serverless limits.

2 · Spectral indices

Three normalized-difference indices are computed per pixel, each ranging −1 … +1:

NDVI = (NIR − Red) / (NIR + Red)   → vegetation health
NDWI = (Green − NIR) / (Green + NIR)   → water content
NDBI = (SWIR − NIR) / (SWIR + NIR)   → built-up density

Each index is also rendered as a color heatmap so you can visually inspect vegetation, water and urbanization across the tile.

3 · Land-cover classification

Land-cover is assigned deterministically from index thresholds — no black-box model:

4 · Habitat health & decline risk

Mean NDVI over the tile drives two 0–100 scores. Healthy vegetation supports richer bird habitat, so habitat health scales with NDVI, and decline risk is its complement:

Habitat Health = clamp((NDVI + 1) × 50, 0, 100)
Bird Decline Risk = 100 − Habitat Health

5 · Time-series & report

The NDVI time-series tab samples the archive roughly monthly across a date range to reveal seasonal cycles or gradual degradation. Any analysis can be exported as a documented PDF report.

Important: this is a demonstration of remote-sensing techniques, not a validated scientific instrument. Scores are index-derived proxies and should not replace field ecology or peer-reviewed population studies. See the About page for caveats.
🚀 Try it on the dashboard