- Refresh the geotiff mmap cache when a file is replaced under the same path so re-reads after an atomic-rename overwrite no longer return stale bytes
- Decode TIFF predictor=3 un-transpose by file byte order so big-endian floating-point TIFFs read back exactly
- Add geotiff edge-case tests and integer-coord fallback (#1482) (#1492)
- Use synchronous dask scheduler for different-CRS merge parity test (#1495)
- Fetch COG tiles concurrently in HTTP path to mask RTT (#1487)
- Geotiff polish: validation, caching caps, parallelism thresholds, memory guards (#1488) (#1493)
- Round-trip transform, crs, and tag metadata through to_geotiff/open_geotiff (#1484) (#1494)
- Tighten geotiff reader: partial-tile shape check, ModelTransformation rotation guard (#1486) (#1491)
- Add geotiff writer test matrix (#1483) (#1490)
- Stream tile writes per dask chunk segment to bound peak memory in to_geotiff (#1485) (#1489)
- Add regression test for GPU pred=3 multi-sample TIFFs (#1479) (#1481)
- Make cubic resample prefilter explicit so chunk seams stay sub-eps (#1464) (#1478)
- Preserve input float dtype through resample() (#1467) (#1476)
- Resample polish: fix cubic depth comment, tighten NaN threshold, add edge tests (#1475)
- Fix dask aggregate boundary contamination and clean up bookkeeping (#1469) (#1477)
- Support 3D rasters, expose nodata, document target_resolution tuple in resample (#1466) (#1474)
- Cover cupy median/mode, dask+cupy, integer input, target_resolution tuple in resample tests (#1470) (#1473)
- Refresh transform and nodata attrs on resample output (#1465) (#1472)
- Inline dask aggregate kernel in resample (#1463) (#1468)
- Emit fresh grid metadata and propagate _FillValue in reproject (#1458) (#1462)
- Polish reproject/merge docstrings and cover Inf and parameter edge cases (#1459) (#1461)
- Batch CuPy reductions and drop redundant copies in reproject (#1460)
- Add transform_precision parameter to merge() (#1452) (#1456)
- Preserve non-spatial coords through reproject() and merge() (#1455)
- Guard _apply_vertical_shift against non-finite coords; add vertical CRS tests (#1453)
- Honor per-raster nodata sentinels in merge() (#1448) (#1449)
- Preserve input attrs through reproject() and merge() (#1446)
- Fix dask reproject dtype and same-CRS dask merge (#1450)
- Validate raster inputs in reproject public APIs (#1431) (#1432)
- Add memory guard and scalar validation to generate_terrain (#1443) (#1444)
- Validate scalar parameters in hydro public APIs (#1427) (#1428)
- Validate mannings_n DataArray values in flood (#1437) (#1438)
- Add _validate_raster on secondary DataArray args in hydro (#1425) (#1426)
- Validate grid/bounds/precision params in reproject (#1433) (#1434)
- Validate cellsize in hydro public APIs (#1429) (#1430)
- Validate pathfinding inputs and cap waypoints (#1439) (#1440)
- Validate raster/mask inputs in polygonize (#1441) (#1442)
- Add memory guard to flow_direction_mfd numpy/cupy backends (#1423) (#1424)
- Reject NaN/Inf in reproject scalar inputs (#1435) (#1436)
- Lazy assembly for hand_mfd dask path (#1416) (#1417)
- Return NaN from glcm_texture angle=None when no angle has valid pairs (#1408) (#1409)
- Use ground distance for sky_view_factor horizon angle (#1407) (#1410)
- Exclude centre cell from morph_erode/dilate when kernel[centre]==0 (#1397) (#1398)
- Use sized slice in dask morph chunk writeback (#1399) (#1400)
- Merge sink_d8 labels across dask tile boundaries (#1394) (#1395)
- Reject complex dtypes in _validate_raster() (#1384) (#1387)
- Reject underflowing sigma_spatial in bilateral() (#1390) (#1392)
- Use int64 row_ptr in _build_row_csr_numba (#1388) (#1391)
- Reject mixed-backend arrays in validate_arrays() (#1383) (#1386)
- Reject non-positive inputs in wpm() (#1382) (#1385)
- Guard _idw knearest against unbounded grid x k allocation (#1377) (#1380)
- Validate raster dtype in convolve_2d() (#1389) (#1393)
- Reject all-zero rasters in mesh_utils.create_triangulation (#1378) (#1381)
- Validate dtypes per band in mahalanobis() (#1376) (#1379)
- Guard owa() against unbounded criteria stack (#1370) (#1375)
- Guard spline() TPS against unbounded memory allocations (#1372) (#1374)
- Reject n_samples<=0 in mcda sensitivity (#1371) (#1373)
- Guard flow_path_d8() against unbounded memory allocations (#1364) (#1368)
- Guard flow_path_mfd() against unbounded memory allocations (#1365) (#1369)
- Guard flow_path_dinf() against unbounded memory allocations (#1363) (#1367)
- Guard snap_pour_point_d8() against unbounded memory allocations (#1362) (#1366)
- Guard sink_d8() against unbounded memory allocations (#1356) (#1361)
- Guard stream_order_dinf() against unbounded memory allocations (#1350) (#1354)
- Guard basin_d8() against unbounded memory allocations (#1357) (#1359)
- Guard flow_length_dinf() against unbounded memory allocations (#1355) (#1358)
- Guard flow_length_mfd() against unbounded memory allocations (#1351) (#1353)
- Guard stream_order_mfd() against unbounded memory allocations (#1349) (#1352)
- Guard watershed_dinf() against unbounded memory allocations (#1345) (#1348)
- Guard stream_link_dinf() against unbounded memory allocations (#1343) (#1347)
- Guard hand_dinf() against unbounded memory allocations (#1344) (#1346)
- Guard stream_link_mfd() against unbounded memory allocations (#1337) (#1341)
- Guard flow_length_d8() against unbounded memory allocations (#1327) (#1332)
- Guard hand_d8() against unbounded memory allocations (#1323) (#1326)
- Guard hand_mfd() against unbounded memory allocations (#1338) (#1340)
- Guard watershed_mfd() against unbounded memory allocations (#1339) (#1342)
- Guard watershed_d8() against unbounded memory allocations (#1329) (#1330)
- Guard fill_d8() against unbounded eager allocations (#1334) (#1336)
- Guard stream_link_d8() against unbounded memory allocations (#1333) (#1335)
- Guard stream_order_d8() against unbounded memory allocations (#1328) (#1331)
- Guard flow_accumulation_dinf() against unbounded memory allocations (#1322) (#1325)
- Guard flow_accumulation_mfd() against unbounded memory allocations (#1321) (#1324)
- Guard gpu_rtx hillshade and viewshed against unbounded GPU allocations (#1308) (#1310)
- Guard min_observable_height() against unbounded boolean stack (#1317) (#1320)
- Guard flow_accumulation() against unbounded eager allocations (#1318) (#1319)
- Reject NaN/Inf weights in mcda combine and ahp_weights (#1311) (#1312)
- Support TIFF predictor=3 on the CPU write path (#1313) (#1314)
- Guard kriging() against unbounded N x N and grid x N allocations (#1307) (#1309)
- Guard surface_distance() against unbounded eager allocations (#1303) (#1305)
- Guard landforms() against unbounded kernel allocations (#1302) (#1304)
- Enforce equal band shapes in true_color() (#1293) (#1301)
- Guard sky_view_factor() against unbounded eager allocations (#1299) (#1300)
- Guard resample() against unbounded output allocations (#1295) (#1297)
- Guard sieve() numpy and cupy backends against oversized rasters (#1296) (#1298)
- Guard kde and line_density against oversize output grids (#1287) (#1289)
- Reject oversize focal kernels before allocation (#1284) (#1286)
- Guard mahalanobis allocations against oversized rasters (#1288) (#1290)
- Guard true_color() eager backends against oversized rasters (#1291) (#1292)
- Add memory guard to geodesic slope/aspect (#1283) (#1285)
- Validate dt against CFL stability bound in diffuse() (#1281) (#1282)
- Cap erode() parameters and run memory guard on every backend (#1275) (#1277)
- Validate cellsize in curvature() (#1270) (#1272)
- Add memory guard to emerging_hotspots public API (#1274) (#1276)
- Validate input rasters in edge_detection public API (#1271) (#1273)
- Guard diffuse() against unbounded allocations and steps loop (#1267) (#1268)
- Add memory guards to dasymetric public API (#1261) (#1263)
- Guard cost_distance CuPy backend against oversize rasters (#1262) (#1264)
- Guard morphology kernel allocations against oversized kernels (#1256) (#1258)
- Cap window_size and distance in glcm_texture (#1257) (#1259)
- Guard cost_distance numpy path against oversize rasters (#1252) (#1253)
- 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)
- 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)
- Multi-observer viewshed and line-of-sight profiles (#1145) (#1160)
- Sieve filter for removing small raster clumps (#1159)
- 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)
- 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)
- Streaming TIFF write for dask inputs (#1084) (#1108)
- Add dtype, compression_level, and VRT output to geotiff I/O (#1083) (#1085)
- 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)
- 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)
- 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)
- 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)
- 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
- Add contour line extraction via marching squares (#964) (#974)
- Add GLCM texture metrics (#963) (#973)
- Add sky-view factor function (#962) (#972)
- Add bilateral filter for feature-preserving smoothing (#969) (#970)
- 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)
- Remove esri.py and datashader from core dependencies (#953)
- Add HAND and TWI to README feature matrix (#954) (#955)
- Add missing API reference docs for ~30 undocumented functions (#941) (#942)
- Remove unnecessary array copies to reduce memory allocations (#933)
- Add raster-based dasymetric mapping: disaggregate, pycnophylactic interpolation, and validation helper (#930)
- Add enhanced terrain generation features (#929)
- Add fire module: dNBR, RdNBR, burn severity, fireline intensity, flame length, rate of spread (Rothermel), and KBDI (#927)
- Add flood prediction tools (#926)
Highlights: 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.
- Add fire module: dNBR, RdNBR, burn severity class, fireline intensity, flame length, rate of spread (Rothermel), and KBDI (#922)
- 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)
- 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)
Highlights: xarray accessor (.xrs) is now available, providing a convenient
interface for all spatial operations directly on DataArrays and Datasets.
- Fixes #880: replace single-chunk rechunk in cost_distance with iterative tile Dijkstra (#888)
- Fix test warnings: suppress expected GPU/NaN warnings, fix scalar conversion and host-array copies (#887)
- Fixes #804: add min_observable_height() to experimental (#875) (#886)
- Fixes #845: add configurable boundary mode to kernel-based spatial ops (#874)
- Fixes #587: unify project requirements around setup.cfg (#873)
- Document CPU vs GPU algorithm difference in viewshed docstring (#872)
- Fixes #114: add Mahalanobis distance metric (#871)
- Fix perlin/terrain dask backends: enable parallelism and out-of-core support (#870)
- Fixes #790: add .xrs xarray accessors (#868)
- Fixes #748: align hillshade with GDAL and add dask+cupy backend (#867)
- Added cupy support to true_color function (#866)
- Fixes #864: remove local analysis module, add migration guide (#865)
- Add GPU spill-to-CPU fallback for cost_distance (#863)
- Fixes #560: weighted A* pathfinding with friction surface (#862)
- Fixes #733: add cost_distance() for weighted proximity (#859)
- Fixes #734: make noise a lazy import so datasets module is usable without it (#858)
- Fixes #774: suppress dd.concat unknown divisions warning in zonal_stats (#857)
- Fixes #392: document and test 3D time-series zonal stats via Dataset (#856)
- Fix hotspots dask performance: 2-pass streaming with O(chunk_size) memory (#855)
- Fixes #134: add xr.Dataset as input type for appropriate modules (#854)
- Warnings(17) filtering for non-GPU (#850)
- Fixes #190: GPU-enable all classification operations (#852)
- updating links and text (#849)
- fixes 766 document handling of f32 vs. f64 data when using xarray spatial (#847)
- Fix rioxarray band_as_variable DataArray extraction (#846)
- added majority as default stat for zonal operations with numpy and cupy (#844)
- fixed proximity intermediate large numpy array problem and proximity output coords are now lazy if input is dask array (#843)
- Changed regions parameter connections to neighborhood and updated docstring (#842)
- Testing and Updating Examples (#837)
- added horizontal vertical unit mismatch heuristic to help address issue #840 (#841)
- Fixes #838 update legacy repo url links (#839)
- added colorado dem to examples datasets yaml
- Make dask optional (#835)
- Fixes 832 update citation info in readme (#834)
- Removed references to xarray-spatial.org (#827)
- updated runner, python setup action and checkout actions for PyPI publish
- Python 3.14 is now supported!
- Fixed bug in curvature dask+cupy args and added unit test for curvature(#824)
- Added dask cupy test for slope func (#824)
- Added dask cupy test for aspect func (#824)
- Added in dask-cupy convolve_2d test (#823)
- Now ensures the hash value fits into an unsigned 64-bit integer for NumPy 2.0.0 (#805)
- Added dask and pyarrow to setup.cfg test area (#822)
- Allow Negative Target Height in Viewshed Analysis (viewshed.py) (#812)
- Small Fixes while testing Cuda 13 (#818)
- Support for certain Dask+Cupy (#815)
- Update docstring for viewshed (#807)
- Python 3.12 is now supported!
- Python 3.9 & 3.8 are no longer supported.
- Documentation has also been moved to https://xarray-spatial.readthedocs.io/
Pull Requests merged in this release include:
- Add links to docs to readme (#800)
- Update readthedocs configuration (#798)
- Fix typo in readthedocs config (#799)
- Move docs to readthedocs (#797)
- Bunch of CI/CD-related fixes (#796)
- chore: Remove numpy pin, pin datashader, drop Python 3.7 (#789)
The 0.3.7 release is a hot fix for 0.3.6, which has problem with publishing to PyPi as the package exceeds the limit of 100MB. In this new release, example notebooks are cleaned up to reduce the package size.
- clear example notebook outputs (#786)
With the 0.3.6 release, xarray-spatial now supports python 3.11. This release focuses on demonstrating the reliability of the library by adding more tests against GDAL/QGIS.
- Test on Python 3.11 (#750)
- Pin numpy version (#780)
- zonal stats (#764)
- updated citation (#769)
- classify.binary: handle NaNs and infinite values (#763)
- Test against QGIS, GDAL (#744)
- Zonal crosstab user guide notebook enhancement (#759)
- cpu_bin with binary search (#760)
- outline for housing price feature engineering nb (#725)
- More examples to user guide (#742)
- Use setuptools (#749)
- Update contributor badge (#740)
- update pharmacy desserts notebook (#723)
- Update README.md (#719)
- viewshed gpu notebook (#720)
- Fixed feature-proposal.md config (#718)
- correct docs for proximity (#778)
- Zonal_crosstab 3D: Ensure content of input param
valuesis preserved (#754) - Multispectral tools: convert data to float32 dtype before doing calculations (#755)
The 0.3.5 release mainly addresses the scaling issue in GPU viewshed to gain better accurate triangulation. The GPU raytraced viewshed should now give comparable results to the CPU version. However, the 2 versions use 2 different approaches, there can be slightly differences at some points where a version returns visible while the other considers them as invisible.
- command to get change log (#716)
- Added Feature Proposal Template (#714)
- Improved viewshed rtx. Now result should match the CPU version (#715)
The 0.3.4 release primarily a bug fix release but also includes a number of enhancements with a focus on GPU supports.
- NumPy zonal stats: return a data array of calculated stats (#685)
- set unit for hotspots output (#686)
- More robust cuda and cupy identification (#657)
- Remove deprecated tiles module (#698)
- Test on python 3.10, remove 3.6 (#694)
- moved all tests to github actions (#689)
- Add isort to pytest (#700)
- Add flake8 to pytest (#697)
- Remove unnecessary executable flags (#696)
- updated test hotspots gpu (#692)
- 3D numpy zonal_crosstab to support more agg methods (#687)
- Fix rtx viewshed rendering blank image (#711)
- Convolve_2d gpu fixes (#702)
- focal.mean(): only do data type conversion once (#699)
- Update to remote sensing notebook (#688)
- focal_stats(): gpu case (#709)
- focal apply: drop gpu support (#706)
- drop gpu support (#705)
- enabled numba.cuda.jit in hotspots cupy (#691)
- Correct examples in docstrings (#703)
- Fix doc build dependencies in CI (#683)
- Fix link to Austin road network notebook (#695)
- fixed ubuntu version (#681)
- Don't calculate angle when not needed (#677)
- codecov: ignore all tests at once (#674)
- add more tests to focal module (#676)
- classify: more tests (#675)
- Codecov: disable Numba; ignore tests, experimental, and gpu_rtx (#673)
- Improve linter: add isort (#672)
- removed stale test files from project root (#670)
- User guide fixes (#665)
- license year in README to include 2022 (#668)
- install dependencies specified in test config (#666)
- Pytests for CuPy zonal stats (#658)
- add Codecov badge to README
- codecov with github action (#663)
- Modernise build system (#654)
- classify tools: classify infinite values as nans, natural_breaks: classify all data points when using sub sample (#653)
- Add more benchmarks (#648)
- Stubbed out function for Analytics module (#621)
- Fix doc build failure due to Jinja2 version (#651)
- Remove numpy version pin (#637)
- aspect: added benchmarks (#640)
- Clean gitignore and manifest files (#642)
- Benchmark results (#643)
- handle CLI errors #442 (#644)
- Cupy zonal (#639)
- Tests improvements (#636)
- Add benchmarking framework using asv (#595)
- Fix classify bug with dask array (#599)
- polygonize function on cpu for numpy-backed xarray DataArrays (#585)
- Test python 3.9 on CI (#602)
- crosstab: speedup dask case (#596)
- Add benchmark for CPU polygonize (#605)
- Change copyright year to include 2021 (#610)
- Docs enhancement (#604, #628)
- code refactor: use array function mapper, add messages param to not_implemented_func() (#612)
- condense tests (#613)
- Multispectral fixes (#617)
- Change copyright year to 2022 (#622)
- Aspect: convert to float if int dtype input raster (#619)
- direction(), allocation(): set all NaNs at initalization (#618)
- Add rtx gpu hillshade with shadows (#608)
- Add hillshade benchmarking, for numpy, cupy and rtxpy (#625)
- Focal mean: handle nans inside kernel (#623)
- Convert to float32 if input raster is in int dtype (#629)
- Added a pure numba hillshade that is 10x faster compared to numpy (#542)
- dask case proximity: process whole raster at once if max_distance exceed max possible distance (#558)
- pathfinding:
startandgoalin (y, x) format (#550) - generate_terrain: cupy case, dask numpy case (#555)
- Optimize natural_break on large inputs (#562)
- Fixes in CPU version of natural_breaks. (#562) (#563)
- zonal stats, speed up numpy case (#568)
- Ensure that cupy is not None (#570)
- Use explicit cupy to numpy conversion in tests (#573)
- zonal stats: speed up dask case (#572)
- zonal_stats: ensure chunksizes of zones and values are matching (#574)
- validate_arrays: ensure chunksizes of arrays are matching (#577)
- set default value for num_sample (#580)
- Add rtx gpu viewshed and improve cpu viewshed (#588)
- Refactored proximity module to avoid rechunking (#549)
- Added dask support to proximity tools (#540)
- Refactored the resample utils function and changed their name to canvas_like (#539)
- Added zone_ids and cat_ids param to stats zonal function (#538)
- Added Dask support for stats and crosstab zonal functions (#502)
- Ignored NaN values on classify functions (#534)
- Added agg param to crosstab zonal function (#536)
- Updated the classification notebook (#489)
- Added xrspatial logo to readme (#492)
- Removed reprojection notebook old version (#494)
- Added true_color function to documentation (#494)
- Added th params to true_color function (#494)
- Added pathfinding nb data load guidance (#491)
- Added reprojection notebook (#474)
- Reviewed local tools notebook (#466)
- Removed save_cogs_azure notebook (#478)
- Removed xrspatial install guidance from makepath channel (#483)
- Moved local notebook to user guide folder (#486)
- Fixed pharmacy notebook (#479)
- Fixed path-finding notebook data load guidance (#480)
- Fixed focal notebook imports (#481)
- Fixed remote-sensing notebook data load guidance (#482)
- Added output name and attrs on true_color function (#484)
- Added classify notebook (#477)
- Added resample notebook (#452)
- Reviewed mosaic notebook (#454)
- Added local module (#456)
- Added make terrain data function (#439)
- Added focal_stats and convolution_2d functions (#453)
- Fixed conda-forge building pipeline
- Moved all examples data to Azure Storage (#424)
- Added GPU and Dask support for Focal tools: mean, apply, hotspots (#238)
- Moved kernel creation functions to convolution module (#238)
- Update Code of Conduct (#391)
- Fixed manhattan distance to sum of abs (#309)
- Example notebooks running on PC Jupyter Hub (#370)
- Fixed examples download cli cmd (#349)
- Removed conda recipe (#397)
- Updated functions and classes docstrings (#302)
- Test release for new github actions
- Deprecated tiles module (#381)
- Added user guide on the documentation website (#376)
- Updated docs design version mapping (#378)
- Added Github Action to publish package to PyPI (#371)
- Moved Spatialpandas to core install requirements for it to work on JLabs (#372)
- Added CONTRIBUTING.md (#374)
- Updated
true_colorto return axr.DataArray(#364) - Added get_data module and example sentinel-2 data (#358)
- Added citations guidelines and reformat (#382)
- Fixed pypi related error
- Updated multispectral.true_color: sigmoid contrast enhancement (#339)
- Added notebook save cogs in examples directory (#307)
- Updated Focal user guide (#336)
- Added documentation step on release steps (#346)
- Updated cloudless mosaic notebook: use Dask-Gateway (#351)
- Fixed user guide notebook numbering (#333)
- Correct warnings (#350)
- Add flake8 Github Action (#331)
- Cleared metadata in all examples ipynb (#327)
- Moved docs requirements to source folder (#326)
- Fixed manifest file
- Fixed travis ci (#323)
- Included yml files
- Fixed examples path in Pharmacy Deserts Noteboo
- Integrate xarray-spatial website with the documentation (#291)
- CLI examples bug fixed
- Added
drop_clouds, cloud-free mosaic from sentinel2 data example (#255)
- Sphinx doc fixes
- CLI bug fixed in 0.1.5
- Added band_to_img utils func
- Added download-examples CLI command for all notebooks (#241)
- Added band_to_img utils func
- Docs enhancements
- GPU and dask support for multispectral tools
- GPU and Dask support for classify module (#168)
- Fixed savi dask cupy test skip
- Moved validate_arrays to utils
- Added GPU support for hillshade (#151)
- Added CLI for examples data
- Improved Sphinx docs / theme
- Added GPU support for curvature (#150)
- Added dask.Array support for curvature (#150)
- Added GPU support for aspect (#156)
- Added dask.Array support for aspect (#156)
- Added GPU support for slope (#152)
- Added dask.Array support for slope (#152)
- Fixed slope cupy: nan edge effect, remove numpy padding that cause TypeError (#160)
- Fixed aspect cupy: nan edge effect, remove numpy padding that cause TypeError(#160)
- Updated README with Supported Spatial Features Table
- Added badge for open source gis timeline
- Added GPU Support for Multispectral tools (#148)
- Added Python 3.9 to Test Suite
- Added convolution module for use in focal statistics. (#131)
- Added example notebook for focal statistics and convolution modules.
- Moved kernel creation to name-specific functions. (#127)
- Separated the validate and custom kernel functions. (focal)
- Added annulus focal kernel (#126) (focal)
- Added outputting of z-scores from hotspots tool (focal)
- Changed type checking to use np.floating (focal)
- Added tests for refactored focal statistics (focal)
- Added A* pathfinding
- Allow all numpy float data types, not just numpy.float64 (#122)
- Broke out user-guide into individual notebooks (examples)
- Added num_sample param option to natural_breaks (#123)
- Removed sklearn dependency
- Fixed missing deps
- Added 2D Crosstab (zonal)
- Added suggest_zonal_canvas (zonal)
- Added conda-forge build
- Removed Versioneer
- Updates to CI/CD
- Added Proximity Direction (proximity)
- Added Proximity Allocation (proximity)
- Added Zonal Crop (zonal)
- Added Trim (zonal)
- Added ebbi (multispectral)
- Added more tests for slope (slope)
- Added image grid (readme)
- Changed ndvi.py -> multispectral.py
- Added arvi (multispectral)
- Added gci (multispectral)
- Added savi (multispectral)
- Added evi (multispectral)
- Added nbr (multispectral)
- Added sipi (multispectral)
- Added
countto default stats (zonal) - Added regions tools (zonal)
- Test Release
- Test Release
- Add Pixel-based Region Connectivity Tool (#52)
- Fixes to Proximity Tools (#45, #37, #36)
- Changes to slope function to allow for change x, y coordinate fields (#46)
- Added Pharmacy Desert Example Notebook
- Add natural breaks classification method
- Add equal-interval classification method
- Add quantile classification method
- Add binary membership classification method
- Fixes to zonal stats docstring (#40)
- Added experimental
query layerfrom agol-pandas (will probably not be supported long term) - Added ReadtheDocs page
- Added experimental
hotspotanalysis tool (Getis-Ord Gi*) (#27) - Added experimental
curvatureanalysis tool (Getis-Ord Gi*) - Added support for creating WMTS tilesets (moved out of datashader)
- Added contributor code of conduct
- First public release available on GitHub and PyPI.