
Build a per-crop physical land extension with FAO fallow-inclusive arable land.
Source:R/arable_permanent_land.R
build_fao_arable_fallow_extension.RdTurn per-crop harvested-derived physical area into a fallow-inclusive physical
land extension whose arable-crop total reconciles to FAO's physical
Arable land and whose perennial-crop total reconciles to FAO's physical
Permanent crops (get_arable_permanent_land()), per (area_code, year).
This is the FAO-land-base analogue of build_cropgrids_land_extension()(source = "cropgrids_fallow"). The existing method takes the fallow magnitude from
FAOSTAT "Temporary fallow" (item 6640, a sparse and, for many rain-fed
economies, absent series) applied to a single CROPGRIDS 2020 snapshot. Here
the fallow magnitude is the physical arable land that carried no harvest in
that specific year, FAO Arable land - sum(cropped arable physical), so a
drought year's resting cropland is charged to the crops whose rotation it
supports and the arable-crop footprint totals match FAO's land survey in every
year (see the Tunisia/Portugal motivation in get_arable_permanent_land()).
Reconciliation, per (area_code, year):
Arable crops (
items_prod_full$Herb_Woody != "Woody"): rotational fallowmax(0, arable_ha - S)(withSthe cropped arable physical total) is distributed withattribute_fallow_to_crops()usingfallow_weights, so the arable total reachesarable_ha. Where the cropped physical already exceedsarable_ha(heavy multi-cropping, or inflated fodder harvested area) there is no fallow to add and the arable crops are scaled down toarable_hainstead, the physical-container correction. Either way the arable total equals FAOarable_haby construction.Perennial crops (
Herb_Woody == "Woody") receive no fallow and are scaled so their total equals FAOpermanent_ha, preserving the within-group physical pattern. A positive target without a corresponding arable crop row or positive perennial base area is reported as an error because it cannot be reconciled without inventing a crop allocation.
This is the crop-side default of the land-balance footprint
(build_land_balance_footprint()).
Usage
build_fao_arable_fallow_extension(
harvested = NULL,
arable_permanent = NULL,
base_extension = NULL,
fallow_weights = NULL,
temporary_grassland = NULL,
items_prod_full = whep::items_prod_full
)Arguments
- harvested
Tibble of harvested area with columns
year,area_code,item_cbs_code,harvested_ha. IfNULL, built fromget_primary_production()(unit == "ha"); passing a cached harvested table avoids that rebuild.- arable_permanent
Tibble of FAO physical land base with columns
area_code,year,arable_ha,permanent_ha. IfNULL,get_arable_permanent_land()is called for the years present inbase_extension.- base_extension
Tibble of cropped (fallow-excluding) per-crop physical area with columns
year,area_code,item_cbs_code,impact_u. IfNULL, built withbuild_cropgrids_land_extension()(source = "cropgrids")fromharvested.- fallow_weights
Tibble of
area_code,item_cbs_code,weightgiving the within-country fallow allocation weight, e.g. fromgridded_fallow_weights()(the recommended agro-climatic, rainfed-gated weight). IfNULL, fallow is distributed in proportion to each arable crop's cropped physical area (perennials always excluded). The cropped-area fallback is used independently for an area when it has no usable supplied weights, a non-finite or negative supplied weight, or a non-positive total.- temporary_grassland
Tibble of grassland occupation in the
build_grassland_land_extension()schema (area_code,year,item_cbs_code,impact_u); its CBS 3002 rows are the temporary grassland netted out of the arable target so ordinary crops plus CBS 3002 reconcile to FAO Arable land (see the temporary-grassland section). IfNULL(default) it is built withbuild_grassland_land_extension()(grassland_metric = "occupation")so netting still applies (correct but slow); supply the table to skip that rebuild, or pass one with no CBS 3002 rows to opt out.- items_prod_full
Crosswalk used to classify
item_cbs_codeas arable or perennial viaHerb_Woody. Defaults to items_prod_full.
Value
A tibble with columns year, area_code, item_cbs_code,
impact_u (fallow-inclusive physical land in hectares), and method_land
("fao_arable_fallow").
Temporary grassland (no double-count)
FAO's Arable land total includes temporary meadows and pastures —
temporary grassland is part of cropland, not grassland. That land is also
reported separately as CBS 3002 (Temporary grassland) by
build_grassland_land_extension(), so summing both extensions naively would
count it twice. Pass that grassland occupation as temporary_grassland and
its CBS 3002 is netted out of the arable target before reconciling ordinary
crops, enforcing the invariant per (area_code, year)
ordinary crop occupation (incl. fallow) + CBS 3002 = FAO Arable land. The
land-balance footprint (build_land_balance_footprint()) does exactly this,
passing the grassland occupation it has already built. When
temporary_grassland is NULL (default) the grassland occupation extension
is built internally so netting still happens — correct but slow, since that
build reruns much of the pipeline; supply the table to avoid the rebuild.
Where modelled CBS 3002 exceeds FAO Arable land (survey vs.
fodder-reconstruction mismatch) the arable target is clamped at 0 and a
warning is emitted.
Examples
harvested <- tibble::tribble(
~year, ~area_code, ~item_cbs_code, ~harvested_ha,
2020L, 1L, 2511L, 300, # wheat (arable)
2020L, 1L, 2560L, 100 # coconuts (perennial)
)
base_extension <- tibble::tribble(
~year, ~area_code, ~item_cbs_code, ~impact_u,
2020L, 1L, 2511L, 300,
2020L, 1L, 2560L, 100
)
arable_permanent <- tibble::tribble(
~area_code, ~year, ~arable_ha, ~permanent_ha,
1L, 2020L, 500, 100
)
items <- tibble::tribble(
~item_cbs_code, ~Herb_Woody,
2511L, "Herbaceous",
2560L, "Woody"
)
temporary_grassland <- tibble::tribble(
~area_code, ~year, ~item_cbs_code, ~impact_u,
1L, 2020L, 3002L, 100 # temporary grassland netted out of arable
)
build_fao_arable_fallow_extension(
harvested, arable_permanent, base_extension,
temporary_grassland = temporary_grassland,
items_prod_full = items
)
#> # A tibble: 2 × 5
#> year area_code item_cbs_code impact_u method_land
#> <int> <int> <int> <dbl> <chr>
#> 1 2020 1 2511 400 fao_arable_fallow
#> 2 2020 1 2560 100 fao_arable_fallow