Geospatial Data Science · Remote Sensing · Environmental Monitoring

Manure Spotter

Google Earth Engine · Sentinel-2 & Landsat-8/9 · Python · Published open access in Remote Sensing Applications: Society and Environment (2026), with Pouyan Hatami and Song Gao

Read the open-access article View the code on GitHub

Spreading livestock waste on frozen or snow-covered ground can be hazardous to water quality: frozen soils block infiltration, dormant (or non-existent) crops take up little of the nutrients, and snowmelt can carry manure off of fields and into surface waters. Yet no free tool existed to let regulators, nonprofits, or citizens actually watch for it, and enforcement mostly relied on the operations self-reporting their own violations.

Manure spread in dark streaks across a snow-covered field
Livestock waste spread across a snow-covered field—visible from the ground, and, with this workflow, from space.

Manure Spotter is my answer to that lacuna; it’s an open-source, reproducible Python workflow in Google Earth Engine that maps waste applications on snow using freely available Sentinel-2 and Landsat-8/9 imagery. It was built and validated across three Wisconsin regions during the January–February 2025 spreading season and published in Remote Sensing Applications: Society and Environment.

How it works

For each target date, the workflow pulls whatever Sentinel-2 or Landsat-8/9 imagery is available and first masks out everything it shouldn’t judge—clouds and cloud shadows, snow-free ground, and non-cropland—so the classifier only ever considers pixels where a spread could plausibly be seen. Only then does it classify the surface, and finally clean and vectorize the flagged pixels into discrete, dated spread polygons, merging overlapping detections and dropping noise—alongside image chips that users can eyeball before a site visit. The full daily logic looks like this:

Flowchart of the daily image-processing pipeline
The daily processing logic: whichever of Sentinel-2 or Landsat-8/9 is available is masked, then classified across the observable domain and vectorized into detection polygons.

At the heart of that pipeline is the classification step. Within the masked, observable area, the model distinguishes the spectral signature of freshly applied waste from the surrounding snow, flagging candidate manure one pixel at a time—then step-by-step rules turn those pixels into the discrete spreads an investigator can act on.

Sparse white pixels on a black field where the model detects manure
The AI model “sees” manure as these white pixels.
Detected manure spreads outlined in green on an aerial view of farmland
Step-by-step instructions tell the model how to convert manure pixels to discrete spreads.

Results

Within the observable domain, the classifier achieved high precision (0.990, 95% CI 0.977–1.000) and recall (0.942, 95% CI 0.934–0.949) for the livestock-waste class, measured with a rigorous design-based, pixel-day accuracy assessment. Just as important, the workflow is honest about when it can see: it tracks how many days each area is actually “validatable” given clouds and snow, rather than pretending to full coverage.

Maps showing the number of validatable days across the study regions
Validatable days across the study regions—how often conditions actually permitted a confident observation.

Why it matters

The outputs are designed for real use: vectorized spread polygons and image chips that support complaint triage and targeted site visits, built entirely on free imagery and open code so that a state agency or a small watershed nonprofit could run it without needing to allocate any additional funding.

My role: lead author and developer. I designed the workflow, assembled the training and validation data, wrote the Google Earth Engine / Python codebase, and led the accuracy assessment and manuscript.
← Back to all work