crop-yield-proxy

unverified
v0.1 AOI: San Joaquin Valley cropland — Tulare / Fresno County · bbox -120.05, 36.55, -119.85, 36.72

Per-field seasonal greenness integral as a first-order yield proxy, derived from a Sentinel-2 NDVI time series over a growing season. For each field boundary in the Fields of the World layer, cumulate NDVI across all clear passes (temporal_reduce sum) to form the season-integrated greenness, then aggregate that integral to the field polygon (zonal_stats mean). The resulting per-field table ranks fields by cumulative photosynthetic activity and serves as a lightweight, reproducible yield proxy that requires no ground-truth calibration. The method follows Bolton & Friedl 2013 (cites_papers: bolton-2013): integrated seasonal NDVI correlates with crop yield across major staple crops in CONUS, with the temporal sum over the growing season outperforming peak or mean in most settings. Swap inputs.date_range to isolate a single growing season, or swap inputs.fields for a parcel set, without touching the layer graph.

Primary outputs
compute/field_yield_proxy
Show your work
compute/ndvi compute/seasonal_integral
Provenance
source_scene_ids
License
recipe
Apache-2.0
outputs
CC-BY-4.0
Map preview and live runs are available in the workbench.

The contract

legacy dialectcandidate

Read from this recipe's own declarations — parameters:, outputs:, requires:, and the ops its layers name. Not from its style blocks and not from any benchmark: a colour ramp is not a contract, and a measured run is evidence about one AOI rather than a domain.

Parameters

The legacy dialect has no typed parameter schema. Read the folia.yaml for what this recipe takes; nothing here can type-check it.

Outputs

outputkindlayerwhat it is
primary not declared ['compute/field_yield_proxy']
show_your_work not declared ['compute/ndvi', 'compute/seasonal_integral']
provenance not declared ['source_scene_ids']

Capabilities it requires

The legacy dialect has no requires: block.

Where it runs

  • Browser preview does not run here compute/field_yield_proxy: carries an unsubstituted ${...} template; compute/ndvi: layer type "raster_timeseries" is not one folia-view parses; compute/seasonal_integral: carries an unsubstituted ${...} template; and 1 more
  • Local CLI (folia run) runs here runs locally through the legacy (no spec_version) parser
  • Operated fleet (POST /plan, /run) runs here legacy dialect: a lock binds by the cut's layer names, not by digest
open in Workbench from registry/recipes/crop-yield-proxy/folia.yaml