How Wasatch Watch collects, processes, and interprets satellite data to produce monthly vegetation reports.
Every monthly Wasatch Watch report is produced entirely from publicly available satellite data using Google Earth Engine and Python. The pipeline runs in three main stages: generating raw NDVI composites, computing seasonal anomalies, and producing difference maps. Each stage builds on the last to give a complete picture of what vegetation is doing and why.
All NDVI data is derived from the Landsat 8 satellite archive, which provides consistent, calibrated surface reflectance imagery from March 2013 to present. This gives Wasatch Watch a 12+ year historical baseline to compare any given month against.
All data used by Wasatch Watch is publicly available and free to access. The primary source is the USGS Landsat 8 archive, accessed through Google Earth Engine.
Primary data source. Provides surface reflectance imagery at 30m native resolution. Used to compute NDVI for every month from March 2013 to present. Accessed via Google Earth Engine.
Cloud-based geospatial processing platform. Used to filter, composite, and export Landsat imagery for the Wasatch Front bounding region without downloading raw data locally.
National Centers for Environmental Information. Used to cross-reference monthly climate summaries and drought reports for narrative context in monthly reports.
All post-processing, normalization, difference map generation, and visualization is done in Python using rasterio for raster handling and NumPy for array operations. Plots generated with Matplotlib.
The following pipeline is run for every monthly report. Steps 1 through 3 are sequential and each depends on the output of the previous step.
For each month, all available Landsat 8 scenes covering the Wasatch Front bounding box are filtered and combined into a single median composite image. Using the median rather than a single scene reduces the impact of cloud cover, sensor noise, and other remote sensing artifacts. Any given pixel takes the middle value across all cloud-free observations that month.
NDVI is then computed from the resulting composite using the standard formula, which compares the near-infrared (NIR) and red reflectance bands. The result is a per-pixel NDVI value ranging from -1 to 1, where higher values indicate more and healthier vegetation. Vegetated surfaces often only go as low as 0, while non-vegetated surfaces, specifically open water like Utah Lake or the Great Salt Lake, register negative values. This is part of the reason why lakes may register positive change on month-over-month or year-over-year maps, as subtracting a negative value yields a positive one.
The composite is exported as a GeoTIFF at 5.5km resolution, a deliberate downscale from Landsat's native 30m, to keep file sizes manageable across the 12+ year archive while preserving meaningful spatial patterns at the regional scale.
At the scale of the full Wasatch Front bounding region, 5.5km pixels provide sufficient spatial detail to distinguish mountain, valley, and urban zones while keeping the monthly archive at a practical file size. Individual pixel-level analysis is not the goal, regional pattern detection is.
Raw NDVI values alone are hard to interpret. A January reading of 0.2 could be normal for winter or anomalously low however without historical context it's impossible to know. The seasonal anomaly map answers the question: is this month above or below what we'd expect for this time of year?
For each month, a historical baseline is computed by averaging all same-month composites from the full 2013โ2026 archive. The current month's NDVI is then subtracted from that baseline pixel by pixel, producing a signed difference map where positive values indicate above-average vegetation and negative values indicate below-average vegetation relative to historical norms for that month.
This approach removes the dominant seasonal signal, the predictable rise and fall of vegetation through the year and isolates what is genuinely unusual. A drought in August shows up clearly because August vegetation is being compared against other Augusts, not against January.
Anomaly maps do not distinguish between causes. Above-average NDVI in winter can reflect reduced snow cover just as easily as healthier vegetation, and in most cases during the 2025โ26 season, the former is the correct interpretation. Each report addresses these interpretation ambiguities explicitly.
Where anomaly maps compare a month to its historical average, difference maps compare two specific months directly. Wasatch Watch produces two difference maps for every report: month-over-month (current vs. previous month) and year-over-year (current month vs. same month last year).
Both are computed the same way โ subtract one raw NDVI composite from another pixel by pixel. The result is a signed difference map where blue indicates NDVI increase and red indicates NDVI decrease between the two time points.
Difference maps are computed from raw NDVI prior to any normalization. This preserves the actual magnitude of change rather than a normalized relative score, making it easier to assess whether observed differences are ecologically meaningful or within normal noise.
Difference maps can produce spurious values over water bodies like the Great Salt Lake and Utah Lake due to surface reflectance variability unrelated to vegetation. These artifacts are identified and flagged explicitly in each report and should be disregarded.
Transparency about limitations is a core part of the Wasatch Watch methodology. The following are known constraints on interpretation that apply to every report.
Snow cover and vegetation are confounded. NDVI cannot distinguish between snow-covered ground and low-vegetation ground because both produce low values. Similarly, snowmelt can raise NDVI without any new plant growth. Every winter report addresses this explicitly.
Cloud cover reduces data quality. Months with persistent cloud cover produce fewer usable Landsat scenes. The median composite approach mitigates this but does not eliminate it as heavily clouded months may have fewer observations per pixel and higher uncertainty.
NDVI measures greenness, not health. A plant under drought stress can appear green until late in the stress cycle. NDVI is a useful but imperfect proxy for vegetation health. This limitation is part of the motivation for the ongoing research into more direct photosynthetic indicators.
5.5km resolution loses fine spatial detail. Urban/suburban boundaries, individual riparian corridors, and small forest patches are not resolvable at this scale. The analysis is designed for regional pattern detection, not site-level assessment.
Anomaly baselines evolve over time. As more years are added to the archive the historical mean shifts slightly. Anomaly values from early years (2013โ2015) are computed against a shorter baseline than recent years and may be slightly less stable.
All code used to generate Wasatch Watch maps and reports is open source and available in the GitHub repository. The Google Earth Engine scripts for composite generation and the Python post-processing notebooks are both included. The full processed data archive is available in the linked Google Drive folder.
Full repository, Colab notebooks, and processed data available on the Data & Repository page.