Skip to content

Releases: xarray-contrib/xarray-spatial

v0.10.15

Choose a tag to compare

@brendancol brendancol released this 29 Jun 21:11
76ebd7e

Bug fixes and improvements

  • terrain: map the generate_terrain dask backends over an empty skeleton so from_template grids no longer drop out of the task graph (#3575)

v0.10.14

Choose a tag to compare

@brendancol brendancol released this 29 Jun 04:22
6383ead

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

Choose a tag to compare

@brendancol brendancol released this 26 Jun 18:26
5da5062

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

Choose a tag to compare

@brendancol brendancol released this 25 Jun 15:07
ada7d9b

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

Choose a tag to compare

@brendancol brendancol released this 22 Jun 13:51
4108b32

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

Choose a tag to compare

@brendancol brendancol released this 17 Jun 20:53
9704307

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

Choose a tag to compare

@brendancol brendancol released this 15 Jun 19:23
ef65fa3

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

Choose a tag to compare

@brendancol brendancol released this 15 Jun 12:47
e2c258b

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

Choose a tag to compare

@brendancol brendancol released this 14 Jun 04:51
9c1a81a

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 ...
Read more

v0.10.6

Choose a tag to compare

@brendancol brendancol released this 09 Jun 01:13
b24e4d5

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