Source code for lusos.coverage
import itertools
import geopandas as gpd
import xarray as xr
from lusos.area_statistics import calc_areal_percentage_in_cells
from lusos.constants import MAIN_BGT_UNITS, MAIN_SOILMAP_UNITS
from lusos.lasso import LassoGrid
from lusos.preprocessing import group_bgt_units, group_soilmap_units
from lusos.utils import _add_layer_idx_column
[docs]
def bgt_soilmap_coverage(
bgt: gpd.GeoDataFrame, soilmap: gpd.GeoDataFrame, grid: LassoGrid
) -> xr.DataArray:
"""
Calculate per cell in a grid for each combination of BGT and Soil Map polygons what
percentage of a cell is covered by the combination. This returns a 3D DataArray with
dimensions ('y', 'x', 'layer') where the dimension 'layer' contains ordered BGT-Soilmap
layer combinations.
Parameters
----------
grid : :class:`~lusos.LassoGrid`
LassoGrid instance containing the raster grid to calculate the percentages for.
bgt : gpd.GeoDataFrame
GeoDataFrame containing the BGT data polygons.
soilmap : gpd.GeoDataFrame
GeoDataFrame containing the BGT data polygons.
Returns
-------
xr.DataArray
3D DataArray with the areal percentages.
"""
bgt = _prepare_bgt(bgt, MAIN_BGT_UNITS)
soilmap = _prepare_soilmap(soilmap, MAIN_SOILMAP_UNITS)
bgt_area = calc_areal_percentage_in_cells(bgt, grid, MAIN_BGT_UNITS)
soilmap_area = calc_areal_percentage_in_cells(soilmap, grid, MAIN_SOILMAP_UNITS)
area = soilmap_area.values[:, :, :, None] * bgt_area.values[:, :, None, :]
layers_area = _combine_bgt_soilmap_names(MAIN_BGT_UNITS, MAIN_SOILMAP_UNITS)
xco = grid.xcoordinates()
yco = grid.ycoordinates()
area = xr.DataArray(
area.reshape(len(yco), len(xco), len(layers_area)),
coords={"y": yco, "x": xco, "layer": layers_area},
dims=("y", "x", "layer"),
)
return area
def _combine_bgt_soilmap_names(bgt_layers, soilmap_layers):
return [f"{b}_{s}" for s, b in itertools.product(soilmap_layers, bgt_layers)]
def _prepare_bgt(bgt: gpd.GeoDataFrame, main_bgt_units: list):
bgt = group_bgt_units(bgt)
bgt = _add_layer_idx_column(bgt, main_bgt_units)
return bgt
def _prepare_soilmap(soilmap: gpd.GeoDataFrame, main_soilmap_units: list):
soilmap = group_soilmap_units(soilmap)
soilmap = _add_layer_idx_column(soilmap, main_soilmap_units)
soilmap.sort_values(by=["maparea_id", "soilunit_sequencenumber"], inplace=True)
return soilmap.drop_duplicates(subset="maparea_id")