Releases: xarray-contrib/xarray-spatial
Releases · xarray-contrib/xarray-spatial
Release list
v0.10.15
v0.10.14
New features
- templates: add regional templates to from_template for Africa, Asia, the Americas, and Oceania (#3553)
- templates: add global-projection templates to from_template (web_mercator, wgs84/latlon, equal_earth) (#3550)
- templates: accept explicit height/width and produce dask-aligned extents in from_template (#3567)
- templates: add coregister and neighborhood-friendly dask chunks to from_template (#3562)
- accessor: expose multi_stop_search on the .xrs DataArray and Dataset accessors (#3564)
Bug fixes and improvements
- preview: recompute the res attribute for downsampled preview() output (#3570)
- rasterize/kde/line_density: set output attrs['res'] when the grid resolution changes (#3572)
- classify: return all-NaN instead of crashing on all-non-finite input (#3548)
- proximity: match the cKDTree max_distance check to the brute-force float32 convention (#3555)
- templates: guard dask grids against task-graph explosion (#3559)
- templates: skip the cell cap for lazy dask grids when chunks is supplied (#3556)
- terrain: speed up the generate_terrain numpy backend with a fused parallel kernel (#3566)
- templates: add type hints to from_template and list_templates (#3543)
- interpolate: add IDW examples and backend-support notes to the docs (#3547)
- templates: fix a stale UTM zone in the from_template FRA example (#3544)
- benchmark: guard the datashader import in the rasterizer benchmark (#3560)
- geotiff: cover symbology sidecars on dask, dask+GPU, 3D single-band, and color_ramp_range (#3546)
- templates: cover single-pixel/strip grids and resolution-tuple validation in tests (#3540)
- curvature: fix isort import-ordering (#3568)
v0.10.13
New features
- geotiff: write continuous-raster symbology sidecars (.qml + PAM statistics) from to_geotiff (#3537) (#3538)
- templates: add list_templates() to discover from_template names (#3536)
- templates: add major world cities as bounding-box templates in from_template (#3534)
- fire: accept m/min spread rate in fireline_intensity by default (#3527) (#3529)
- hydrology: make routing the sole public hydrology API surface (#3528) (#3530)
- accessor: add coregister=True to .xrs.rasterize (#3492) (#3493)
Bug fixes and improvements
- flood: fix float32 dtype leak in flood_depth/curve_number_runoff dask backends (#3499) (#3509)
- flood: fix dask backends emitting float32 output for float32 input (#3498)
- flood: make mannings_n DataArray validation lazy-safe (#3503) (#3507)
- flood: fix E305 and collapse utils import (#3504)
- flood: add missing reference entries, examples, and backend notes (#3502)
- binary: output float32 on all backends (#3514)
- binary: type the dask+cupy meta so the lazy dtype matches float32 (#3508) (#3513)
- geotiff: stop a short-row PAM RAT from crashing open_geotiff (#3522)
- geotiff: add Examples section to to_geotiff docstring (#3521)
- geotiff: cover categorical PAM sidecar round-trip on dask and GPU write paths (#3518) (#3519)
- geotiff: join backslash-continued import in test (isort) (#3517)
- templates: use CF Conventions metadata instead of crs_units/crs_name (#3532)
- templates: fill all-NaN templates in generate_terrain (numpy/cupy) (#3526)
- templates: honor requested resolution exactly in from_template() (#3494) (#3495)
- classify: fix stale example outputs and add missing examples (#3516)
- classify: cover all-NaN degenerate input across classifiers (#3515)
- classify: document num_sample=None in natural_breaks docstring (#3505)
- fire: add Examples sections and backend-support notes to docstrings (#3512)
- fire: add Inf/-Inf regression tests (#3500)
- multispectral: test vegetation_roughness ndvi on dask+cupy backend (#3497)
v0.10.12
New features
- templates: add from_template() for empty study-area DataArrays over common regions (#3484) (#3487)
- accessor: add .xrs.validate() to check a raster against the xarray-spatial contract (#3486)
- accessor: add a categorized repr to the .xrs accessor (#3476) (#3477)
- accessor: forward per-tool repr to the accessed tool (#3478) (#3479)
- interpolation: accept GeoDataFrames and expose on the .xrs accessor with coregister (#3481)
- rasterize: support string/categorical columns with QGIS-visible labels (#3483)
Bug fixes and improvements
- proximity: fix EUCLIDEAN proximity/allocation/direction dropping targets at exact max_distance (#3443)
- perlin: preserve input x/y coordinates on the output (#3470)
- perlin: preserve input dtype on the dask backends (#3471)
- perlin: fix dask OOM by dropping a redundant dask.persist (#3469) (#3473)
- perlin: document the name parameter in the docstring (#3468)
- perlin: document name param, float-dtype requirement, and ValueError (#3467)
- perlin: drop unused not_implemented_func import, fix isort wrap (#3466)
- perlin: add test coverage for params, degenerate shapes, and metadata (#3472)
- perlin: fix stale test_perlin coords assertion after coords preservation (#3489)
- generate_terrain: preserve caller coords/res/crs (#3474) (#3475)
- least_cost_corridor: propagate friction geo-attrs (#3446) (#3449)
- corridor: validate matching shapes for precomputed surfaces (#3447)
- corridor: add strip, cross-backend, param, and metadata test coverage (#3448)
- fire: add test coverage for dask+cupy dispatch and metadata preservation (#3444)
v0.10.11
Bug fixes and improvements
- classify: align natural_breaks parameter order with sibling classifiers (#3418)
- multispectral: propagate input dims/coords through true_color() (#3429) (#3434)
- multispectral: fix nbr() docstring parameter name to match signature (swir2_agg) (#3435)
- multispectral: remove unused import and fix import ordering (#3428) (#3432)
- multispectral: add test coverage for true_color edges and evi/savi validation (#3436)
- diffusion: drop unused import, sort imports (#3421) (#3423)
- diffusion: add test coverage for cupy/dask+cupy, reflect boundary, and edge shapes (#3424)
- disaggregate: fix limiting_variable silently losing a zone's value (#3403) (#3414)
- disaggregate: vectorize the zone-membership loop (#3408) (#3420)
- dasymetric: add test coverage for metadata, 1x1, Inf weight, 3-class limiting_variable (#3419)
- dasymetric: clean up lint (F401, E128, isort) (#3411)
- classify: keep the large-array sampler O(num_sample) in host memory (#3416)
- classify: add edge-case and error-path test coverage (#3417)
- classify: remove unused import and fix isort ordering (#3405)
- morphology: remove unused imports and dead local, fix import order (#3413)
- morphology: skip the memory guard for lazy dask inputs (#3401) (#3410)
- morphology: add missing accessor methods (#3409)
- morphology: add test coverage for edge inputs (Inf, all-NaN, strip, integer) (#3415)
- viewshed: add tests for 1x1, all-NaN, and Inf-terrain edge cases (#3425) (#3426)
- proximity: match GPU max_distance precision to the CPU brute-force (#3389) (#3391)
- proximity: fix isort import-ordering drift (#3393)
- proximity: cover Dataset input for proximity/allocation/direction (#3390)
- fire: declare float32 dtype on the dask+numpy backend (#3394) (#3396)
- fire: drop dead code and fix import ordering (#3395) (#3397)
- aspect: sort imports per isort config (#3437) (#3438)
- aspect: test Inf and all-NaN elevation input across backends (#3439) (#3440)
- engine: carry the coregister/auto_reproject target on the parameter value (#3380)
- rasterize: match dask all_touched polygon boundary to eager on grid lines (#3384) (#3386)
- rasterize: add validation-guard test coverage (#3383) (#3385)
- zonal: vectorize _sort_and_stride 3D reindex, drop deepcopy (#3381) (#3382)
v0.10.10
New features
- geotiff: expose the GeoTIFF loader as an xarray backend engine (#3365) (#3375)
- geotiff: expose coregistered reads through the xarray engine via like= (#3376) (#3377)
Bug fixes and improvements
- geotiff: read and parse a local file once on the chunked GPU read path (#3373) (#3374)
- geotiff: reject predictor with jpeg2000/lerc/jpeg compression (#3371) (#3372)
- cost_distance: fix Dijkstra heap overflow on non-uniform friction (#3370)
- cost_distance: add test for the dask all-impassable early return (#3367) (#3368)
- ci: add free-threaded Python 3.14 (3.14t) to the test matrix (#3360)
- ci: make test_chunks_is_lazy counter thread-safe for free-threaded CI (#3363) (#3364)
- ci: scope the 'performance' labeler to benchmarked modules (#3357)
- remove AI-assistant tooling definitions (#3362)
v0.10.9
Bug fixes and improvements
- cost_distance: route bounded large-radius dask path to iterative Dijkstra (#3345)
- cost_distance: guard the numpy dask chunk path with _check_memory (#3346)
- cost_distance: fix leaking dask task name as output .name (#3349)
- cost_distance: replace mutable default target_values=[] with a None sentinel (#3348)
- cost_distance: add tests for 1x1 raster, Inf friction, and metadata (#3347)
- cost_distance: fix flake8/isort findings (#3350)
- contour: batch dask chunk compute to bound client memory (#3334)
- contour: remove redundant np.empty_like allocation in the coordinate transform (#3354)
- contour: add test coverage for all-equal auto-levels and empty explicit levels (#3353)
- geotiff: reject a zero or non-finite ModelPixelScale on read (#3332)
- geotiff: fix isort import ordering in _writers/eager.py (#3330)
- docs: fix file paths in the deep-sweep documentation (#3336)
Thanks
Thanks to @Melissari1997 for code and test contributions to this release.
v0.10.8
Bug fixes and improvements
- geotiff: gate dict gdal_metadata behind the experimental rich-tag opt-in (#3327)
- name dask tasks for remaining xrspatial tool modules (#3326)
- geotiff: don't flip masked_nodata True on a caller dtype= cast of an unmasked buffer (#3325)
- to_geotiff: type-check compression_level (#3324)
- rasterize: burn all_touched lines with the supercover walk (#3322)
- focal: handle empty rasters consistently across backends (#3319)
- reproject: promote large-output in-memory cupy inputs to dask (#3318)
- reproject: serialize all parallel=True kernel launches behind one lock (#3317)
- docs: add an examples-and-data getting-started page and landing index (#3316)
v0.10.7
Version 0.10.7 - 2026-06-13
New features
- to_geotiff: add pack=True, the inverse of mask_and_scale (#3064) (#3065)
- open_geotiff: add coregister=True (mask_and_scale + reproject + match grid) (#3069) (#3070) (#3072)
- open_geotiff: pick reproject resampling by raster type under auto_reproject=True (#3067) (#3068)
- open_geotiff: rename mask_and_scale to unpack and add GPU / dask+GPU support (#3075)
Bug fixes and improvements
- polygonize: reject invalid return_type before running the computation (#3312)
- polygonize: document that column_name is also used for geojson output (#3309)
- kriging: keep template backend and variance name in the singular-matrix fallback (#3294)
- rasterize: drop non-finite-coordinate geometries and clamp row casts (#3310)
- merge: add GPU tests for mixed-type first/last ordering (#3296) (#3302)
- interpolate: add edge-case and parameter test coverage (#3300)
- polygonize: honor _xrspatial_no_georef in CRS detection (#3293) (#3308)
- polygonize: jit the float-chunk region ranges scan (#3303) (#3314)
- rasterize: burn each geometry once per pixel under merge='sum'/'count' (#3313)
- interpolate: cut redundant work in the backends (#3311)
- rasterize: widen the dtype annotation to the accepted forms (#3291) (#3297)
- kriging: name the singular-fallback variance '{name}_variance' (#3289)
- polygonize: cover the dask mask-rechunk path (#3299) (#3305)
- polygonize: raise on uint32 region overflow in the cupy integer backend (#3292) (#3301)
- interpolate: drop unused math import and fix isort drift (#3286) (#3287)
- docs: add a why-xarray-spatial page, retire raster_huh (#3249) (#3284)
- geotiff: fill pack=True nodata holes at the integer dtype's native width (#3277)
- ci: add a docs-build job (#3252)
- projection: read ITRF Helmert scale as ppm to match PROJ's data files (#3283)
- projection: reject non-WGS84 ellipsoids in the fast-path dispatch (#3282)
- projection: fix LAEA inverse rq normalization and authalic inverse series (#3280)
- reproject: upload shared coordinate arrays once per chunk in multi-band cupy (#3279)
- reproject: promote to the dask path when the output is large (#3278)
- geotiff: export VRTUnsupportedError, CloudSizeLimitError, PixelSafetyLimitError publicly (#3265) (#3273)
- geotiff: refuse pack=True values the packed integer dtype cannot hold (#3272)
- merge: keep the shared integer input dtype instead of promoting to float64 (#3271)
- geotiff: add gpu and dask+gpu legs to the pack=True feature tests (#3270)
- geotiff: correct the unpack docstring (masking still runs without scale/offset) (#3263) (#3269)
- geotiff: rewrap _attrs import in _writers/gpu.py to isort line_length=100 (#3259) (#3261)
- docs: replace the usage page with a runnable quickstart (#3249) (#3258)
- docs: rewrite the installation page (environments, extras, GPU and cloud notes) (#3257)
- dask: name compute tasks xrspatial. for readable task graphs (#3255)
- docs: fix stale Datashader claim and hardcoded links in getting-started (#3249) (#3251)
- geotiff: coregister=True reads COG overviews and fails fast on bad templates (#3254)
- geotiff: document coregister=True and register it as an experimental feature (#3248)
- geotiff: warn when coregister=True covers only a small fraction of the caller grid (#3247)
- proximity: replace the numpy line-sweep with an exact cKDTree query (#3245)
- projection: add dask end-to-end warning test, lock note on _crs_to_dict (#3242) (#3244)
- projection: silence the pyproj lossy-PROJ-string warning in param extractors (#3242) (#3243)
- geotiff: stream dask input through the GPU writer one tile-row band at a time (#3241)
- geotiff: fix to_geotiff(pack=True) crash on cupy and dask+cupy input (#3240)
- geotiff: keep float32 sources float32 through to_geotiff(pack=True) (#3080) (#3239)
- hotspots: raise instead of returning all zeros when the raster contains Inf (#3238)
- geotiff: defer the pack=True NaN guard into the dask graph so chunks compute once (#3237)
- geotiff: forward caller chunking to the coregister/auto_reproject output (#3236)
- visibility: add cupy backend, NaN, and Fresnel-blocked coverage (#3202)
- visibility: fix the cupy backend crash in cumulative_viewshed/visibility_frequency (#3205)
- zonal: add GPU backend coverage for regions and crosstab (#3203)
- focal: make the kernel memory guard dtype-aware (#3223) (#3232)
- focal: resolve apply() default func per backend (#3215) (#3224)
- focal: add edge-case and parameter tests from the test-coverage sweep (#3230)
- hotspots: fix the docstring backend list and kernel weight semantics (#3216) (#3227)
- clip_polygon: align dask+cupy mask chunks before map_blocks (#3186) (#3204)
- focal: make output dtype consistent across backends (#3226)
- clip_polygon: use the largest chunk for the rasterize mask on dask (#3191) (#3201)
- visibility: compute the dask source once in cumulative_viewshed (#3185) (#3199)
- polygon_clip: remove unused imports and fix import order (#3198)
- visibility: align output name and frequency_mhz hint with viewshed (#3183) (#3195)
- geotiff: fix to_geotiff dask+cupy crash in the CPU streaming writer (gpu=False) (#3171)
- clip_polygon: make nodata dtype consistent across backends (#3208)
- mcda: fix the owa() dask path and batch wpm() validation into one scheduler pass (#3158)
- hypsometric_integral: validate raster inputs (#3211)
- regions: vectorize the relabel loop (#3207) (#3212)
- mcda: fix cupy and dask backend failures in owa, standardize, and sensitivity (#3146) (#3157)
- mcda: fix API consistency (owa weights param, boolean_overlay Dataset input, ahp_weights docs, ConsistencyResult export) (#3148) (#3155)
- mcda: add cupy, dask, metadata, and edge-case test coverage (#3149) (#3156)
- mcda: guard monte_carlo dask materialization against OOM (#3145) (#3153)
- proximity: add coverage tests (int rasters, bounded GPU metrics, empty input) (#3139) (#3140)
- geotiff: add reader.unpack / writer.pack to SUPPORTED_FEATURES at experimental tier (#3172)
- focal: preserve input float dtype in mean() across all backends (#3214) (#3221)
- proximity: fix stale proximity/allocation/direction docstrings (#3091) (#3138)
- visibility: fix isort import-ordering (#3182) (#3189)
- geotiff: thread the nodata kwarg into _pack's NaN fill so pack=True holes match GDAL_NODATA (#3168) (#3174)
- mcda: remove unused warnings import, fix isort drift (#3143) (#3144)
- geotiff: rewrite stale per-band SCALE/OFFSET in to_geotiff(pack=True) after band-subset reads (#3175)
- geotiff: validate compression_level before GPU dispatch and pass it to fallback codecs (#3167) (#3176)
- vrt: place non-georeferenced tiles by explicit pixel offsets (#3116) (#3135)
- projection: document actual return types of vertical datum functions (#3097) (#3134)
- mcda: keep standardize piecewise/categorical on the device for cupy inputs (#3159)
- geotiff: fix the compression corpus fixture path so oracle tests actually run (#3164) (#3169)
- geotiff: warn when the GPU writer materializes dask input; scope streaming docs to the CPU path (#3173)
- focal: hoist the input cast out of the cupy focal_stats loop (#3231) (#3233)
- focal: make the memory guard backend-aware for dask input (#3218) (#3228)
- clip_polygon: add backend/edge-case/metadata test coverage (#3197) (#3206)
- docs: fix the README to_geotiff example that used the gated JPEG codec (#3162) (#3170)
- zonal: tighten crosstab zone_ids/cat_ids type hints and fix stale nodata docstring (#3196)
- mcda: preserve input attrs in constrain() (#3147) (#3154)
- reproject: keep integer dtype for empty chunks (#3096) (#3133)
- mcda: make monte_carlo sensitivity chunk-bounded on dask and drop constrain() deep copy (#3160)
- rasterize: drop two avoidable full-raster allocations in the backends (#3107) (#3131)
- proximity: fix bounded dask GREAT_CIRCLE missing antimeridian targets (#3108) (#3130)
- geotiff: mask 64-bit integer sentinels at native width in eager reads (#3098) (#3128)
- reproject: accept cupy and dask+cupy inputs in merge() (#3095) (#3125)
- geotiff: add xfail'd GPU and dask+GPU pack=True round-trip tests (#3114) (#3127)
- proximity: sort dask KDTree targets row-major so the tie-break matches numpy (#3090) (#3124)
- proximity: hoist the line-sweep kernel to module level to stop per-call recompiles (#3103) (#3126)
- rasterize: add all_touched-line and non-iterable-input coverage tests (#3120)
- rasterize: rename use_cuda to gpu with a deprecation shim (#3089) (#3122)
- geotiff: reject zero and non-finite SCALE/OFFSET under unpack=True; guard pack=True against divide-by-zero (#3104) (#3129)
- reproject: gate the CUDA fast path on WGS84-compatible datums (#3094) (#3119)
- geotiff: group streaming-write rows into bands so source chunks compute once (#3117) (#3136)
- reproject: skip the duplicate try_numba_transform probe in the numpy chunk worker (#3123)
- reproject: remove the obsolete strict xfail on the streaming 3-D test (#3100) (#3181)
- reproject: add tests for the streaming fallback path (#3101) (#3118)
- reproject: match streaming output dtype to the other backends (#3093) (#3111)
- geotiff: name unpack instead of the deprecated mask_and_scale alias in docs and errors (#3115)
- geotiff: keep regression tests and sweep state after #3109 landed the guard (#3088) (#3110)
- proximity: build dask coordinate grids with chunk-aligned broadcast (#3132) (#3137)
- rasterize: propagate GeoDataFrame CRS to output when like has none (#3087) (#3113)
- rasterize: reject non-finite burn values against integer and bool output dtypes (#3085) (#3109)
- reproject: remove unused import and dead local, fix import order in init.py (#3083) (#3092)
- geotiff: fix isort import-ordering drift (#3082) (#3084)
- merge: make the output-size guard backend-aware (#3048) (#3081)
- geotiff: restore the nodata sentinel for float rasters in to_geotiff(pack=True) (#3078) (#3079)
- projection: silence the pyproj PROJ-string warning in _get_datum_params (#3076) (#3077)
- resample: add ...
v0.10.6
New features
- emerging_hotspots: compute the Getis-Ord Gi* statistic (#3040)
- re-export open_geotiff and to_geotiff from top-level xrspatial (#3005) (#3006)
- add Cursor IDE support (.cursorrules and .cursor/rules/) (#3019)
Bug fixes and improvements
- reproject: fix flake8/isort style issues (#3052)
- reproject: parametrize dask+cupy parity over resampling modes (#3050) (#3051)
- reproject: make the output-size guard backend-aware (#3046) (#3047)
- contours: add a cross-backend NaN-input parity test (#3045)
- sweep: drop merge=union for state CSVs (#2754) (#3043)
- flow_path_dinf: fix a hang on cyclic D-inf flow directions (#2796) (#3042)
- viewshed: fix the broken bounds-check guard in _calculate_event_row_col() (#2793) (#3035)
- viewshed: validate observer_elev and target_elev before dispatch (#2794) (#3037)
- warnings: name the calling function in the unit-mismatch warning (#2782) (#3036)
- stream_link_mfd / stream_order_mfd: keep the dask assembly lazy (#2885) (#3039)
- remove dead datum-shift machinery (#2659) (#3038)
- polygonize: fix dask 8-connectivity float divergence at large rtol (#2677) (#3041)
- viewshed: validate regular grid spacing (#2789) (#3034)
- geotiff: reject to_geotiff(compression=None) with a clear TypeError (#2978) (#3029)
- geotiff: fix UnboundLocalError on restore_sentinel in plain-ndarray VRT tiled write (#2969) (#3028)
- contours: add tests for the all-NaN auto-levels RuntimeWarning regression (#2795) (#3009)
- geotiff: thread sidecar_origin through the HTTP/fsspec sidecar georef path (#3027)
- geotiff: remove stale external-overview skips on dask/fsspec/GPU golden-corpus backends (#3026)
- geotiff: route remote sidecar parse failures through the shared policy (#3022) (#3025)
- geotiff: size the streaming write budget from source chunks, not output tiles (#3008)
- contours: fix the border collar on integer dask input (#3020) (#3021)
- contours: fix return_type validation to fail fast on invalid values (#3010)
Contributors
- Thanks to @brendancol and @Melissari1997 for their contributions to this release.