Source code for hydromt_wflow.workflows.landuse
"""Landuse workflows for Wflow plugin."""
import logging
import numpy as np
import xarray as xr
logger = logging.getLogger(__name__)
__all__ = ["landuse", "lai"]
RESAMPLING = {"landuse": "nearest", "lai": "average"}
DTYPES = {"landuse": np.int16}
# def landuse(da, ds_like, data_catalog, fn_map, logger=logger, params=None):
[docs]
def landuse(da, ds_like, df, logger=logger, params=None):
"""Return landuse map and related parameter maps.
The parameter maps are prepared based on landuse map and
mapping table as provided in the generic data folder of hydromt.
The following topography maps are calculated:
- TODO
Parameters
----------
da : xarray.DataArray
DataArray containing LULC classes.
ds_like : xarray.DataArray
Dataset at model resolution.
Returns
-------
ds_out : xarray.Dataset
Dataset containing gridded landuse based maps
"""
keys = df.index.values
if params is None:
params = [p for p in df.columns if p != "description"]
elif not np.all(np.isin(params, df.columns)):
missing = [p for p in params if p not in df.columns]
raise ValueError(f"Parameter(s) missing in mapping file: {missing}")
# setup ds out
ds_out = xr.Dataset(coords=ds_like.raster.coords)
# setup reclass method
def reclass(x):
return np.vectorize(d.get)(x, nodata)
da = da.raster.interpolate_na(method="nearest")
# apply for each parameter
for param in params:
method = RESAMPLING.get(param, "average")
values = df[param].values
nodata = values[-1] # NOTE values is set in last row
d = dict(zip(keys, values)) # NOTE global param in reclass method
logger.info(f"Deriving {param} using {method} resampling (nodata={nodata}).")
da_param = xr.apply_ufunc(
reclass, da, dask="parallelized", output_dtypes=[values.dtype]
)
da_param.attrs.update(_FillValue=nodata) # first set new nodata values
ds_out[param] = da_param.raster.reproject_like(
ds_like, method=method
) # then resample
return ds_out
def lai(da, ds_like, logger=logger):
"""Return climatology of Leaf Area Index (LAI).
The following topography maps are calculated:
- LAI
Parameters
----------
da : xarray.DataArray or xarray.Dataset
DataArray or Dataset with LAI array containing LAI values.
ds_like : xarray.DataArray
Dataset at model resolution.
Returns
-------
da_out : xarray.DataArray
Dataset containing resampled LAI maps
"""
if isinstance(da, xr.Dataset) and "LAI" in da:
da = da["LAI"]
elif not isinstance(da, xr.DataArray):
raise ValueError("lai method requires a DataArray or Dataset with LAI array")
method = RESAMPLING.get(da.name, "average")
nodata = da.raster.nodata
logger.info(f"Deriving {da.name} using {method} resampling (nodata={nodata}).")
da = da.astype(np.float32)
da = da.where(da.values != nodata).fillna(
0.0
) # Assuming missing values correspond to bare soil, urban and snow (LAI=0.0)
da_out = da.raster.reproject_like(ds_like, method=method)
da_out.attrs.update(_FillValue=nodata)
return da_out