crop-monitoring-sar-fused
Cloud-gap-resilient crop monitoring by fusing Sentinel-1 SAR (VV/VH) with the Sentinel-2 NDVI time series. SAR backscatter is weather-independent: where optical scenes are cloud-contaminated, S1 VH temporal features (mean, std, p10/p90) and the VH/VV ratio carry canopy-structure and canopy-moisture signal that tracks crop growth stages independently of cloud cover. The fusion is honest gap-filling: on dates where S2 passes a cloud gate the NDVI observation anchors the harmonic_fit; on cloudy dates the SAR-derived canopy proxy fills the temporal slot so the season is not truncated. Per-field zonal_stats then aggregate the fused phenology signal to one row per field — the same crop-monitoring product table as the optical-only recipe, but with continuous temporal coverage through cloudy periods (Central Valley foggiest months: November–February). This is the reliability upgrade that commercial crop-monitoring products use (Indigo Ag, Granular, Proagrica). The SAR leg does not require a trained model — VH mean and VH/VV ratio are direct empirical proxies (Veloso 2017). The recipe deliberately keeps the fusion simple enough to inspect: every input to every merged date is recorded in the provenance block.
- recipe
- Apache-2.0
- outputs
- CC-BY-4.0
The contract
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
| output | kind | layer | what it is |
|---|---|---|---|
primary |
not declared | ['compute/field_stats'] |
|
show_your_work |
not declared | ['compute/ndvi', 'compute/s1-ndvi-proxy', 'compute/ndvi-fused', 'compute/phenology', 'compute/s1-temporal'] |
|
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_stats: carries an unsubstituted ${...} template; compute/ndvi: layer type "raster_timeseries" is not one folia-view parses; compute/ndvi-fused: layer type "raster_timeseries" is not one folia-view parses; and 7 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
registry/recipes/crop-monitoring-sar-fused/folia.yaml