This specification defines a model-agnostic intermediate format for events, analogous to the PEcAn met standard. It is intended to:
- Consolidate events from diverse sources (e.g. RS, farmer surveys, literature)
- Represent ensemble-reesolved realizations of events that can be used in modeling workflows.
- Be consumed by a model specific event parser like
parse.events.<model>that can be called bywrite.configs.<model>.
This format for events that is based on the format used in the fieldactivity nested within a geoJSON data structure1, but has been modified to be more generalized, and focused on aggregating data from many sources that have varied types of information.
The format is a GeoJSON FeatureCollection. Each Feature in the collection represents a single site. The properties of each feature contain an array of events that occurred at that site.
These properties can be assigned a site_id and handled separately, e.g. as one JSON file for each combination of site / scenario / ensemble member.
They can also be aggregated into GeoJSON and stored for efficient storage and retrieval e.g. in a Parquet file (or other JSON supporting database).
Minimum requirements depend on use case (model, data source)
MVP spec support generation of model-specific input files (initially, the motivating use-case of SIPNET).
We define a core minimum required parameters - namely event_type, date, location. Beyond that, required fields will vary depending on:
- event type
- data source and method used to estimate optional parameters
- target model or workflow
This will necessarily require flexibility and prevents establishing a broad set of global requirements.
Model-specific translation happens downstream
Events spec should contain model-agnostic information. And the aim is to eliminate or minimize model or method specific information in this format. Model specific information may be stored in additional JSON objects associated with events, but this will not be part of the specification.
Each model will implement its own parse_events.<model> function that is called by write.configs.<model>.
Raw vs processed data products are distinct
- Upsteram raw/ observed data may include probabilistic or uncertain inputs (e.g. tillage probability, RS index values)
- Model-ready realizations: deterministic with ensemble based uncertainty
Will evolve iteratively
Rather than defining a universal standard up front, we build toward it by grounding in motivating use-cases and actual implementation.
Each Feature has a geometry and a properties object. The properties object contains site identifiers and an events array.
Events are represented as a `FeatureCollection` where each `Feature` is a management event.
```json
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [ ... ]
},
"properties": {
"...": "..."
}
}
]
}Feature Properties:
site: The site identifier.events: An array of event objects.
Event Object:
date: The date of the event inYYYY-MM-DDformat.mgmt_operations_event: The type of management event.mgmt_event_notes: General notes for the event.- ... and other event-specific properties.
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [ -121.50, 37.20 ]
},
"properties": {
"site": "9900000099",
"ensemble": "1",
"events": [
{
"mgmt_operations_event": "tillage",
"date": "2023-09-08",
},
{
"mgmt_operations_event": "planting",
"date": "2023-09-12",
"planted_crop": "RYE",
},
{
"mgmt_operations_event": "fertilizer",
"date": "2019-06-20",
"fertilizer_type": "fertilizer_type_mineral",
"N_in_applied_fertilizer": 23,
},
{
"mgmt_operations_event": "harvest",
"date": "2018-06-12",
"harvest_crop": "Rye"
},
{
"mgmt_operations_event": "irrigation",
"date": "2018-06-12",
"irrig_amount_depth": "5"
}
]
}
}
]
}{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [ -121.50, 37.20 ]
},
"properties": {
"site": "9900000099",
"ensemble": "1",
"events": [
{
"mgmt_operations_event": "tillage",
"date": "2023-09-08",
"tillage_practice": "tillage_practice_primary",
"tillage_implement": "TI002"
},
{
"mgmt_operations_event": "planting",
"date": "2023-09-12",
"planted_crop": ["RYE", "ZZ3"],
"planting_material_weight": [158.7, 12.4],
"planting_notes": "Rye: sangaste"
},
{
"mgmt_operations_event": "fertilizer",
"date": "2019-06-20",
"fertilizer_total_amount": 220,
"N_in_applied_fertilizer": 23,
"phosphorus_applied_fert": 10,
"fertilizer_K_applied": 8
},
{
"mgmt_operations_event": "harvest",
"date": "2018-06-12",
"harvest_operat_component": "leaf",
"harvest_area": 4.3,
"harvest_cut_height": 6,
"harvest_yield_harvest_dw": 1985,
"yield_C_at_harvest": 830
}
]
}
}
]
}Example: Required fields for tillage intensity
| Field | Type | Required | Description |
|---|---|---|---|
| event_type | string | yes | Must be "tillage" |
| date | date | yes | ISO 8601 date |
| intensity | float | optional | E.g., 0.3 |
| intensity_method | string | optional | Method used (e.g., "NDVI-diff [link]" or "USDA DB [link]") |
If intensity is provided, include intensity_method to describe meaning.
| Event Type | Required Fields | Optional Fields |
|---|---|---|
| planting | date, crop_type | method, seed_density |
| harvest | date, crop_type | fraction_removed, method |
| fertilizer | date, amount_N, type | amount_C, mineral_vs_organic |
| tillage | date | intensity, intensity_method |
| irrigation | date, amount | type, method |
Note: this - especially optional fields - will necesarrily evolve to handle needs of different data sources, methods, and models.
For properties with enumerated values, we use a code (e.g., HARM, FECD) from the ICASA Dictionary. There is a lookup table for these in the FieldActivity repository under inst/display_names.csv
planted_crop(fromCRIDcode list)planting_material_weightplanting_depthplanting_material_sourceplanting_notes
harvest_areaharvest_crop(fromCRIDcode list)harvest_yield_harvest_dwharv_yield_harv_f_wtyield_C_at_harvestharvest_moistureharvest_method(fromHARMcode list)harvest_operat_component(fromHACOMcode list)canopy_height_harvestharvest_cut_heightplant_density_harvestharvest_residue_placement(fromharvest_residue_placement_choicelist)harvest_commentsharvest_amountharv_operat_main_productharv_operation_byproductharv_operat_size_categorharvest_yld_stdevharv_yield_harv_f_wt_sd
tillage_practice(fromtillage_practice_choicelist)tillage_implement(fromTIIMPcode list)tillage_operations_depthtillage_treatment_notes
fertilizer_type(e.g.,fertilizer_type_organic,fertilizer_type_mineral,fertilizer_type_soil_amendment)organic_material(fromOMCDcode list)animal_fert_usageorg_matter_moisture_concorg_matter_carbon_concfertilizer_product_namefertilizer_material(fromFECDcode list)fertilizer_material_sourcefertilizer_applic_method(fromFEACDcode list)application_depth_fertfertilizer_total_amountN_in_applied_fertilizerN_in_soluble_fertilizerphosphorus_applied_fertfertilizer_K_appliedS_in_applied_fertilizerCa_in_applied_fertilizerMg_in_applied_fertilizerNa_in_applied_fertilizerCu_in_applied_fertilizerZn_in_applied_fertilizerB_in_applied_fertilizerMn_in_applied_fertilizerSe_in_applied_fertilizerFe_in_applied_fertilizerother_element_in_applied_fertilizerfertilizer_notes
grazing_species(fromgrazing_species_choicelist)grazing_species_age_group(e.g.,0-1,1-2,2-3,3-5,5-10,10+,grazing_species_age_group_mix)livestock_densitygrazing_intensitygrazing_period(date range, may also be represented bystart_dateandend_date)grazing_type(fromgrazing_type_choicelist)grazing_areagrazing_material_removed_propgrazing_starting_heightgrazing_end_heightgrazing_notes
mowed_crop(fromCRIDcode list)mowed_areamowing_method(frommowing_method_choiceslist)mowing_canopy_heightmowing_cut_heightmowing_notes
chemical_type(fromchemical_type_choicelist)chemical_product_namechemical_applic_material(fromactive_substancecode list)chemical_applic_target(fromCH_TARGETScode list)chemical_applic_method(fromFEACDcode list)chemical_applic_amountapplication_depth_chemapplication_ph_startapplication_ph_endchemical_applic_notes
plant_pop_reduct_cum
fuel_amount
irrigation_operation(fromIROPcode list, e.g.,soil,canopy,drip,furrow,flood)irrig_amount_depthirrigation_applic_depthirrigation_notes
mulch_type(fromMLTPcode list)mulch_thicknessmulch_cover_fractionmulch_color(fromMLCOLcode list)mulch_placement_notes
mulch_type_remove(fromMLTPcode list)mulch_removal_notes
weeding_notes
bed_prep_notes
other_notes
Note: This event type appears in some data sources. It is recommended to record organic material applications as a fertilizer event for consistency.
organic_material(fromOMCDcode list)org_material_applic_meth(alias forfertilizer_applic_method)org_material_appl_depth(alias forapplication_depth_fert)org_material_applic_amnt(alias forfertilizer_total_amount)org_material_coverorg_matter_moisture_concorg_matter_carbon_concorganic_material_N_concorganic_material_P_concorganic_material_K_concorg_material_lignin_concorg_material_c_to_norg_material_notes
Note: This event type appears in some data sources. It is recommended to record measurements as an observation event for consistency.
carbon_soil_totcarbon_soil_tot_sd
Observations are used in the fieldActivity app so that users can record measurements or observations that are not directly tied to a management event.
Since "observations" are a separate concept from "events", we may want to either a) not use this (as we already have a way of storing this information) or b) optionally create a separate Observations section (outside the agronomic‐events GeoJSON spec) to avoid confusion.
observation_type(e.g.,soil,vegetation,water,pests,management)observation_notes
observation_type:
soil_layer_top_depthsoil_layer_base_depthsoil_classification_by_layer(fromsoil_classification_by_layer_choicelist)root_depthsoil_compactification_depthearthworm_countsoil_image(URL)carbon_soil_totcarbon_soil_tot_sd
growth_stage(fromgrowth_stage_choicelist)plant_densityspecific_leaf_arealeaf_area_indexcanopy_heightcanopeo_readingcanopeo_image(URL)total_biomass_dwtops_Ctops_C_stdroots_Croots_C_std
floodwater_depthwater_table_depth
Footnotes
-
The
fieldactivityJSON evennt schema is defined in ui_structure.json. ↩