Skip to content

Releases: xarray-contrib/xarray-spatial

v0.10.10

17 Jun 20:53
9704307

Choose a tag to compare

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

15 Jun 19:23
ef65fa3

Choose a tag to compare

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

15 Jun 12:47
e2c258b

Choose a tag to compare

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

14 Jun 04:51
9c1a81a

Choose a tag to compare

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

09 Jun 01:13
b24e4d5

Choose a tag to compare

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

v0.10.5

07 Jun 03:02
43ae72c

Choose a tag to compare

New features

  • add Kilo CLI command definitions (#3003)

Bug fixes and improvements

  • contours: add geometry deduplication (#2790) (#3001)
  • geotiff: cover compress()/decompress() dispatcher error branches (#2995) (#2996)
  • geotiff: fail closed on malformed GDAL_METADATA XML under mask_and_scale (#2999)
  • geotiff: enforce tile_size positivity in array-level writers (#2997) (#3000)
  • geotiff: reject mixed per-band SCALE/OFFSET under mask_and_scale (#2988) (#2993)
  • geotiff: promote int to float on masked read regardless of sentinel hit (#2990) (#2994)
  • geotiff: reject malformed SCALE/OFFSET under mask_and_scale (#2992)
  • vrt: surface chunked decode-time hole gap under missing_sources='warn' (#2989) (#2991)
  • geotiff: cover GPU writer degenerate shapes (1x1/1xN/Nx1) (#2986)
  • geotiff: accumulate GPU overview mean in float64 for CPU byte parity (#2983) (#2985)
  • accessor: surface standalone docstrings on .xrs methods; fix broken hydro delegations (#2982)
  • geotiff: align direct backend mask_nodata default with open_geotiff (#2976) (#2980)
  • vrt: privatize build_vrt; route to_geotiff's VRT path through it (#2979)
  • geotiff: reject non-string compression at the to_geotiff boundary (#2975) (#2977)
  • geotiff: cover degenerate-shape reads on dask and GPU backends (#2973)
  • geotiff: fix flake8/isort style drift in tests and two source imports (#2970) (#2972)
  • vrt: stop build_vrt fabricating a GeoTransform for non-georeferenced sources (#2966) (#2971)
  • geotiff: clean up VRT staging dir on early validation failures (#2964) (#2968)
  • geotiff: write VRT index atomically via temp-then-rename (#2965) (#2967)
  • geotiff: align open_geotiff parameters with rioxarray's open_rasterio (#2961) (#2963)
  • geotiff: consolidate public API on open_geotiff / to_geotiff (#2962)

Contributors

Thanks to @brendancol and @Melissari1997 for their contributions to this release.

v0.10.4

05 Jun 13:15
489c54f

Choose a tag to compare

Bug fixes and improvements

  • kriging: guard single-point input in the variogram (#2924)
  • kriging: zero the matrix diagonal so the nugget is not placed on it (#2922)
  • polygonize: cast the float mask to bool before combining it with nan_mask (#2623) (#2913)
  • spline: upload invariant point/weight data to the GPU once on the dask+cupy path (#2929)
  • kriging: skip the full-grid k0 memory term for dask templates (#2923) (#2926)
  • kriging: fix flake8 E128 and isort drift in interpolate/_kriging.py (#2916) (#2918)
  • geotiff: extract a shared GeoTIFF fixture builder (#2912)
  • Add GPU and edge-case test coverage for spline() (#2927)
  • Add kriging test coverage for dask+numpy variance, nlags, and edge cases (#2921) (#2928)
  • Add GPU backend test coverage for idw() (#2925)
  • Remove a flaky wall-clock visvalingam-whyatt regression test (#2914)
  • docs: add a 1.0.0 stability policy and LTS commitment page (#2958)

New contributors

  • Thanks to @SAY-5 (Sai Asish Y) for their first contribution (#2913)

Full changelog: v0.10.3...v0.10.4

v0.10.3

03 Jun 17:39
60185dd

Choose a tag to compare

New features

  • focal: implement the Getis-Ord Gi* statistic in hotspots() (#2803)

Bug fixes and improvements

  • slope: validate planar cell size (#2897) (#2901)
  • contours: validate return_type before doing data work (#2891) (#2898)
  • viewshed: build the GPU rtx mesh with real x/y resolution (#2861) (#2887)
  • hydro: validate MFD fraction values in public consumers (#2873) (#2883)
  • viewshed: warn and document dask Tier C divergence from the exact sweep (#2880)
  • viewshed: validate max_distance, rejecting negative and non-finite values (#2874)
  • contours: validate the n_levels contract (#2895) (#2899)
  • proximity: fix bounded dask dropping in-range targets on irregular coords (#2908) (#2909)
  • contours: drop zero-length geometry at exact-level corners (#2902)
  • viewshed: stop mutating the caller's input raster (#2852) (#2871)
  • proximity: fix bounded-dask crash on skinny rasters (#2877)
  • contours: resolve output CRS the same way as polygonize (#2893) (#2900)
  • geotiff: gate remote sources in read_geotiff_gpu under stable_only (#2867) (#2878)
  • proximity: reject non-finite target_values (#2868)
  • focal: reject non-binary kernels in apply() and focal_stats() (#2862)
  • terrain: resolve geodesic coords from real lat/lon over numeric y/x (#2903)
  • slope: set output units to degrees instead of leaking input units (#2904)
  • proximity: reject non-monotonic 1D coords in proximity/allocation/direction (#2875)
  • focal: fix hotspots() silent all-zeros on degenerate dask inputs (#2860)
  • focal: raise a clear error for non-2D custom kernels (#2842) (#2853)
  • aspect: warn on degree/meter unit mismatch in the planar path (#2839) (#2844)
  • contours: fix docstring overstating the Dask peak-memory guarantee (#2906)
  • viewshed: fix crash on NaN cells, marking them INVISIBLE (#2857) (#2876)
  • proximity: stop the dask fallback mutating the caller's input chunks (#2847) (#2864)
  • terrain: list accepted unit names in the invalid z_unit error (#2870)
  • hydro: reject cyclic MFD fraction grids instead of returning wrong results or hanging (#2884)
  • polygonize: replace the flaky visvalingam timing test with deterministic checks (#2889)
  • proximity: make allocation/direction tie-breaking deterministic across backends (#2881)
  • hydro: validate the MFD companion raster shape against the grid (#2863) (#2879)
  • geotiff: gate stable_only before the bbox metadata read on remote/VRT sources (#2882)
  • hydro: keep MFD dask output assembly lazy (#2865) (#2886)
  • viewshed: call has_cuda_and_cupy() in has_rtx() so GPU dispatch gates correctly (#2849) (#2859)
  • aspect: guard dask geodesic against single-chunk OOM (#2840) (#2846)
  • aspect: fix .name leak on dask backends when name=None (#2845)
  • slope: cover planar boundary modes on cupy and dask+cupy backends (#2832)
  • slope: fix .name leak on dask backends when name=None (#2838)
  • proximity: pin the dim-order error path and all-NaN raster across backends (#2836)
  • aspect: cover the northness/eastness method='geodesic' path (#2829) (#2835)
  • focal: fix GPU std/var precision on large-offset rasters (#2834)
  • aspect: make the planar cupy backend match numpy in [0, 360) (#2827) (#2833)
  • geotiff: enforce stable_only for HTTP/fsspec sources on non-VRT read paths (#2826)
  • geotiff: synthesize x/y coords for no-georef VRT reads (#2824)
  • geotiff: validate the gpu dispatch flag as bool and fail closed (#2819) (#2823)
  • geotiff: correct the stable_only docstring to state HTTP/fsspec rejection (#2822)
  • polygonize: optimize visvalingam_whyatt with a min-heap (#2817)
  • aspect: fix the compass-direction table in the docstring (#2825) (#2828)
  • proximity: raise on invalid distance_metric (#2814)
  • focal: make hotspots() lazy for Dask input (#2802)
  • aspect: apply cell-size correction to the planar path (#2760) (#2780)
  • slope: warn on degree coords with meter elevation in the planar path (#2764) (#2777)
  • focal: fix GPU variety undercount for kernels larger than 5x5 (#2800)
  • aspect: add an independent rectangular-cell oracle for the planar path (#2781)
  • proximity: validate negative max_distance (#2813)
  • focal: preserve input float dtype in apply() and focal_stats() (#2769) (#2805)
  • focal: validate the hotspots() kernel like apply() and focal_stats() (#2771) (#2799)
  • terrain: warn when planar resolution averages irregular coordinates (#2766) (#2784)
  • slope: propagate the NaN center cell in the planar path (#2761) (#2773)
  • proximity: fix GREAT_CIRCLE on the CPU line-sweep backend (#2816)
  • proximity: fix dask halo depth on irregular coords and 1xN/Nx1 rasters (#2815)
  • contours: fix auto-levels silently dropping all contours with +/-inf (#2801)
  • proximity: fix Great Circle docstrings to say meters, not kilometers (#2811)
  • focal: validate focal_stats() stats_funcs before dispatch (#2798)
  • slope: keep dask+cupy geodesic lat/lon lazy to avoid GPU OOM (#2776)
  • aspect: skip the full-raster geodesic memory guard for dask (#2774)
  • repo: add Codex command mirrors (#2806)
  • terrain: make the geodesic memory guard backend-aware for dask (#2765) (#2779)

v0.10.2

01 Jun 15:52
59bb4d2

Choose a tag to compare

New contributors

Bug fixes and improvements

  • contours: handle infinite NaN coords (#2749)
  • contours: validate input raster, reject complex dtype (#2711)
  • contours: keep CRS on empty geopandas result (#2708)
  • focal: pin result .name across backends in focal_stats and hotspots (#2735)
  • focal: honour boundary on the cupy backend (#2736)
  • focal: keep hotspots dask+cupy classification on the GPU (#2739)
  • focal: align signatures across mean/apply/focal_stats/hotspots (#2699)
  • aspect: keep lat/lon chunked in dask+cupy geodesic path (#2707)
  • aspect: planar dask backends report float32 dtype matching computed data (#2741)
  • slope: planar dask backends declare float32 meta dtype (#2694)
  • slope: widen name type hint to Optional[str] for terrain-family parity (#2687)
  • viewshed: consistent output name and dtype across backends (#2747)
  • viewshed: guard degenerate-axis resolution in the CPU sweep (#2745)
  • viewshed: size max_distance window per axis on anisotropic rasters (#2702)
  • proximity: consistent output dtype and .name across allocation and direction backends (#2728)
  • proximity: fix bounded GREAT_CIRCLE crash on dask backends (#2722)
  • proximity: batch per-chunk-row compute in KDTree count pass (#2726)
  • hydro: cap flow_path downstream walk to break cycles (#2718)
  • hydro: stream_order_d8 accepts method alias; basins_d8 emits DeprecationWarning (#2716)
  • resample: reject out-of-range integer nodata sentinels (#2671)
  • resample: reject empty rasters with a clear ValueError (#2665)
  • resample: reject irregular/non-monotonic spatial coordinates (#2667)
  • resample: refresh nodata/nodatavals on identity fast path (#2670)
  • resample: fix dask nearest/bilinear chunk-seam values on downsampling (#2627)
  • reproject: make transform_precision=0 force exact pyproj transforms (#2654)
  • reproject: account for datum shifts in output bounds estimation (#2655)
  • reproject: disable numba fast path for non-WGS84 datums (#2657)
  • reproject: filter footprint coordinate pairs by joint finite mask (#2652)
  • reproject: fix per-band nodata masking for multi-band inputs (#2658)
  • reproject: fix cupy backend divergence from numpy on pyproj-fallback CRS pairs (#2629)
  • reproject: rename vertical CRS kwargs to source_/target_vertical_crs (#2626)
  • zonal: raise clear ValueError for empty Dataset in stats() (#2642)
  • zonal: count returns 0 for empty zones, other stats stay NaN (#2656)
  • zonal: validate backend compatibility on the crosstab 3D path (#2653)
  • zonal: validate backend compatibility for 3D apply() inputs (#2648)
  • zonal: make apply() output .name deterministic across backends (#2622)
  • zonal: fix int32 overflow in _strides() that corrupts stats/crosstab on huge rasters (#2617)
  • crop: validate zones/values shapes match instead of returning nonsense (#2645)
  • geotiff: forward allow_rotated/allow_invalid_nodata to VRT per-source reads (#2676)
  • geotiff: make open_geotiff bbox= work for .vrt sources (#2674)
  • geotiff: make VRT tiled writes atomic to avoid poisoned partial output (#2678)
  • polygonize: batch dask per-chunk compute instead of serial loop (#2673)
  • polygonize: batch dask compute per chunk row to recover parallelism (#2632)
  • polygonize: make dask float output chunk-invariant for rtol (#2675)
  • polygonize: keep diagonal-notch hole in dask 8-conn merge (#2633)
  • polygonize: derive transform from x/y coords so geopandas CRS matches geometry (#2630)

v0.10.1

29 May 14:15
57e7c57

Choose a tag to compare

New features

  • accessor: backend-aware .xrs.open_geotiff on DataArray and Dataset (#2598)
  • geotiff: add bbox= to open_geotiff for geographic-space windowed reads (#2556)

Bug fixes and improvements

  • rasterize: honor resolution= exactly when bounds don't divide evenly (#2597)
  • reproject: fix vertical-datum shift crash on integer DEMs (#2596)
  • resample: clamp dask interp overlap depth per axis (#2547) (#2599)
  • zonal: fix trim() with NaN sentinel on numpy and cupy backends (#2559) (#2594)
  • reproject: reject explicit out-of-range nodata for integer dtypes (#2591)
  • zonal: fix cupy backend dropping all-NaN zones and desyncing zone_ids (#2562) (#2589)
  • resample: refresh transform to match actual coord orientation (#2571) (#2587)
  • rasterize: validate resolution= shape and element type (#2576) (#2586)
  • resample: preserve integer precision in nodata mask comparison (#2570) (#2592)
  • zonal: keep hypsometric_integral dask path fully lazy (#2563) (#2593)
  • geotiff: accept projected GeoTIFFs that carry a base geographic CRS (#2603)
  • polygonize: reject non-finite simplify_tolerance (#2575) (#2584)
  • reproject: unit-aware bounds_policy="auto" blow-up detection (#2600)
  • zonal: validate return_type at entry to stats() (#2558) (#2578)
  • resample: validate target_resolution and scale_factor up front (#2574) (#2590)
  • rasterize: support descending-x in like= templates (#2568) (#2595)
  • rasterize: reject zig-zag duplicate-coord patterns in _check_uniform_axis (#2585)
  • polygonize: fix dask chunk-dependent merging and DN corruption (#2601)
  • zonal: make crop() return (0, 0) on all backends when no zone matches (#2580)
  • rasterize: reject partial width/height overrides instead of silent ignore (#2579)
  • zonal: fix crosstab cat_ids overcount when earlier categories are filtered out (#2560) (#2577)
  • resample: preserve scalar non-dim coords and refresh stale nodata attr (#2542) (#2549)
  • zonal: fix hypsometric_integral dask+cupy backend (#2525) (#2529)
  • geotiff: include GB allocation estimate in max_pixels error message (#2554)
  • zonal: raise on 'majority' in zonal_stats dask path instead of silent drop (#2528) (#2531)
  • reproject: fix half-pixel offset in geoid and datum-shift grid lookups (#2508) (#2516)
  • rasterize: reject NaN fill against integer dtype (#2504) (#2512)
  • geotiff: reject distinct per-band nodatavals on write (#2514) (#2519)
  • zonal: guard unbounded allocation in stats(return_type='xarray.DataArray') (#2523) (#2533)
  • zonal: rechunk apply 3D dask output along stacked axis (#2526) (#2532)
  • rasterize: hoist poly_props/poly_global cupy.asarray above all_touched (#2506) (#2510)
  • polygonize: auto-detect attrs['transform'] for output georeferencing (#2536) (#2541)
  • geotiff: reconcile COG write stability across registry, contract, and docstring (#2520)
  • zonal: rename crop(zones_ids=) to crop(zone_ids=) with deprecation shim (#2521) (#2527)
  • reproject: preserve integer dtype in dask+cupy fast path (#2505) (#2509)
  • geotiff: scope max_pixels to the chunk when chunks= is supplied (#2501) (#2502)