diff --git a/README.md b/README.md index 21bd733f..141b81e2 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,10 @@ Rasters are regularly gridded datasets like GeoTIFFs, JPGs, and PNGs. In the GIS world, rasters are used for representing continuous phenomena (e.g. elevation, rainfall, distance), either directly as numerical values, or as RGB images created for humans to view. Rasters typically have two spatial dimensions, but may have any number of other dimensions (time, type of measurement, etc.) #### Supported Spatial Functions with Supported Inputs -โœ… = native backend    ๐Ÿ”„ = accepted (CPU fallback) + +Each cell shows the **feature tier** for that function on that backend (see [issue #2415](https://github.com/xarray-contrib/xarray-spatial/issues/2415)). A blank cell means no implementation on that backend; a path that was previously documented as a CPU fallback is reported here as `advanced` (it works as a documented execution mode, but is not native-parity tested). + +โœ… stable ยท ๐Ÿ”ผ advanced ยท ๐Ÿงช experimental ยท ๐Ÿ”ง internal ยท ๐Ÿšซ unsupported [GeoTIFF / COG I/O](#geotiff--cog-io) ยท [Classification](#classification) ยท [Diffusion](#diffusion) ยท [Focal](#focal) ยท [Morphological](#morphological) ยท [Fire](#fire) ยท [Multispectral](#multispectral) ยท [Multivariate](#multivariate) ยท [MCDA](#multi-criteria-decision-analysis-mcda) ยท [Pathfinding](#pathfinding) ยท [Proximity](#proximity) ยท [Reproject / Merge](#reproject--merge) ยท [Raster / Vector Conversion](#raster--vector-conversion) ยท [Surface](#surface) ยท [Hydrology](#hydrology) ยท [Flood](#flood) ยท [Interpolation](#interpolation) ยท [Dasymetric](#dasymetric) ยท [Zonal](#zonal) ยท [Utilities](#utilities) @@ -152,10 +155,10 @@ VRT is supported as a conservative advanced feature for simple GeoTIFF mosaics, | Name | Description | NumPy | Dask | CuPy GPU | Dask+CuPy GPU | Cloud | |:-----|:------------|:-----:|:----:|:--------:|:-------------:|:-----:| -| [open_geotiff](xrspatial/geotiff/__init__.py) | Read GeoTIFF / COG / VRT | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [to_geotiff](xrspatial/geotiff/__init__.py) | Write DataArray as GeoTIFF / COG | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [write_geotiff_gpu](xrspatial/geotiff/__init__.py) | GPU-accelerated GeoTIFF / COG write | | | โœ…๏ธ | | | -| [write_vrt](xrspatial/geotiff/__init__.py) | Generate VRT mosaic from GeoTIFFs | โœ…๏ธ | | | | | +| [open_geotiff](xrspatial/geotiff/__init__.py) | Read GeoTIFF / COG / VRT | โœ… | โœ… | ๐Ÿงช | ๐Ÿงช | ๐Ÿ”ผ | +| [to_geotiff](xrspatial/geotiff/__init__.py) | Write DataArray as GeoTIFF / COG | โœ… | โœ… | ๐Ÿงช | ๐Ÿงช | ๐Ÿ”ผ | +| [write_geotiff_gpu](xrspatial/geotiff/__init__.py) | GPU-accelerated GeoTIFF / COG write | | | ๐Ÿงช | | | +| [write_vrt](xrspatial/geotiff/__init__.py) | Generate VRT mosaic from GeoTIFFs | ๐Ÿ”ผ | | | | | `open_geotiff` and `to_geotiff` auto-dispatch to the correct backend: @@ -213,9 +216,9 @@ ds.xrs.open_geotiff('large_dem.tif') # read windowed to Dataset | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Resample](xrspatial/resample.py) | Changes raster resolution (cell size) without reprojection. Nearest, bilinear, cubic, average, mode, min, max, median methods | Standard (interpolation / block aggregation) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Reproject](xrspatial/reproject/__init__.py) | Reprojects a raster to a new CRS with Numba JIT / CUDA coordinate transforms and resampling. Supports vertical datums (EGM96, EGM2008) and horizontal datum shifts (NAD27, OSGB36, etc.) | Standard (inverse mapping) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Merge](xrspatial/reproject/__init__.py) | Merges multiple rasters into a single mosaic with configurable overlap strategy. Same-CRS tiles skip reprojection and are placed by direct coordinate alignment | Standard (mosaic) | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | +| [Resample](xrspatial/resample.py) | Changes raster resolution (cell size) without reprojection. Nearest, bilinear, cubic, average, mode, min, max, median methods | Standard (interpolation / block aggregation) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Reproject](xrspatial/reproject/__init__.py) | Reprojects a raster to a new CRS with Numba JIT / CUDA coordinate transforms and resampling. Supports vertical datums (EGM96, EGM2008) and horizontal datum shifts (NAD27, OSGB36, etc.) | Standard (inverse mapping) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Merge](xrspatial/reproject/__init__.py) | Merges multiple rasters into a single mosaic with configurable overlap strategy. Same-CRS tiles skip reprojection and are placed by direct coordinate alignment | Standard (mosaic) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | Built-in Numba JIT and CUDA projection kernels bypass pyproj for per-pixel coordinate transforms. pyproj is used only for CRS metadata parsing (~1ms, once per call) and output grid boundary estimation (~500 control points, once per call). Any CRS pair without a built-in kernel falls back to pyproj automatically. @@ -245,12 +248,12 @@ Built-in Numba JIT and CUDA projection kernels bypass pyproj for per-pixel coord | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Preview](xrspatial/preview.py) | Downsamples a raster to target pixel dimensions for visualization | Custom | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | -| [Rescale](xrspatial/normalize.py) | Min-max normalization to a target range (default [0, 1]) | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Standardize](xrspatial/normalize.py) | Z-score normalization (subtract mean, divide by std) | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [rechunk_no_shuffle](xrspatial/utils.py) | Rechunk dask arrays using whole-chunk multiples (no shuffle) | Custom | ๐Ÿ”„ | โœ…๏ธ | ๐Ÿ”„ | โœ…๏ธ | -| [fused_overlap](xrspatial/utils.py) | Fuse sequential map_overlap calls into a single pass | Custom | ๐Ÿ”„ | โœ…๏ธ | ๐Ÿ”„ | โœ…๏ธ | -| [multi_overlap](xrspatial/utils.py) | Run multi-output kernel in a single overlap pass | Custom | ๐Ÿ”„ | โœ…๏ธ | ๐Ÿ”„ | โœ…๏ธ | +| [Preview](xrspatial/preview.py) | Downsamples a raster to target pixel dimensions for visualization | Custom | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Rescale](xrspatial/normalize.py) | Min-max normalization to a target range (default [0, 1]) | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Standardize](xrspatial/normalize.py) | Z-score normalization (subtract mean, divide by std) | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [rechunk_no_shuffle](xrspatial/utils.py) | Rechunk dask arrays using whole-chunk multiples (no shuffle) | Custom | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [fused_overlap](xrspatial/utils.py) | Fuse sequential map_overlap calls into a single pass | Custom | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [multi_overlap](xrspatial/utils.py) | Run multi-output kernel in a single overlap pass | Custom | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ----------- @@ -258,27 +261,27 @@ Built-in Numba JIT and CUDA projection kernels bypass pyproj for per-pixel coord | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Aspect](xrspatial/aspect.py) | Computes downslope direction of each cell in degrees | Horn 1981 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Northness](xrspatial/aspect.py) | North-south component of aspect: cos(aspect) for linear models | Stage 1976 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Eastness](xrspatial/aspect.py) | East-west component of aspect: sin(aspect) for linear models | Stage 1976 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Curvature](xrspatial/curvature.py) | Measures rate of slope change (concavity/convexity) at each cell | Zevenbergen & Thorne 1987 | โœ…๏ธ |โœ…๏ธ |โœ…๏ธ | โœ…๏ธ | -| [Hillshade](xrspatial/hillshade.py) | Simulates terrain illumination from a given sun angle and azimuth | GDAL gdaldem | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Roughness](xrspatial/terrain_metrics.py) | Computes local relief as max minus min elevation in a 3ร—3 window | GDAL gdaldem | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Sky-View Factor](xrspatial/sky_view_factor.py) | Measures the fraction of visible sky hemisphere at each cell | Zakek et al. 2011 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Slope](xrspatial/slope.py) | Computes terrain gradient steepness at each cell in degrees | Horn 1981 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Terrain Generation](xrspatial/terrain.py) | Generates synthetic terrain from fBm or ridged fractal noise with optional domain warping, Worley blending, and hydraulic erosion | Custom (fBm) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [TPI](xrspatial/terrain_metrics.py) | Computes Topographic Position Index (center minus mean of neighbors) | Weiss 2001 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [TRI](xrspatial/terrain_metrics.py) | Computes Terrain Ruggedness Index (local elevation variation) | Riley et al. 1999 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Landforms](xrspatial/terrain_metrics.py) | Classifies terrain into 10 landform types using the Weiss (2001) TPI scheme | Weiss 2001 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Viewshed](xrspatial/viewshed.py) | Determines visible cells from a given observer point on terrain | GRASS GIS r.viewshed | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [Cumulative Viewshed](xrspatial/visibility.py) | Counts how many observers can see each cell | Custom | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | ๐Ÿ”„ | -| [Visibility Frequency](xrspatial/visibility.py) | Fraction of observers with line-of-sight to each cell | Custom | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | ๐Ÿ”„ | -| [Line of Sight](xrspatial/visibility.py) | Elevation profile and visibility along a point-to-point transect | Custom | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | ๐Ÿ”„ | -| [Min Observable Height](xrspatial/experimental/min_observable_height.py) | Finds the minimum observer height needed to see each cell *(experimental)* | Custom | โœ…๏ธ | | | | -| [Perlin Noise](xrspatial/perlin.py) | Generates smooth continuous random noise for procedural textures | Perlin 1985 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Worley Noise](xrspatial/worley.py) | Generates cellular (Voronoi) noise returning distance to the nearest feature point | Worley 1996 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Hydraulic Erosion](xrspatial/erosion.py) | Simulates particle-based water erosion to carve valleys and deposit sediment | Custom | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Bump Mapping](xrspatial/bump.py) | Adds randomized bump features to simulate natural terrain variation | Custom | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | +| [Aspect](xrspatial/aspect.py) | Computes downslope direction of each cell in degrees | Horn 1981 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Northness](xrspatial/aspect.py) | North-south component of aspect: cos(aspect) for linear models | Stage 1976 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Eastness](xrspatial/aspect.py) | East-west component of aspect: sin(aspect) for linear models | Stage 1976 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Curvature](xrspatial/curvature.py) | Measures rate of slope change (concavity/convexity) at each cell | Zevenbergen & Thorne 1987 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Hillshade](xrspatial/hillshade.py) | Simulates terrain illumination from a given sun angle and azimuth | GDAL gdaldem | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Roughness](xrspatial/terrain_metrics.py) | Computes local relief as max minus min elevation in a 3ร—3 window | GDAL gdaldem | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Sky-View Factor](xrspatial/sky_view_factor.py) | Measures the fraction of visible sky hemisphere at each cell | Zakek et al. 2011 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Slope](xrspatial/slope.py) | Computes terrain gradient steepness at each cell in degrees | Horn 1981 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Terrain Generation](xrspatial/terrain.py) | Generates synthetic terrain from fBm or ridged fractal noise with optional domain warping, Worley blending, and hydraulic erosion | Custom (fBm) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [TPI](xrspatial/terrain_metrics.py) | Computes Topographic Position Index (center minus mean of neighbors) | Weiss 2001 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [TRI](xrspatial/terrain_metrics.py) | Computes Terrain Ruggedness Index (local elevation variation) | Riley et al. 1999 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Landforms](xrspatial/terrain_metrics.py) | Classifies terrain into 10 landform types using the Weiss (2001) TPI scheme | Weiss 2001 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Viewshed](xrspatial/viewshed.py) | Determines visible cells from a given observer point on terrain | GRASS GIS r.viewshed | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Cumulative Viewshed](xrspatial/visibility.py) | Counts how many observers can see each cell | Custom | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Visibility Frequency](xrspatial/visibility.py) | Fraction of observers with line-of-sight to each cell | Custom | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Line of Sight](xrspatial/visibility.py) | Elevation profile and visibility along a point-to-point transect | Custom | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Min Observable Height](xrspatial/experimental/min_observable_height.py) | Finds the minimum observer height needed to see each cell | Custom | ๐Ÿงช | | | | +| [Perlin Noise](xrspatial/perlin.py) | Generates smooth continuous random noise for procedural textures | Perlin 1985 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Worley Noise](xrspatial/worley.py) | Generates cellular (Voronoi) noise returning distance to the nearest feature point | Worley 1996 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Hydraulic Erosion](xrspatial/erosion.py) | Simulates particle-based water erosion to carve valleys and deposit sediment | Custom | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Bump Mapping](xrspatial/bump.py) | Adds randomized bump features to simulate natural terrain variation | Custom | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ----------- @@ -286,35 +289,35 @@ Built-in Numba JIT and CUDA projection kernels bypass pyproj for per-pixel coord | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Flow Direction (D8)](xrspatial/hydro/flow_direction_d8.py) | Computes D8 flow direction from each cell toward the steepest downhill neighbor | O'Callaghan & Mark 1984 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Flow Direction (Dinf)](xrspatial/hydro/flow_direction_dinf.py) | Computes D-infinity flow direction as a continuous angle toward the steepest downslope facet | Tarboton 1997 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Flow Direction (MFD)](xrspatial/hydro/flow_direction_mfd.py) | Partitions flow to all downslope neighbors with an adaptive exponent (Qin et al. 2007) | Qin et al. 2007 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Flow Accumulation (D8)](xrspatial/hydro/flow_accumulation_d8.py) | Counts upstream cells draining through each cell in a D8 flow direction grid | Jenson & Domingue 1988 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Flow Accumulation (Dinf)](xrspatial/hydro/flow_accumulation_dinf.py) | Accumulates upstream area by splitting flow proportionally between two neighbors (Tarboton 1997) | Tarboton 1997 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | -| [Flow Accumulation (MFD)](xrspatial/hydro/flow_accumulation_mfd.py) | Accumulates upstream area through all MFD flow paths weighted by directional fractions | Qin et al. 2007 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | -| [Flow Length (D8)](xrspatial/hydro/flow_length_d8.py) | Computes D8 flow path length from each cell to outlet (downstream) or from divide (upstream) | Standard (D8 tracing) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | -| [Flow Length (Dinf)](xrspatial/hydro/flow_length_dinf.py) | Proportion-weighted flow path length using D-inf angle decomposition (downstream or upstream) | Tarboton 1997 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | -| [Flow Length (MFD)](xrspatial/hydro/flow_length_mfd.py) | Proportion-weighted flow path length using MFD fractions (downstream or upstream) | Qin et al. 2007 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | -| [Fill (D8)](xrspatial/hydro/fill_d8.py) | Fills depressions in a DEM using Planchon-Darboux iterative flooding | Planchon & Darboux 2002 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Sink (D8)](xrspatial/hydro/sink_d8.py) | Identifies and labels depression cells in a D8 flow direction grid | Standard (D8 tracing) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Watershed (D8)](xrspatial/hydro/watershed_d8.py) | Labels each cell with the pour point it drains to via D8 flow direction | Standard (D8 tracing) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Watershed (Dinf)](xrspatial/hydro/watershed_dinf.py) | Labels each cell with the pour point it drains to via D-infinity flow direction | Tarboton 1997 | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [Watershed (MFD)](xrspatial/hydro/watershed_mfd.py) | Labels each cell with the pour point it drains to via MFD fractions | Qin et al. 2007 | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [Basins](xrspatial/hydro/watershed_d8.py) | Delineates drainage basins by labeling each cell with its outlet ID | Standard (D8 tracing) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Stream Order (D8)](xrspatial/hydro/stream_order_d8.py) | Assigns Strahler or Shreve stream order to cells in a drainage network | Strahler 1957, Shreve 1966 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Stream Order (Dinf)](xrspatial/hydro/stream_order_dinf.py) | Strahler/Shreve stream ordering on D-infinity flow direction grids | Tarboton 1997 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Stream Order (MFD)](xrspatial/hydro/stream_order_mfd.py) | Strahler/Shreve stream ordering on MFD fraction grids | Freeman 1991 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Stream Link (D8)](xrspatial/hydro/stream_link_d8.py) | Assigns unique IDs to each stream segment between junctions | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Stream Link (Dinf)](xrspatial/hydro/stream_link_dinf.py) | Stream link segmentation on D-infinity flow direction grids | Tarboton 1997 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Stream Link (MFD)](xrspatial/hydro/stream_link_mfd.py) | Stream link segmentation on MFD fraction grids | Freeman 1991 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Snap Pour Point](xrspatial/hydro/snap_pour_point_d8.py) | Snaps pour points to the highest-accumulation cell within a search radius | Custom | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Flow Path (D8)](xrspatial/hydro/flow_path_d8.py) | Traces downstream flow paths from start points through a D8 direction grid | Standard (D8 tracing) | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [Flow Path (Dinf)](xrspatial/hydro/flow_path_dinf.py) | Traces downstream flow paths using D-infinity dominant neighbor | Tarboton 1997 | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [Flow Path (MFD)](xrspatial/hydro/flow_path_mfd.py) | Traces downstream flow paths through MFD fraction-weighted neighbors | Qin et al. 2007 | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [HAND (D8)](xrspatial/hydro/hand_d8.py) | Computes Height Above Nearest Drainage by tracing D8 flow to the nearest stream cell | Nobre et al. 2011 | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [HAND (Dinf)](xrspatial/hydro/hand_dinf.py) | Computes Height Above Nearest Drainage using D-infinity flow direction | Nobre et al. 2011 | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [HAND (MFD)](xrspatial/hydro/hand_mfd.py) | Computes Height Above Nearest Drainage using MFD fractions | Nobre et al. 2011 | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [TWI](xrspatial/hydro/twi_d8.py) | Topographic Wetness Index: ln(specific catchment area / tan(slope)) | Beven & Kirkby 1979 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | +| [Flow Direction (D8)](xrspatial/hydro/flow_direction_d8.py) | Computes D8 flow direction from each cell toward the steepest downhill neighbor | O'Callaghan & Mark 1984 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Direction (Dinf)](xrspatial/hydro/flow_direction_dinf.py) | Computes D-infinity flow direction as a continuous angle toward the steepest downslope facet | Tarboton 1997 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Direction (MFD)](xrspatial/hydro/flow_direction_mfd.py) | Partitions flow to all downslope neighbors with an adaptive exponent (Qin et al. 2007) | Qin et al. 2007 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Accumulation (D8)](xrspatial/hydro/flow_accumulation_d8.py) | Counts upstream cells draining through each cell in a D8 flow direction grid | Jenson & Domingue 1988 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Accumulation (Dinf)](xrspatial/hydro/flow_accumulation_dinf.py) | Accumulates upstream area by splitting flow proportionally between two neighbors (Tarboton 1997) | Tarboton 1997 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Accumulation (MFD)](xrspatial/hydro/flow_accumulation_mfd.py) | Accumulates upstream area through all MFD flow paths weighted by directional fractions | Qin et al. 2007 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Length (D8)](xrspatial/hydro/flow_length_d8.py) | Computes D8 flow path length from each cell to outlet (downstream) or from divide (upstream) | Standard (D8 tracing) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Length (Dinf)](xrspatial/hydro/flow_length_dinf.py) | Proportion-weighted flow path length using D-inf angle decomposition (downstream or upstream) | Tarboton 1997 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Length (MFD)](xrspatial/hydro/flow_length_mfd.py) | Proportion-weighted flow path length using MFD fractions (downstream or upstream) | Qin et al. 2007 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Fill (D8)](xrspatial/hydro/fill_d8.py) | Fills depressions in a DEM using Planchon-Darboux iterative flooding | Planchon & Darboux 2002 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Sink (D8)](xrspatial/hydro/sink_d8.py) | Identifies and labels depression cells in a D8 flow direction grid | Standard (D8 tracing) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Watershed (D8)](xrspatial/hydro/watershed_d8.py) | Labels each cell with the pour point it drains to via D8 flow direction | Standard (D8 tracing) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Watershed (Dinf)](xrspatial/hydro/watershed_dinf.py) | Labels each cell with the pour point it drains to via D-infinity flow direction | Tarboton 1997 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Watershed (MFD)](xrspatial/hydro/watershed_mfd.py) | Labels each cell with the pour point it drains to via MFD fractions | Qin et al. 2007 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Basins](xrspatial/hydro/watershed_d8.py) | Delineates drainage basins by labeling each cell with its outlet ID | Standard (D8 tracing) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Stream Order (D8)](xrspatial/hydro/stream_order_d8.py) | Assigns Strahler or Shreve stream order to cells in a drainage network | Strahler 1957, Shreve 1966 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Stream Order (Dinf)](xrspatial/hydro/stream_order_dinf.py) | Strahler/Shreve stream ordering on D-infinity flow direction grids | Tarboton 1997 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Stream Order (MFD)](xrspatial/hydro/stream_order_mfd.py) | Strahler/Shreve stream ordering on MFD fraction grids | Freeman 1991 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Stream Link (D8)](xrspatial/hydro/stream_link_d8.py) | Assigns unique IDs to each stream segment between junctions | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Stream Link (Dinf)](xrspatial/hydro/stream_link_dinf.py) | Stream link segmentation on D-infinity flow direction grids | Tarboton 1997 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Stream Link (MFD)](xrspatial/hydro/stream_link_mfd.py) | Stream link segmentation on MFD fraction grids | Freeman 1991 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Snap Pour Point](xrspatial/hydro/snap_pour_point_d8.py) | Snaps pour points to the highest-accumulation cell within a search radius | Custom | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Path (D8)](xrspatial/hydro/flow_path_d8.py) | Traces downstream flow paths from start points through a D8 direction grid | Standard (D8 tracing) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Path (Dinf)](xrspatial/hydro/flow_path_dinf.py) | Traces downstream flow paths using D-infinity dominant neighbor | Tarboton 1997 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flow Path (MFD)](xrspatial/hydro/flow_path_mfd.py) | Traces downstream flow paths through MFD fraction-weighted neighbors | Qin et al. 2007 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [HAND (D8)](xrspatial/hydro/hand_d8.py) | Computes Height Above Nearest Drainage by tracing D8 flow to the nearest stream cell | Nobre et al. 2011 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [HAND (Dinf)](xrspatial/hydro/hand_dinf.py) | Computes Height Above Nearest Drainage using D-infinity flow direction | Nobre et al. 2011 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [HAND (MFD)](xrspatial/hydro/hand_mfd.py) | Computes Height Above Nearest Drainage using MFD fractions | Nobre et al. 2011 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [TWI](xrspatial/hydro/twi_d8.py) | Topographic Wetness Index: ln(specific catchment area / tan(slope)) | Beven & Kirkby 1979 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ----------- @@ -322,13 +325,13 @@ Built-in Numba JIT and CUDA projection kernels bypass pyproj for per-pixel coord | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Flood Depth](xrspatial/flood.py) | Computes water depth above terrain from a HAND raster and water level | Standard (HAND-based) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Inundation](xrspatial/flood.py) | Produces a binary flood/no-flood mask from a HAND raster and water level | Standard (HAND-based) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Curve Number Runoff](xrspatial/flood.py) | Estimates runoff depth from rainfall using the SCS/NRCS curve number method | SCS/NRCS | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Travel Time](xrspatial/flood.py) | Estimates overland flow travel time via simplified Manning's equation | Manning 1891 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Vegetation Roughness](xrspatial/flood.py) | Derives Manning's roughness coefficients from NLCD land cover or NDVI | SCS/NRCS | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Vegetation Curve Number](xrspatial/flood.py) | Derives SCS curve numbers from land cover and hydrologic soil group | SCS/NRCS | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Flood Depth (Vegetation)](xrspatial/flood.py) | Manning-based steady-state flow depth incorporating vegetation roughness | Manning 1891 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | +| [Flood Depth](xrspatial/flood.py) | Computes water depth above terrain from a HAND raster and water level | Standard (HAND-based) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Inundation](xrspatial/flood.py) | Produces a binary flood/no-flood mask from a HAND raster and water level | Standard (HAND-based) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Curve Number Runoff](xrspatial/flood.py) | Estimates runoff depth from rainfall using the SCS/NRCS curve number method | SCS/NRCS | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Travel Time](xrspatial/flood.py) | Estimates overland flow travel time via simplified Manning's equation | Manning 1891 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Vegetation Roughness](xrspatial/flood.py) | Derives Manning's roughness coefficients from NLCD land cover or NDVI | SCS/NRCS | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Vegetation Curve Number](xrspatial/flood.py) | Derives SCS curve numbers from land cover and hydrologic soil group | SCS/NRCS | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flood Depth (Vegetation)](xrspatial/flood.py) | Manning-based steady-state flow depth incorporating vegetation roughness | Manning 1891 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ----------- @@ -336,24 +339,24 @@ Built-in Numba JIT and CUDA projection kernels bypass pyproj for per-pixel coord | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Atmospherically Resistant Vegetation Index (ARVI)](xrspatial/multispectral.py) | Vegetation index resistant to atmospheric effects using blue band correction | Kaufman & Tanre 1992 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Burn Area Index (BAI)](xrspatial/multispectral.py) | Spectral distance to charcoal reflectance point for burn scar detection | Chuvieco et al. 2002 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Enhanced Built-Up and Bareness Index (EBBI)](xrspatial/multispectral.py) | Highlights built-up areas and barren land from thermal and SWIR bands | As-syakur et al. 2012 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Enhanced Vegetation Index (EVI)](xrspatial/multispectral.py) | Enhanced vegetation index reducing soil and atmospheric noise | Huete et al. 2002 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Green Chlorophyll Index (GCI)](xrspatial/multispectral.py) | Estimates leaf chlorophyll content from green and NIR reflectance | Gitelson et al. 2003 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Modified Soil Adjusted Vegetation Index (MSAVI2)](xrspatial/multispectral.py) | Self-adjusting soil line vegetation index, no L parameter needed | Qi et al. 1994 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Normalized Burn Ratio (NBR)](xrspatial/multispectral.py) | Measures burn severity using NIR and SWIR band difference | USGS Landsat | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Normalized Burn Ratio 2 (NBR2)](xrspatial/multispectral.py) | Refines burn severity mapping using two SWIR bands | USGS Landsat | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Normalized Difference Built-up Index (NDBI)](xrspatial/multispectral.py) | Picks out built-up and urban areas from SWIR and NIR bands | Zha et al. 2003 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Normalized Difference Moisture Index (NDMI)](xrspatial/multispectral.py) | Detects vegetation moisture stress from NIR and SWIR reflectance | USGS Landsat | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Normalized Difference Snow Index (NDSI)](xrspatial/multispectral.py) | Separates snow and ice from clouds using green and SWIR bands | Hall et al. 1995 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Normalized Difference Water Index (NDWI)](xrspatial/multispectral.py) | Maps open water bodies using green and NIR band difference | McFeeters 1996 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Modified Normalized Difference Water Index (MNDWI)](xrspatial/multispectral.py) | Detects water in urban areas using green and SWIR bands | Xu 2006 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Normalized Difference Vegetation Index (NDVI)](xrspatial/multispectral.py) | Quantifies vegetation density from red and NIR band difference | Rouse et al. 1973 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Optimized Soil Adjusted Vegetation Index (OSAVI)](xrspatial/multispectral.py) | SAVI with fixed L=0.16, tuned for sparse vegetation | Rondeaux et al. 1996 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Soil Adjusted Vegetation Index (SAVI)](xrspatial/multispectral.py) | Vegetation index with soil brightness correction factor | Huete 1988 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [Structure Insensitive Pigment Index (SIPI)](xrspatial/multispectral.py) | Estimates carotenoid-to-chlorophyll ratio for plant stress detection | Penuelas et al. 1995 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | -| [True Color](xrspatial/multispectral.py) | Composites red, green, and blue bands into a natural color image | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | +| [Atmospherically Resistant Vegetation Index (ARVI)](xrspatial/multispectral.py) | Vegetation index resistant to atmospheric effects using blue band correction | Kaufman & Tanre 1992 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Burn Area Index (BAI)](xrspatial/multispectral.py) | Spectral distance to charcoal reflectance point for burn scar detection | Chuvieco et al. 2002 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Enhanced Built-Up and Bareness Index (EBBI)](xrspatial/multispectral.py) | Highlights built-up areas and barren land from thermal and SWIR bands | As-syakur et al. 2012 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Enhanced Vegetation Index (EVI)](xrspatial/multispectral.py) | Enhanced vegetation index reducing soil and atmospheric noise | Huete et al. 2002 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Green Chlorophyll Index (GCI)](xrspatial/multispectral.py) | Estimates leaf chlorophyll content from green and NIR reflectance | Gitelson et al. 2003 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Modified Soil Adjusted Vegetation Index (MSAVI2)](xrspatial/multispectral.py) | Self-adjusting soil line vegetation index, no L parameter needed | Qi et al. 1994 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Normalized Burn Ratio (NBR)](xrspatial/multispectral.py) | Measures burn severity using NIR and SWIR band difference | USGS Landsat | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Normalized Burn Ratio 2 (NBR2)](xrspatial/multispectral.py) | Refines burn severity mapping using two SWIR bands | USGS Landsat | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Normalized Difference Built-up Index (NDBI)](xrspatial/multispectral.py) | Picks out built-up and urban areas from SWIR and NIR bands | Zha et al. 2003 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Normalized Difference Moisture Index (NDMI)](xrspatial/multispectral.py) | Detects vegetation moisture stress from NIR and SWIR reflectance | USGS Landsat | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Normalized Difference Snow Index (NDSI)](xrspatial/multispectral.py) | Separates snow and ice from clouds using green and SWIR bands | Hall et al. 1995 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Normalized Difference Water Index (NDWI)](xrspatial/multispectral.py) | Maps open water bodies using green and NIR band difference | McFeeters 1996 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Modified Normalized Difference Water Index (MNDWI)](xrspatial/multispectral.py) | Detects water in urban areas using green and SWIR bands | Xu 2006 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Normalized Difference Vegetation Index (NDVI)](xrspatial/multispectral.py) | Quantifies vegetation density from red and NIR band difference | Rouse et al. 1973 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Optimized Soil Adjusted Vegetation Index (OSAVI)](xrspatial/multispectral.py) | SAVI with fixed L=0.16, tuned for sparse vegetation | Rondeaux et al. 1996 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Soil Adjusted Vegetation Index (SAVI)](xrspatial/multispectral.py) | Vegetation index with soil brightness correction factor | Huete 1988 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Structure Insensitive Pigment Index (SIPI)](xrspatial/multispectral.py) | Estimates carotenoid-to-chlorophyll ratio for plant stress detection | Penuelas et al. 1995 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [True Color](xrspatial/multispectral.py) | Composites red, green, and blue bands into a natural color image | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | For a broader catalog of spectral indices and sensor-specific band combinations, see [awesome-spectral-indices](https://github.com/awesome-spectral-indices/awesome-spectral-indices) and its companion xarray library [spyndex](https://github.com/awesome-spectral-indices/spyndex). @@ -364,16 +367,16 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Binary](xrspatial/classify.py) | Binarizes values by membership in a target set (1 if match, 0 otherwise) | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Box Plot](xrspatial/classify.py) | Classifies values into bins based on box plot quartile boundaries | PySAL mapclassify | โœ…๏ธ |โœ… | โœ… | ๐Ÿ”„ | -| [Equal Interval](xrspatial/classify.py) | Divides the value range into equal-width bins | PySAL mapclassify | โœ…๏ธ |โœ… | โœ… |โœ… | -| [Head/Tail Breaks](xrspatial/classify.py) | Classifies heavy-tailed distributions using recursive mean splitting | PySAL mapclassify | โœ…๏ธ |โœ… | ๐Ÿ”„ | ๐Ÿ”„ | -| [Maximum Breaks](xrspatial/classify.py) | Finds natural groupings by maximizing differences between sorted values | PySAL mapclassify | โœ…๏ธ |โœ… | ๐Ÿ”„ | ๐Ÿ”„ | -| [Natural Breaks](xrspatial/classify.py) | Optimizes class boundaries to minimize within-class variance (Jenks) | Jenks 1967, PySAL | โœ…๏ธ |โœ… | ๐Ÿ”„ | ๐Ÿ”„ | -| [Percentiles](xrspatial/classify.py) | Assigns classes based on user-defined percentile breakpoints | PySAL mapclassify | โœ…๏ธ |โœ… | โœ… | ๐Ÿ”„ | -| [Quantile](xrspatial/classify.py) | Distributes values into classes with equal observation counts | PySAL mapclassify | โœ…๏ธ |โœ… | โœ… | ๐Ÿ”„ | -| [Reclassify](xrspatial/classify.py) | Remaps pixel values to new classes using a user-defined lookup | PySAL mapclassify | โœ…๏ธ |โœ… | โœ… |โœ… | -| [Std Mean](xrspatial/classify.py) | Classifies values by standard deviation intervals from the mean | PySAL mapclassify | โœ…๏ธ |โœ… | โœ… |โœ… | +| [Binary](xrspatial/classify.py) | Binarizes values by membership in a target set (1 if match, 0 otherwise) | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Box Plot](xrspatial/classify.py) | Classifies values into bins based on box plot quartile boundaries | PySAL mapclassify | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Equal Interval](xrspatial/classify.py) | Divides the value range into equal-width bins | PySAL mapclassify | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Head/Tail Breaks](xrspatial/classify.py) | Classifies heavy-tailed distributions using recursive mean splitting | PySAL mapclassify | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Maximum Breaks](xrspatial/classify.py) | Finds natural groupings by maximizing differences between sorted values | PySAL mapclassify | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Natural Breaks](xrspatial/classify.py) | Optimizes class boundaries to minimize within-class variance (Jenks) | Jenks 1967, PySAL | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Percentiles](xrspatial/classify.py) | Assigns classes based on user-defined percentile breakpoints | PySAL mapclassify | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Quantile](xrspatial/classify.py) | Distributes values into classes with equal observation counts | PySAL mapclassify | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Reclassify](xrspatial/classify.py) | Remaps pixel values to new classes using a user-defined lookup | PySAL mapclassify | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Std Mean](xrspatial/classify.py) | Classifies values by standard deviation intervals from the mean | PySAL mapclassify | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ------- @@ -381,18 +384,18 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Apply](xrspatial/focal.py) | Applies a custom function over a sliding neighborhood window | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Hotspots](xrspatial/focal.py) | Identifies statistically significant spatial clusters using Getis-Ord Gi* | Getis & Ord 1992 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Emerging Hotspots](xrspatial/emerging_hotspots.py) | Classifies time-series hot/cold spot trends using Gi* and Mann-Kendall | Getis & Ord 1992, Mann 1945 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Mean](xrspatial/focal.py) | Computes the mean value within a sliding neighborhood window | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Focal Statistics](xrspatial/focal.py) | Computes summary statistics over a sliding neighborhood window | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Bilateral](xrspatial/bilateral.py) | Feature-preserving smoothing via bilateral filtering | Tomasi & Manduchi 1998 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [GLCM Texture](xrspatial/glcm.py) | Computes Haralick GLCM texture features over a sliding window | Haralick et al. 1973 | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [Sobel X](xrspatial/edge_detection.py) | Horizontal gradient via Sobel operator (detects vertical edges) | Sobel & Feldman 1968 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Sobel Y](xrspatial/edge_detection.py) | Vertical gradient via Sobel operator (detects horizontal edges) | Sobel & Feldman 1968 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Laplacian](xrspatial/edge_detection.py) | Omnidirectional second-derivative edge detector | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Prewitt X](xrspatial/edge_detection.py) | Horizontal gradient via Prewitt operator (detects vertical edges) | Prewitt 1970 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Prewitt Y](xrspatial/edge_detection.py) | Vertical gradient via Prewitt operator (detects horizontal edges) | Prewitt 1970 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | +| [Apply](xrspatial/focal.py) | Applies a custom function over a sliding neighborhood window | Standard | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Hotspots](xrspatial/focal.py) | Identifies statistically significant spatial clusters using Getis-Ord Gi* | Getis & Ord 1992 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Emerging Hotspots](xrspatial/emerging_hotspots.py) | Classifies time-series hot/cold spot trends using Gi* and Mann-Kendall | Getis & Ord 1992, Mann 1945 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Mean](xrspatial/focal.py) | Computes the mean value within a sliding neighborhood window | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Focal Statistics](xrspatial/focal.py) | Computes summary statistics over a sliding neighborhood window | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Bilateral](xrspatial/bilateral.py) | Feature-preserving smoothing via bilateral filtering | Tomasi & Manduchi 1998 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [GLCM Texture](xrspatial/glcm.py) | Computes Haralick GLCM texture features over a sliding window | Haralick et al. 1973 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Sobel X](xrspatial/edge_detection.py) | Horizontal gradient via Sobel operator (detects vertical edges) | Sobel & Feldman 1968 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Sobel Y](xrspatial/edge_detection.py) | Vertical gradient via Sobel operator (detects horizontal edges) | Sobel & Feldman 1968 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Laplacian](xrspatial/edge_detection.py) | Omnidirectional second-derivative edge detector | Standard | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Prewitt X](xrspatial/edge_detection.py) | Horizontal gradient via Prewitt operator (detects vertical edges) | Prewitt 1970 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Prewitt Y](xrspatial/edge_detection.py) | Vertical gradient via Prewitt operator (detects horizontal edges) | Prewitt 1970 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ------- @@ -400,15 +403,15 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Allocation](xrspatial/proximity.py) | Assigns each cell to the identity of the nearest source feature | Standard (Dijkstra) | โœ…๏ธ | โœ… | โœ…๏ธ | โœ…๏ธ | -| [Balanced Allocation](xrspatial/balanced_allocation.py) | Partitions a cost surface into territories of roughly equal cost-weighted area | Custom | โœ…๏ธ | โœ… | โœ…๏ธ | โœ…๏ธ | -| [Cost Distance](xrspatial/cost_distance.py) | Computes minimum accumulated cost to the nearest source through a friction surface | Standard (Dijkstra) | โœ…๏ธ | โœ… | โœ…๏ธ | โœ…๏ธ | -| [Least-Cost Corridor](xrspatial/corridor.py) | Identifies zones of low cumulative cost between two source locations | Standard (Dijkstra) | โœ…๏ธ | โœ… | โœ…๏ธ | โœ…๏ธ | -| [Direction](xrspatial/proximity.py) | Computes the direction from each cell to the nearest source feature | Standard | โœ…๏ธ | โœ… | โœ…๏ธ | โœ…๏ธ | -| [Proximity](xrspatial/proximity.py) | Computes the distance from each cell to the nearest source feature | Standard | โœ…๏ธ | โœ… | โœ…๏ธ | โœ…๏ธ | -| [Surface Distance](xrspatial/surface_distance.py) | Computes distance along the 3D terrain surface to the nearest source | Standard (Dijkstra) | โœ…๏ธ | โœ… | โœ…๏ธ | โœ…๏ธ | -| [Surface Allocation](xrspatial/surface_distance.py) | Assigns each cell to the nearest source by terrain surface distance | Standard (Dijkstra) | โœ…๏ธ | โœ… | โœ…๏ธ | โœ…๏ธ | -| [Surface Direction](xrspatial/surface_distance.py) | Computes compass direction to the nearest source by terrain surface distance | Standard (Dijkstra) | โœ…๏ธ | โœ… | โœ…๏ธ | โœ…๏ธ | +| [Allocation](xrspatial/proximity.py) | Assigns each cell to the identity of the nearest source feature | Standard (Dijkstra) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Balanced Allocation](xrspatial/balanced_allocation.py) | Partitions a cost surface into territories of roughly equal cost-weighted area | Custom | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Cost Distance](xrspatial/cost_distance.py) | Computes minimum accumulated cost to the nearest source through a friction surface | Standard (Dijkstra) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Least-Cost Corridor](xrspatial/corridor.py) | Identifies zones of low cumulative cost between two source locations | Standard (Dijkstra) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Direction](xrspatial/proximity.py) | Computes the direction from each cell to the nearest source feature | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Proximity](xrspatial/proximity.py) | Computes the distance from each cell to the nearest source feature | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Surface Distance](xrspatial/surface_distance.py) | Computes distance along the 3D terrain surface to the nearest source | Standard (Dijkstra) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Surface Allocation](xrspatial/surface_distance.py) | Assigns each cell to the nearest source by terrain surface distance | Standard (Dijkstra) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Surface Direction](xrspatial/surface_distance.py) | Computes compass direction to the nearest source by terrain surface distance | Standard (Dijkstra) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | -------- @@ -416,13 +419,13 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Apply](xrspatial/zonal.py) | Applies a custom function to each zone in a classified raster | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Clip Polygon](xrspatial/polygon_clip.py) | Clips a raster to an arbitrary polygon with masking | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Crop](xrspatial/zonal.py) | Extracts the bounding rectangle of a specific zone | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Regions](xrspatial/zonal.py) | Identifies connected regions of non-zero cells | Standard (CCL) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Trim](xrspatial/zonal.py) | Removes nodata border rows and columns from a raster | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Zonal Statistics](xrspatial/zonal.py) | Computes summary statistics for a value raster within each zone | Standard | โœ…๏ธ | โœ…๏ธ| โœ…๏ธ | ๐Ÿ”„ | -| [Zonal Cross Tabulate](xrspatial/zonal.py) | Cross-tabulates agreement between two categorical rasters | Standard | โœ…๏ธ | โœ…๏ธ| ๐Ÿ”„ | ๐Ÿ”„ | +| [Apply](xrspatial/zonal.py) | Applies a custom function to each zone in a classified raster | Standard | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Clip Polygon](xrspatial/polygon_clip.py) | Clips a raster to an arbitrary polygon with masking | Standard | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Crop](xrspatial/zonal.py) | Extracts the bounding rectangle of a specific zone | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Regions](xrspatial/zonal.py) | Identifies connected regions of non-zero cells | Standard (CCL) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Trim](xrspatial/zonal.py) | Removes nodata border rows and columns from a raster | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Zonal Statistics](xrspatial/zonal.py) | Computes summary statistics for a value raster within each zone | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Zonal Cross Tabulate](xrspatial/zonal.py) | Cross-tabulates agreement between two categorical rasters | Standard | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ----------- @@ -430,9 +433,9 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [IDW](xrspatial/interpolate/_idw.py) | Inverse Distance Weighting from scattered points to a raster grid | Standard (IDW) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Kriging](xrspatial/interpolate/_kriging.py) | Ordinary Kriging with automatic variogram fitting (spherical, exponential, gaussian) | Standard (ordinary kriging) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Spline](xrspatial/interpolate/_spline.py) | Thin Plate Spline interpolation with optional smoothing | Standard (TPS) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | +| [IDW](xrspatial/interpolate/_idw.py) | Inverse Distance Weighting from scattered points to a raster grid | Standard (IDW) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Kriging](xrspatial/interpolate/_kriging.py) | Ordinary Kriging with automatic variogram fitting (spherical, exponential, gaussian) | Standard (ordinary kriging) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Spline](xrspatial/interpolate/_spline.py) | Thin Plate Spline interpolation with optional smoothing | Standard (TPS) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ----------- @@ -440,14 +443,14 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Erode](xrspatial/morphology.py) | Morphological erosion (local minimum over structuring element) | Standard (morphology) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Dilate](xrspatial/morphology.py) | Morphological dilation (local maximum over structuring element) | Standard (morphology) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Opening](xrspatial/morphology.py) | Erosion then dilation (removes small bright features) | Standard (morphology) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Closing](xrspatial/morphology.py) | Dilation then erosion (fills small dark gaps) | Standard (morphology) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Gradient](xrspatial/morphology.py) | Dilation minus erosion (edge detection) | Standard (morphology) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [White Top-hat](xrspatial/morphology.py) | Original minus opening (isolate bright features) | Standard (morphology) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Black Top-hat](xrspatial/morphology.py) | Closing minus original (isolate dark features) | Standard (morphology) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Sieve](xrspatial/sieve.py) | Remove small connected clumps from classified rasters | GDAL sieve | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | +| [Erode](xrspatial/morphology.py) | Morphological erosion (local minimum over structuring element) | Standard (morphology) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Dilate](xrspatial/morphology.py) | Morphological dilation (local maximum over structuring element) | Standard (morphology) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Opening](xrspatial/morphology.py) | Erosion then dilation (removes small bright features) | Standard (morphology) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Closing](xrspatial/morphology.py) | Dilation then erosion (fills small dark gaps) | Standard (morphology) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Gradient](xrspatial/morphology.py) | Dilation minus erosion (edge detection) | Standard (morphology) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [White Top-hat](xrspatial/morphology.py) | Original minus opening (isolate bright features) | Standard (morphology) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Black Top-hat](xrspatial/morphology.py) | Closing minus original (isolate dark features) | Standard (morphology) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Sieve](xrspatial/sieve.py) | Remove small connected clumps from classified rasters | GDAL sieve | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ------- @@ -455,13 +458,13 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [dNBR](xrspatial/fire.py) | Differenced Normalized Burn Ratio (pre minus post NBR) | USGS | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [RdNBR](xrspatial/fire.py) | Relative dNBR normalized by pre-fire vegetation density | USGS | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Burn Severity Class](xrspatial/fire.py) | USGS 7-class burn severity from dNBR thresholds | USGS | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Fireline Intensity](xrspatial/fire.py) | Byram's fireline intensity from fuel load and spread rate (kW/m) | Byram 1959 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Flame Length](xrspatial/fire.py) | Flame length derived from fireline intensity (m) | Byram 1959 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Rate of Spread](xrspatial/fire.py) | Simplified Rothermel spread rate with Anderson 13 fuel models (m/min) | Rothermel 1972, Anderson 1982 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [KBDI](xrspatial/fire.py) | Keetch-Byram Drought Index single time-step update (0-800 mm) | Keetch & Byram 1968 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | +| [dNBR](xrspatial/fire.py) | Differenced Normalized Burn Ratio (pre minus post NBR) | USGS | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [RdNBR](xrspatial/fire.py) | Relative dNBR normalized by pre-fire vegetation density | USGS | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Burn Severity Class](xrspatial/fire.py) | USGS 7-class burn severity from dNBR thresholds | USGS | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Fireline Intensity](xrspatial/fire.py) | Byram's fireline intensity from fuel load and spread rate (kW/m) | Byram 1959 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Flame Length](xrspatial/fire.py) | Flame length derived from fireline intensity (m) | Byram 1959 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Rate of Spread](xrspatial/fire.py) | Simplified Rothermel spread rate with Anderson 13 fuel models (m/min) | Rothermel 1972, Anderson 1982 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [KBDI](xrspatial/fire.py) | Keetch-Byram Drought Index single time-step update (0-800 mm) | Keetch & Byram 1968 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ------- @@ -469,9 +472,9 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:-----|:------------|:------:|:------------------:|:-----------------:|:---------------------:|:---------------------:| -| [Polygonize](xrspatial/polygonize.py) | Converts contiguous regions of equal value into vector polygons | Standard (CCL) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | -| [Contours](xrspatial/contour.py) | Extracts elevation contour lines (isolines) from a raster surface | Standard (marching squares) | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | -| [Rasterize](xrspatial/rasterize.py) | Rasterizes vector geometries (polygons, lines, points) from a GeoDataFrame | Standard (scanline, Bresenham) | โœ…๏ธ | | โœ…๏ธ | | +| [Polygonize](xrspatial/polygonize.py) | Converts contiguous regions of equal value into vector polygons | Standard (CCL) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Contours](xrspatial/contour.py) | Extracts elevation contour lines (isolines) from a raster surface | Standard (marching squares) | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Rasterize](xrspatial/rasterize.py) | Rasterizes vector geometries (polygons, lines, points) from a GeoDataFrame | Standard (scanline, Bresenham) | ๐Ÿ”ผ | | ๐Ÿ”ผ | | -------- @@ -479,8 +482,8 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:-----|:------------|:------:|:------------------:|:-----------------:|:---------------------:|:---------------------:| -| [KDE](xrspatial/kde.py) | Point-to-raster kernel density estimation (Gaussian, Epanechnikov, quartic) | Silverman 1986 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Line Density](xrspatial/kde.py) | Line-segment-to-raster density estimation | Standard | โœ…๏ธ | | | | +| [KDE](xrspatial/kde.py) | Point-to-raster kernel density estimation (Gaussian, Epanechnikov, quartic) | Silverman 1986 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Line Density](xrspatial/kde.py) | Line-segment-to-raster density estimation | Standard | ๐Ÿ”ผ | | | | -------- @@ -488,7 +491,7 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Mahalanobis Distance](xrspatial/mahalanobis.py) | Measures statistical distance from a multi-band reference distribution, accounting for band correlations | Mahalanobis 1936 | โœ…๏ธ |โœ…๏ธ | โœ…๏ธ |โœ…๏ธ | +| [Mahalanobis Distance](xrspatial/mahalanobis.py) | Measures statistical distance from a multi-band reference distribution, accounting for band correlations | Mahalanobis 1936 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ------- @@ -496,16 +499,16 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Standardize](xrspatial/mcda/standardize.py) | Converts criterion rasters to 0-1 suitability scale (linear, sigmoidal, gaussian, triangular, piecewise, categorical) | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [AHP Weights](xrspatial/mcda/weights.py) | Derives criterion weights from pairwise comparisons using the Saaty eigenvector method with consistency ratio | Saaty 1980 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Rank Weights](xrspatial/mcda/weights.py) | Derives weights from a rank ordering (ROC, rank sum, reciprocal) | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [WLC](xrspatial/mcda/combine.py) | Weighted Linear Combination (fully compensatory weighted sum) | Malczewski 2006 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [WPM](xrspatial/mcda/combine.py) | Weighted Product Model (multiplicative, penalizes low scores) | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [OWA](xrspatial/mcda/combine.py) | Ordered Weighted Averaging with tunable risk attitude | Yager 1988 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Fuzzy Overlay](xrspatial/mcda/combine.py) | Combines criteria using fuzzy set operators (AND, OR, sum, product, gamma) | Eastman 1999 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Boolean Overlay](xrspatial/mcda/combine.py) | Combines binary criterion masks using AND/OR logic | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Constrain](xrspatial/mcda/constrain.py) | Masks exclusion zones from a suitability surface | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Sensitivity](xrspatial/mcda/sensitivity.py) | Assesses weight stability via one-at-a-time or Monte Carlo perturbation | Standard | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | +| [Standardize](xrspatial/mcda/standardize.py) | Converts criterion rasters to 0-1 suitability scale (linear, sigmoidal, gaussian, triangular, piecewise, categorical) | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [AHP Weights](xrspatial/mcda/weights.py) | Derives criterion weights from pairwise comparisons using the Saaty eigenvector method with consistency ratio | Saaty 1980 | โœ… | ๐Ÿšซ | ๐Ÿšซ | ๐Ÿšซ | +| [Rank Weights](xrspatial/mcda/weights.py) | Derives weights from a rank ordering (ROC, rank sum, reciprocal) | Standard | โœ… | ๐Ÿšซ | ๐Ÿšซ | ๐Ÿšซ | +| [WLC](xrspatial/mcda/combine.py) | Weighted Linear Combination (fully compensatory weighted sum) | Malczewski 2006 | โœ… | ๐Ÿ”ผ | ๐Ÿงช | ๐Ÿงช | +| [WPM](xrspatial/mcda/combine.py) | Weighted Product Model (multiplicative, penalizes low scores) | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿงช | ๐Ÿงช | +| [OWA](xrspatial/mcda/combine.py) | Ordered Weighted Averaging with tunable risk attitude | Yager 1988 | โœ… | ๐Ÿ”ผ | ๐Ÿงช | ๐Ÿงช | +| [Fuzzy Overlay](xrspatial/mcda/combine.py) | Combines criteria using fuzzy set operators (AND, OR, sum, product, gamma) | Eastman 1999 | โœ… | ๐Ÿ”ผ | ๐Ÿงช | ๐Ÿงช | +| [Boolean Overlay](xrspatial/mcda/combine.py) | Combines binary criterion masks using AND/OR logic | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿงช | ๐Ÿงช | +| [Constrain](xrspatial/mcda/constrain.py) | Masks exclusion zones from a suitability surface | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿงช | ๐Ÿงช | +| [Sensitivity](xrspatial/mcda/sensitivity.py) | Assesses weight stability via one-at-a-time or Monte Carlo perturbation | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿšซ | ๐Ÿšซ | ------- @@ -514,8 +517,8 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [A* Pathfinding](xrspatial/pathfinding.py) | Finds the least-cost path between two cells on a cost surface | Hart et al. 1968 | โœ…๏ธ | โœ… | ๐Ÿ”„ | ๐Ÿ”„ | -| [Multi-Stop Search](xrspatial/pathfinding.py) | Routes through N waypoints in sequence, with optional TSP reordering | Custom | โœ…๏ธ | โœ… | ๐Ÿ”„ | ๐Ÿ”„ | +| [A* Pathfinding](xrspatial/pathfinding.py) | Finds the least-cost path between two cells on a cost surface | Hart et al. 1968 | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Multi-Stop Search](xrspatial/pathfinding.py) | Routes through N waypoints in sequence, with optional TSP reordering | Custom | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ---------- @@ -523,7 +526,7 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Diffuse](xrspatial/diffusion.py) | Runs explicit forward-Euler diffusion on a 2D scalar field | Standard (heat equation) | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | +| [Diffuse](xrspatial/diffusion.py) | Runs explicit forward-Euler diffusion on a 2D scalar field | Standard (heat equation) | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ------- @@ -531,9 +534,9 @@ For a broader catalog of spectral indices and sensor-specific band combinations, | Name | Description | Source | NumPy xr.DataArray | Dask xr.DataArray | CuPy GPU xr.DataArray | Dask GPU xr.DataArray | |:----------:|:------------|:------:|:----------------------:|:--------------------:|:-------------------:|:------:| -| [Disaggregate](xrspatial/dasymetric.py) | Redistributes zonal totals to pixels using an ancillary weight surface | Mennis 2003 | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | โœ…๏ธ | -| [Pycnophylactic](xrspatial/dasymetric.py) | Tobler's pycnophylactic interpolation preserving zone totals via Laplacian smoothing | Tobler 1979 | โœ…๏ธ | | ๐Ÿ”„ | | -| [Validate Disaggregation](xrspatial/dasymetric.py) | Checks that disaggregated pixel sums match the original zone totals | Standard | โœ…๏ธ | โœ…๏ธ | ๐Ÿ”„ | ๐Ÿ”„ | +| [Disaggregate](xrspatial/dasymetric.py) | Redistributes zonal totals to pixels using an ancillary weight surface | Mennis 2003 | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | +| [Pycnophylactic](xrspatial/dasymetric.py) | Tobler's pycnophylactic interpolation preserving zone totals via Laplacian smoothing | Tobler 1979 | โœ… | ๐Ÿšซ | ๐Ÿ”ผ | ๐Ÿšซ | +| [Validate Disaggregation](xrspatial/dasymetric.py) | Checks that disaggregated pixel sums match the original zone totals | Standard | โœ… | ๐Ÿ”ผ | ๐Ÿ”ผ | ๐Ÿ”ผ | -----------