Wasatch Mountains
How It Works

Methodology

How Wasatch Watch collects, processes, and interprets satellite data to produce monthly vegetation reports.

From Satellite to Report

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.

Data Foundation

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.

Where the Data Comes From

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.

Landsat 8 โ€” USGS

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.

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.

NOAA NCEI

National Centers for Environmental Information. Used to cross-reference monthly climate summaries and drought reports for narrative context in monthly reports.

Python โ€” rasterio / NumPy

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.

Step by Step

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.

1

Generate Raw NDVI Composites

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.

NDVI Formula NDVI = (NIR โˆ’ Red) / (NIR + Red)

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.

Why 5.5km Resolution?

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.

2

Compute Seasonal Anomalies

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.

Anomaly Formula Anomaly = NDVI_current โˆ’ mean(NDVI_same_month, 2013โ€“2026)

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.

Important Caveat

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.

3

Generate Difference Maps

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.

Month-over-Month Difference = NDVI_current_month โˆ’ NDVI_previous_month
Year-over-Year Difference = NDVI_current_month โˆ’ NDVI_same_month_last_year

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.

Remote Sensing Artifacts

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.

What This Analysis Cannot Tell You

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.

Code and Data

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.

Access the Code

Full repository, Colab notebooks, and processed data available on the Data & Repository page.