Multi-temporal Sentinel-2 vegetation analysis for parcel-level fire risk prioritization.
The San Bernardino Mountains are home to roughly 50,000 residents living in communities surrounded by mixed-conifer forest, a landscape where wildfire risk is constant and growing. The 2024 Bridge and Line fires burned over 100,000 acres and destroyed more than 80 structures in the region.
San Bernardino County's current approach to fire-hazard abatement relies on manual field inspections of private properties, which is reactive and difficult to scale. Inspectors typically identify hazardous conditions only after visible dieback has occurred. This project explores whether freely available satellite imagery can detect vegetation stress before it becomes visible on the ground, giving inspectors a data-driven way to prioritize which parcels to visit first.
Using multi-temporal Sentinel-2 imagery and three vegetation indices, the workflow produces a ranked list of parcels exhibiting signs of moisture stress or vegetation decline, along with inspector-facing handouts designed for field use without GIS expertise.
Developed as graduate coursework at the University of Redlands.
Sentinel-2 L2A imagery was acquired from the Copernicus Data Space for three dates chosen to capture distinct phases of vegetation condition across the 2025 growing season:
All scenes were filtered to less than 10% cloud cover. L2A products were selected over L1C for their atmospherically corrected surface reflectance values, which is important for meaningful cross-date comparison.
A vegetation mask was created to ensure that index calculations reflect tree canopy conditions rather than roads, buildings, or bare soil. The Sentinel-2 Scene Classification Layer (SCL) was evaluated across all three dates. June performed best due to higher sun angles reducing shadow-related misclassification, while October had significant soil misclassification issues. The June SCL was reclassified to a binary vegetation/non-vegetation layer, then refined by erasing buffered TIGER/Line road centerlines and Microsoft Building Footprints. The resulting mask was manually edited using high-resolution imagery as a visual reference.
A Python script using GDAL and NumPy calculates three vegetation indices for each date, producing nine output rasters. The 20-meter bands (B05, B8A, B11) are resampled to 10 meters using bilinear interpolation to match the native resolution of the 10-meter bands (B04, B08).
Normalized Difference Vegetation Index
A broadband measure of vegetation vigor.
(B08 − B04) / (B08 + B04)
Normalized Difference Water Index
A measure of canopy water content, using the Gao formulation rather than the McFeeters water body version.
(B08 − B11) / (B08 + B11)
Normalized Difference Red Edge Index
A sensitive indicator of chlorophyll concentration that can detect early-stage vegetation stress before it appears in standard NDVI.
(B8A − B05) / (B8A + B05)
Band 8A was chosen over Band 8 for NDRE due to its narrower spectral width, which is better suited for isolating the red edge reflectance plateau where chlorophyll changes are most detectable. A BOA (Bottom of Atmosphere) offset correction of −1000 was applied to account for the reflectance offset introduced in Sentinel-2 Processing Baseline 04.00+. Raw zero-value pixels were masked as NoData and propagated through the calculation pipeline, with a NoData value of −9999 to avoid collision with valid index values near zero.
Pixel-level index values were aggregated to San Bernardino County parcel polygons using zonal statistics. A composite risk score was calculated for each parcel using min-max normalization to a 0–1 range, weighted 40% toward current stress (October values, inverted so that lower vegetation health produces higher risk) and 60% toward seasonal change (the magnitude of decline from June to October). Each index was weighted equally within its group.
During initial ranking, parcels with physically impossible values (such as NDVI jumping from 0.45 to 0.95 between June and October) were traced back to parcels containing only one or two vegetation pixels, where a single anomalous pixel could dominate the statistics. A minimum pixel threshold of three was implemented, filtering approximately 23% of parcels and producing a much more stable ranking.
Of 30,254 parcels retained after filtering, 4,291 (14.2%) scored above 0.5. Three distinct high-priority clusters emerged:
| Cluster | High-Risk Parcels | Area |
|---|---|---|
| Hook Creek Tract | 216 | 17.4 acres |
| Arrow Bear Lake | 141 | 13.0 acres |
| Cedar Pines Park | 44 | 6.3 acres |
Seasonal patterns across all three indices confirmed expected behavior: peak greenness in June with progressive decline through August and October. This provided confidence that the indices and scoring methodology were capturing real vegetation dynamics rather than noise.
The three vegetation indices are correlated, so parcels that score poorly on one tend to score poorly on all three, amplifying the vegetation signal in the composite score. The seasonal change component cannot distinguish normal senescence from abnormal stress without a multi-year baseline. The weighting scheme (40/60 split, equal index weighting) is heuristic rather than calibrated, and scores are relative to this specific parcel population due to min-max normalization.
Python, GDAL, NumPy, Sentinel-2 L2A, ArcGIS Pro