dapper.geo package¶
Submodules¶
dapper.geo.constants module¶
dapper module: geo.constants.
dapper.geo.lonwrap module¶
dapper module: geo.lonwrap.
- dapper.geo.lonwrap.infer_lon_wrap(lon_vals)[source]¶
Infer whether longitudes are stored as [0, 360) or [-180, 180).
- Return type:
Literal['0_360','-180_180']- Parameters:
lon_vals (ndarray)
dapper.geo.sampling module¶
Point sampling and lightweight NetCDF helpers.
- class dapper.geo.sampling.LatLonSpec(lat_var, lon_var, lat_dim, lon_dim, lon_wrap, lat_1d, lon_1d)[source]¶
Bases:
objectMinimal spec for mapping (lat, lon) -> (i, j) in a gridded dataset.
- Parameters:
lat_var (str)
lon_var (str)
lat_dim (str)
lon_dim (str)
lon_wrap (Literal['0_360', '-180_180'])
lat_1d (ndarray)
lon_1d (ndarray)
-
lat_1d:
ndarray¶
-
lat_dim:
str¶
-
lat_var:
str¶
-
lon_1d:
ndarray¶
-
lon_dim:
str¶
-
lon_var:
str¶
-
lon_wrap:
Literal['0_360','-180_180']¶
- dapper.geo.sampling.ensure_weight(df, *, weight_col='weight', default_weight=1.0)[source]¶
Ensure df has a weight column. Returns a COPY if it needs to add the column.
- Return type:
DataFrame- Parameters:
df (DataFrame)
weight_col (str)
default_weight (float)
- dapper.geo.sampling.infer_grid_metadata(ds, *, lat_dim='lsmlat', lon_dim='lsmlon', lat_var=None, lon_var=None, lon_wrap='auto')[source]¶
Infer basic (regular) grid metadata for provenance.
Returns keys that are safe to stash in global attrs (namespaced with
dapper). If resolution can’t be inferred reliably, values may be omitted.- Return type:
dict- Parameters:
ds (Dataset)
lat_dim (str)
lon_dim (str)
lat_var (str | None)
lon_var (str | None)
lon_wrap (Literal['auto', '0_360', '-180_180'])
- dapper.geo.sampling.infer_lat_lon_vars(ds)[source]¶
Prefer ELM-style 2D vars (LATIXY/LONGXY), else fall back to common names.
- Return type:
tuple[str,str]- Parameters:
ds (Dataset)
- dapper.geo.sampling.infer_latlon_spec(ds, *, lat_dim='lsmlat', lon_dim='lsmlon', lat_var=None, lon_var=None, lon_wrap='auto')[source]¶
Build a LatLonSpec for fast nearest-neighbor lookup.
- Return type:
- Parameters:
ds (Dataset)
lat_dim (str)
lon_dim (str)
lat_var (str | None)
lon_var (str | None)
lon_wrap (Literal['auto', '0_360', '-180_180'])
- Assumptions (fine for your landuse/surf ELM-style files):
LATIXY/LONGXY exist as 2D (lat_dim, lon_dim), OR
lat/lon exist as 1D vectors.
- dapper.geo.sampling.nearest_ij(spec, lat, lon)[source]¶
Nearest-neighbor (i, j) on a regular lat/lon grid (lat_1d, lon_1d).
- Return type:
tuple[int,int]- Parameters:
spec (LatLonSpec)
lat (float)
lon (float)
- dapper.geo.sampling.points_to_nearest_cells(ds, points, *, lat_col='lat', lon_col='lon', weight_col='weight', lat_dim='lsmlat', lon_dim='lsmlon', lat_var=None, lon_var=None, lon_wrap='auto')[source]¶
Return a dataframe with (i_lat, i_lon) and the chosen cell center for each point. Keeps the original weight column.
- Return type:
DataFrame- Parameters:
ds (Dataset)
points (DataFrame)
lat_col (str)
lon_col (str)
weight_col (str)
lat_dim (str)
lon_dim (str)
lat_var (str | None)
lon_var (str | None)
lon_wrap (Literal['auto', '0_360', '-180_180'])
- dapper.geo.sampling.sample_gridded_dataset_points(ds, points, *, lat_col='lat', lon_col='lon', lat_dim='lsmlat', lon_dim='lsmlon', lat_var=None, lon_var=None, lon_wrap='auto', method='nearest', vars_include=None, vars_drop=None)[source]¶
Sample all spatial vars (those containing BOTH lat_dim and lon_dim) at the provided point locations.
- Return type:
Dataset- Parameters:
ds (Dataset)
points (DataFrame)
lat_col (str)
lon_col (str)
lat_dim (str)
lon_dim (str)
lat_var (str | None)
lon_var (str | None)
lon_wrap (Literal['auto', '0_360', '-180_180'])
method (Literal['nearest'])
vars_include (Sequence[str] | None)
vars_drop (Sequence[str] | None)
- Output convention:
lat_dim has length N (number of points)
lon_dim has length 1
no coordinate variables are created for lat_dim/lon_dim (matches your Toolik file)
- dapper.geo.sampling.write_netcdf(ds, out_path, *, compress=True, complevel=4, append_attrs=None, dapper_attrs=None, add_created_utc=True)[source]¶
Write a Dataset to NetCDF with optional encoding and attribute handling.
- Return type:
Path- Parameters:
ds (Dataset)
out_path (str | Path)
compress (bool)
complevel (int)
append_attrs (dict | None)
dapper_attrs (dict | None)
add_created_utc (bool)
dapper.geo.zonal module¶
Zonal (area-weighted) sampling utilities.
- class dapper.geo.zonal.RectilinearGrid(lat_dim, lon_dim, lon_wrap, lat_bnds, lon_bnds)[source]¶
Bases:
objectLightweight description of a rectilinear lat/lon grid in a consistent lon wrap.
- Parameters:
lat_dim (str)
lon_dim (str)
lon_wrap (Literal['0_360', '-180_180'])
lat_bnds (ndarray)
lon_bnds (ndarray)
-
lat_bnds:
ndarray¶
-
lat_dim:
str¶
-
lon_bnds:
ndarray¶
-
lon_dim:
str¶
-
lon_wrap:
Literal['0_360','-180_180']¶
- property nlat: int¶
Number of latitude cells.
- property nlon: int¶
Number of longitude cells.
- class dapper.geo.zonal.ZonalWeights(by_gid, lon_wrap, equal_area_crs)[source]¶
Bases:
objectZonal intersection weights grouped by feature id.
by_gid[gid]is a pandas DataFrame with columns:i_lat,i_lon,intersect_area_m2,weight.weightis normalized to sum to 1 for thatgid.
- Parameters:
by_gid (dict[str, DataFrame])
lon_wrap (Literal['0_360', '-180_180'])
equal_area_crs (str)
-
by_gid:
dict[str,DataFrame]¶
-
equal_area_crs:
str¶
-
lon_wrap:
Literal['0_360','-180_180']¶
- dapper.geo.zonal.infer_rectilinear_grid(ds, *, lat_dim='lsmlat', lon_dim='lsmlon', lat_var=None, lon_var=None, lon_wrap='auto')[source]¶
Infer a rectilinear grid specification (bounds and lon wrap) from a Dataset.
- Return type:
- Parameters:
ds (Dataset)
lat_dim (str)
lon_dim (str)
lat_var (str | None)
lon_var (str | None)
lon_wrap (Literal['auto', '0_360', '-180_180'])
- Preference order:
For rectilinear grids, use 1D coordinate vectors on (lat_dim, lon_dim) if present, unless the caller explicitly provides lat_var/lon_var.
Otherwise fall back to sampling.infer_latlon_spec (e.g., LATIXY/LONGXY or provided vars).
- dapper.geo.zonal.intersect_weights_rectilinear(ds, targets, *, lat_dim='lsmlat', lon_dim='lsmlon', lat_var=None, lon_var=None, lon_wrap='auto', min_frac=0.0)[source]¶
Compute area-weighted intersections between target polygons and a rectilinear grid.
- Return type:
- Parameters:
ds (Dataset)
targets (geopandas.GeoDataFrame)
lat_dim (str)
lon_dim (str)
lat_var (str | None)
lon_var (str | None)
lon_wrap (Literal['auto', '0_360', '-180_180'])
min_frac (float)
- dapper.geo.zonal.laea_crs_for_targets(targets_wgs84)[source]¶
One equal-area CRS for the whole domain (LAEA centered on centroid). Returns PROJ string usable by GeoPandas.
- Return type:
str- Parameters:
targets_wgs84 (geopandas.GeoDataFrame)
- dapper.geo.zonal.normalize_geometry_lon(geom, wrap)[source]¶
Apply the same lon wrap convention as sampling.normalize_lon to all coords. This is the simplest way to make target polygons comparable to source grid.
- Parameters:
wrap (Literal['0_360', '-180_180'])
- dapper.geo.zonal.reduce_wmode(da_sel, w, *, cell_dim='cell', tie_break='smallest')[source]¶
Reduce da_sel over cell_dim using an area-weighted mode.
da_sel: DataArray with dimension cell_dim and any number of other dims. w: 1D weights over cell_dim (normalized or not; only relative weights matter).
- Return type:
DataArray- Parameters:
da_sel (DataArray)
w (DataArray)
cell_dim (str)
tie_break (Literal['smallest', 'largest', 'first'])
- dapper.geo.zonal.sample_gridded_dataset_polygons(ds, targets, *, lat_dim='lsmlat', lon_dim='lsmlon', lat_var=None, lon_var=None, lon_wrap='auto', vars_include=None, vars_drop=None, agg_policy=None, default_float='wmean', default_int='wmode', weights=None)[source]¶
Zonal-sample spatial vars (those with BOTH lat_dim and lon_dim) onto target polygons.
- Return type:
Dataset- Parameters:
ds (Dataset)
targets (geopandas.GeoDataFrame)
lat_dim (str)
lon_dim (str)
lat_var (str | None)
lon_var (str | None)
lon_wrap (Literal['auto', '0_360', '-180_180'])
vars_include (Sequence[str] | None)
vars_drop (Sequence[str] | None)
agg_policy (dict[str, str] | None)
default_float (str)
default_int (str)
weights (ZonalWeights | None)
- Output convention matches sample_gridded_dataset_points:
lat_dim has length N (number of targets, in targets row order)
lon_dim has length 1
no coordinate variables are created for lat_dim/lon_dim
Module contents¶
dapper module: geo.__init__.