Releases: xarray-contrib/xarray-spatial
Releases · xarray-contrib/xarray-spatial
v0.9.7
New features
- Add kernel density estimation (KDE) (#1170)
- Add standalone raster resampling (#1152) (#1172)
- Add GPU COG overview support (#1150) (#1174)
- Add geometry simplification to polygonize() (#1176)
- Add polygon clipping function (#1144) (#1173)
- Add hypsometric_integral to zonal module (#1073)
Bug fixes and improvements
- Fix dask OOM in visibility and viewshed modules (#1167)
- QA/QC: align sieve with GDAL and add parity tests (#1169)
- Numba-ize visibility module loops (#1177) (#1179)
- Fix hillshade gradient to use Horn's method (#1175) (#1178)
- Fix duplicate notebook numbers and restructure to standard format (#1181)
- Fix OOM in geotiff dask read, sieve memory, and reproject GPU fallback (#1183)
- Add memory guards to reproject CuPy paths and output grid (#1186, #1187) (#1188)
- Fix NaN pixels producing spurious polygons in numpy/dask backends (#1190) (#1194)
- Fix CuPy Bellman-Ford iteration limit in cost_distance (#1192)
- Fix geotiff unbounded allocation DoS and VRT path traversal (#1189)
- Fix KDE all-zero output with descending-coordinate templates (#1199)
- Fix crop=True dropping boundary pixels when all_touched=True (#1197) (#1200)
- Add allocation guards to GPU read and VRT read paths (#1196)
- Fix resample interpolation coordinate mapping (#1202) (#1204)
- Fix float32 truncation in balanced_allocation iteration loop (#1203) (#1205)
- Fix bump OOM with int32 coords, default-count cap, per-chunk dask partitioning (#1206) (#1208)
- Pass dask chunks to rasterize in clip_polygon to keep mask lazy (#1207) (#1209)
- Cut head_tail_breaks and box_plot dask re-scans (#1213)
- Fuse hypsometric_integral dask path to a single graph evaluation (#1212)
- Cap dask graph size in read_geotiff_dask and batch adler32 transfers (#1211)
- Bound per-tile allocations in TIFF reader (#1215) (#1216)
- Fix GPU predictor kernel stride for multi-sample tiled TIFFs (#1220) (#1222)
- Reject TIFFs whose declared tile grid exceeds TileOffsets length (#1219) (#1221)
- Reject oversize rasterize outputs before allocation (#1223) (#1224)
- Fix cupy zonal_stats silently ignoring nodata_values=0 (#1227) (#1228)
- Guard viewshed numpy path against oversize rasters (#1229) (#1230)
- Reject integer-dtyped input in perlin() (#1232) (#1233)
- Reject oversize bump output rasters before allocation (#1231) (#1234)
- Clamp bilateral kernel radius to raster extent (#1236) (#1238)
- Fix CPU fp_predictor_decode for multi-band predictor=3 TIFFs (#1247) (#1250)
- Guard natural_breaks against oversize Jenks matrices (#1246) (#1248)
- Handle degenerate input in equal_interval (#1244) (#1245)
- Reject oversize convolution kernels before allocation (#1241) (#1243)
- Guard contour segment buffers against oversize allocation (#1240) (#1242)
v0.9.6
New features
- Multi-observer viewshed and line-of-sight profiles (#1145) (#1160)
- Sieve filter for removing small raster clumps (#1159)
Bug fixes and improvements
- Faster sieve labeling, with convergence warning (#1163)
- Dask laziness docs and regression tests (#1164) (#1165)
- Fix README feature matrix to match codebase (#1155) (#1158)
- Fix 196 test-suite warnings (#1148) (#1157)
- ASV benchmarks for 6 modules changed in v0.9.5 (#1156)
- Caveat and assumption admonitions in docs (#1134)
- Miscellaneous code sweeps (#1161)
v0.9.5
Bug fixes and improvements
- Add GPU memory guard to reproject dask+cupy path (#1131)
- Add memory guard to surface_distance geodesic dd_grid (#1129)
- Add memory guard to dasymetric validate_disaggregation (#1127)
- Replace boolean indexing with lazy reductions in normalize dask paths (#1125)
- Keep northness/eastness lazy on dask arrays (#1123)
- Add memory guard to erosion dask paths (#1121)
- Add memory guard to cost_distance iterative Dijkstra and da.block assembly (#1119)
- Fix diffusion dask OOM by passing scalar diffusivity directly to chunks (#1117)
- Fix balanced_allocation OOM with lazy source extraction and memory guard (#1115)
- Fix zonal dask memory guards and stats filtering (#1112)
v0.9.4
New features
- Streaming TIFF write for dask inputs (#1084) (#1108)
- Add dtype, compression_level, and VRT output to geotiff I/O (#1083) (#1085)
Bug fixes and improvements
- Use float64 in Jenks natural breaks internals (#1100) (#1101)
- Fix multi-metric output mislabeling in glcm_texture (#1106) (#1107)
- Fix inverted decay and off-by-one in bump spread (#1102) (#1103)
- Propagate NaN from curve_number in curve_number_runoff (#1104) (#1105)
- Fix target_elev contaminating horizon in dask viewshed distance sweep (#1098) (#1099)
- Preserve float64 precision in convolve_2d (#1096) (#1097)
- Fix SAVI formula: (1+L) was in denominator instead of numerator (#1094) (#1095)
- Fix NaN handling in focal_stats CUDA kernels (#1092) (#1093)
- Fix three accuracy bugs in zonal stats dask backend (#1090) (#1091)
- Add longitude normalization to CUDA inverse projection kernels (#1089)
- Fix three accuracy bugs in reproject resampling kernels (#1087)
- Fix three accuracy bugs in open_geotiff/to_geotiff (#1081) (#1082)
v0.9.3
New features
- GeoTIFF/COG reader and writer with GPU acceleration and datum transforms (#1035) (#1062)
- nvJPEG GPU acceleration for JPEG-compressed GeoTIFFs (#1050) (#1055)
- LZ4 and LERC compression codecs for GeoTIFF (#1063)
- Dask-native out-of-core reproject and merge module (#1031)
- MCDA module for spatial multi-criteria decision analysis (#1030) (#1058)
- Edge detection filters: Sobel, Laplacian, Prewitt (#1042)
- Focal variety statistic (#1040) (#1043)
- NDSI, NDBI, BAI, MSAVI2, and OSAVI spectral indices (#1044)
- Northness and eastness aspect functions (#1039) (#1041)
- Rescale and standardize normalization utilities (#1028)
- Morphological gradient, white top-hat, and black top-hat operators (#1026)
- D-inf and MFD variants of flow_path, watershed, and HAND (#1020)
- D-infinity flow length computation (#1012) (#1013)
- MFD flow length computation (#1011)
- Vegetation-aware flood modeling: roughness, curve number, and depth from land cover (#1029)
- Lightweight CRS parser, removes hard pyproj dependency (#1072)
- plot() accessors for DataArray and Dataset (#1074)
- fused_overlap and multi_overlap dask graph utilities (#1071)
- rechunk_no_shuffle utility (#1068)
Bug fixes and improvements
- Fix D-inf flow direction odd facet decomposition per Tarboton 1997 (#1005)
- Fix CuPy uint8 overflow and CUDA cubic NaN fallback (#1054) (#1064)
- Fix stale full pipeline benchmark numbers in README (#1077) (#1079)
- Fix duplicate prefix numbers in user guide notebooks (#1076) (#1078)
- Memory-safe rechunk, preview chunk budget, plot improvements (#1075)
- Reduce dask graph size for large raster reprojection (#1065)
- Speed up cost_distance iterative tile Dijkstra 2-4x (#1023)
- Faster polygonize: single-pass tracing, JIT merge helpers, batch shapely (#1010)
- Rename GeoTIFF API to xarray conventions (#1047) (#1061)
- Section index in README feature matrix (#1033) (#1034)
- Dask example for reproject (#1066)
- Porto taxi trajectory rasterization example (#1022)
- Polygonize benchmark comparing xrspatial vs rasterio (#1006) (#1007)
v0.9.2
New features
- Vector rasterize function for polygons, lines, and points (#989) (#990)
- preview() for memory-safe raster downsampling (#987)
- D-inf and MFD stream ordering and link segmentation (#983) (#984)
- Zonal functions accept vector zones directly (#999)
- Dask backends for rasterize() (#997)
Bug fixes and improvements
- Fix rasterize accuracy: GPU ceil, half-open fill, all_touched pairing (#995) (#996)
- Fix scanline row gaps, speed up rasterize, add resolution/like/merge params (#991)
- Rasterization fixes (#992)
- Fix cupy failures in balanced_allocation and corridor (#985)
- Refactor preview to avoid rechunking (#988)
- Replace datashader with matplotlib in user guide notebooks (#1002)
- Refactor user guide notebooks 10-31 to standard structure (#1003)
- Water/land classification example in GLCM notebook (#994)
- Source/reference column in README feature matrix (#977) (#978)
- Small notebook fixes
v0.9.1
v0.9.0
Version 0.9.0 - 2026-03-04
New Features
- Add least-cost corridor analysis (#965) (#968)
- Add native Dask+CuPy backends for hydrology core functions (#952) (#966)
- Add native CUDA kernel for hydraulic erosion (#961) (#967)
- Add CuPy and Dask+CuPy backends for kriging (#951) (#960)
- Add NDWI and MNDWI water indices (#959)
- Add morphological raster operators (#949) (#958)
- Add TPI-based landform classification (#950) (#957)
- Add MFD flow direction and accumulation (#946) (#956)
- Add balanced service area partitioning (#939) (#943)
- Add Dinf support to flow_accumulation() (#945)
- Add scalar diffusion solver (#940) (#944)
- Add multi_stop_search for multi-waypoint routing (#935) (#937)
- Add raster-based dasymetric mapping module (#930) (#936)
- Add interpolation tools: IDW, Kriging, and Spline (#932) (#934)
Bug Fixes & Improvements
Version 0.8.0
v0.7.0
New hydrology, terrain metrics, and surface distance modules; 3D multi-band support for focal functions; GPU-accelerated polygonize with connected-component labelling; and broad dask+cupy backend coverage across the library.
New Features
- Add 3D multi-band support to focal functions (#924)
- Add foundational hydrology tools (#921)
- Add terrain metrics module: TRI, TPI, and Roughness (#920)
- Add surface_distance module: 3D terrain distance via multi-source Dijkstra (#918)
- Add CI benchmark workflow with regression detection (#917)
- Polygonize: GPU CCL, promotion, dispatcher, GeoJSON output, and benchmarks (#916)
- Add GPU (CuPy) backends for proximity, allocation, direction (#909)
- Add GPU (CuPy) backend for cost_distance (#910)
- Add out-of-core dask CPU viewshed (#897)
- Add dask+cupy backends for focal tools (#896)
- Add emerging_hotspots() for time-series trend analysis (#890)
- Replace O(n^4) regions() with scipy union-find, add dask/cupy backends (#898)
Bug Fixes & Improvements
- Make dask backends truly lazy, add agg parameter (#914)
- Fill remaining dask+cupy gaps (terrain, perlin, crosstab) (#913)
- Add comprehensive input validation across public API (#912)
- Fix dask zonal.stats() bug, add dask+cupy backend, edge-case tests (#911)
- Prevent OOM and unknown chunks in classify.py dask paths (#895)
- Replace np.unique/np.isfinite with dask-safe helpers in zonal.py (#894)
- Extend KDTree path to allocation/direction to prevent OOM (#893)
- Add memory guard and tiled KDTree fallback to proximity (#892)
- Add memory guard, bounded A*, and HPA* to prevent OOM (#891)