Experiment · Work in progress

Cover Crop Explorer

Instead of performing a census, can you do it from space?

This is an experiment and a work in progress. I was learning remote sensing and wanted something real to point it at. Agriculture and sustainability have interested me for a long time, I'd been wanting to build a web app, and the whole thing started in a class at an AGU conference on hosting exactly this kind of app.

Cover cropping matters for long-term soil health and nutrient management. Whether a given orchard planted one is normally something you find out by asking the grower or by driving out to look. So the question became: instead of surveying orchards on the ground, can you estimate which ones planted a winter cover crop from satellite imagery alone?

It's not my thesis. It's an applied remote-sensing experiment that turned into an interactive map.

A wide false-colour banner of Central Valley farmland: thousands of rectangular field parcels rendered in bright green and red against black, forming a mosaic that follows the roads and river bends of the valley floor.
The Central Valley, parcel by parcel. Almond orchards are small, numerous, and packed tight against each other. That's exactly why walking them is impractical, and why a satellite is worth trying.

How it works

An almond orchard in winter is mostly bare trees over bare ground. Plant a cover crop and the green shows up between the tree rows, where Sentinel-2 can see it. I read each orchard's greenness and bare-soil signal across a winter and ask whether the inter-row space greened up in a way bare soil wouldn't.

The obvious failure mode is tree canopy. A mature orchard is greener than a young one no matter what's growing underneath, so a naive greenness threshold would quietly reward old orchards and punish new plantings. To get around that, I stratify orchards by tree age and judge each one against peers of its own canopy maturity rather than against the region as a whole.

  1. Sentinel-2 surface reflectance
  2. orchard-level greenness & bare-soil signals
  3. comparison within tree-age groups
  4. cover-crop classification + confidence
  5. static PMTiles web map
Stack and hosting

Everything runs client-side. Google Earth Engine and Python (scikit-learn, pandas) do the analysis offline. The app itself is fully static: PMTiles vector tiles, deck.gl rendering over MapLibre GL, Plotly for the per-orchard charts. No backend, no database, no API keys, nothing to keep running.

What it does

Read that first number carefully: 16,365 is how many orchards I classified, not how many were found to be cover-cropped. In any given winter, most of them are not.

In the app

Four views, in the order you'd meet them: the extent, the detail, one orchard, and the same ground across six winters.

Screenshot of the Cover Crop Explorer map zoomed to farmland around Chowchilla and Madera. Hundreds of irregular orchard polygons are filled brown, green or flat gray over a pale basemap. A dark control panel on the left shows a season slider set to 2023 and counters reading Cover Cropped 2,696, Uncertain 3,319, Bare 10,350.
Zoomed in near Chowchilla, the pattern is legible: green orchards next to bare ones, and a lot of gray where the signal wasn't strong enough to call. The map at working zoom, winter 2023–24, over Madera and Merced counties. Green polygons carry a cover-crop estimate, brown ones read as bare soil, and flat gray marks orchards the classifier could not call with confidence. Green and brown are shaded by confidence, so a more opaque polygon is a firmer call.
Close-up screenshot of the map with one green orchard polygon highlighted in a yellow outline among brown and gray neighbours. The side panel reads: Orchard Age Old, Management Type Cover Cropped, Fit (norm) 0.69, Confidence 0.69, Data Points 5, Streak 5, and shows a small line chart of classification confidence from 2018 to 2023.
Select one orchard and the summary becomes a specific claim about a specific parcel, with the confidence attached. One orchard selected, outlined in yellow. The panel reports its age class, its estimate for the selected winter, a confidence value, how many usable observations that estimate rests on, and how many consecutive winters it has carried the same call.
A Plotly line chart titled Classification Confidence, plotting six points from 2018 to 2023. One brown point sits near 90 percent in 2018; the remaining five are green, dropping to about 15 percent in 2019, rising to 100 percent in 2020 and 2021, falling to about 45 percent in 2022, and ending near 70 percent in 2023.
The per-orchard chart is the honest part: confidence moves year to year, and the app shows you when it dips instead of hiding it. Per-orchard history for the selected parcel. Each point is one winter, coloured by the class assigned that year and positioned by how confident that call was. Two near-certain winters, one that barely cleared the floor, and a first year read as bare soil.

Scrubbing the slider is why this is a map and not a table: the same ground, six winters running, changing colour as orchards come in and out of cover.

The same view, six winters. Left to right: 2018–19, 2019–20, 2020–21, 2021–22, 2022–23, 2023–24.

The map near Chowchilla in winter 2018–19, mostly brown and gray parcels with scattered green.
Winter 2018–19
The same view in winter 2019–20.
Winter 2019–20
The same view in winter 2020–21, with noticeably more green in the centre of the frame.
Winter 2020–21
The same view in winter 2021–22.
Winter 2021–22
The same view in winter 2022–23, the greenest of the six frames.
Winter 2022–23
The same view in winter 2023–24.
Winter 2023–24
The app's time control. A dark panel labelled Time holds a slider reading Season: 2023, filled to the right-hand end of its track, with a play button beside it.
The time control. Six positions, one per winter, plus a play button that steps through them.

Honest limits & status

Honest limits

  • This is an experiment and a work in progress, not a finished product.
  • Every estimate is an inference from satellite-observed inter-row greening, not a ground-truthed survey. Nothing here was checked in a field. Low-confidence calls are kept separate from firm ones and left out of the headline counts, but "confident" here means the signal was clean, not that anyone verified it.
  • I'm not claiming adoption rates, acreage totals, or policy conclusions. The map estimates a signal. It doesn't measure a practice. And to say it once more, because it's the number people misread: 16,365 is how many orchards I classified, not how many planted cover crops.

The app's own interface has known problems. Its multi-winter streak filter offers a "7+ season" option that matches zero orchards, because the dataset only holds six winters and nothing can ever satisfy it. Some of the app's UI text overstates what the analysis supports. I'd rather say that here than have someone find it themselves. The interface is a claim, and the claim isn't always calibrated to the data behind it.

The obvious next step is ground truth. Without a set of orchards whose management is actually known, there's no way to put an accuracy number on any of this, and an accuracy number is what would turn the experiment into evidence.

Links

The map is the deliverable, and it's better used than described. Pick a winter, zoom into an orchard block, and click a polygon to see what the classifier thought and how sure it was.

Explore the experiment in the live map.

Get in touch

I'm an early-career environmental data scientist in the SF Bay Area, working on remote sensing for water resources and agriculture. If any of this is close to what your team does, I'd like to hear about it.