xarray-spatial 0.10.7__tar.gz → 0.10.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (633) hide show
  1. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/CHANGELOG.md +14 -0
  2. {xarray_spatial-0.10.7/xarray_spatial.egg-info → xarray_spatial-0.10.8}/PKG-INFO +1 -1
  3. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8/xarray_spatial.egg-info}/PKG-INFO +1 -1
  4. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xarray_spatial.egg-info/SOURCES.txt +3 -0
  5. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/_version.py +3 -3
  6. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/classify.py +7 -4
  7. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/cost_distance.py +3 -0
  8. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/dasymetric.py +2 -0
  9. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/diffusion.py +5 -0
  10. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/emerging_hotspots.py +5 -0
  11. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/fire.py +25 -10
  12. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/flood.py +4 -0
  13. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/focal.py +72 -12
  14. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_attrs.py +15 -3
  15. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_backends/dask.py +10 -5
  16. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_backends/gpu.py +11 -4
  17. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_validation.py +27 -0
  18. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_writers/eager.py +13 -2
  19. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_writers/gpu.py +3 -0
  20. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/attrs/test_contract.py +43 -0
  21. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/gpu/test_writer.py +3 -1
  22. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_mask_and_scale_dtype_parity_3066.py +4 -1
  23. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_nodata.py +110 -0
  24. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_rioxarray_compat_2961.py +9 -3
  25. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_scale_zero_3104.py +3 -1
  26. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/release_gates/test_features.py +2 -1
  27. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_safe_xml.py +2 -1
  28. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_signatures.py +40 -2
  29. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/vrt/test_metadata.py +9 -7
  30. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_basic.py +48 -0
  31. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_pack_3064.py +3 -1
  32. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_pack_band_subset_3161.py +3 -1
  33. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_pack_float_width_3080.py +3 -1
  34. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_pack_lazy_nan_guard_3235.py +3 -1
  35. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_pack_nodata_kwarg_3168.py +3 -1
  36. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_pack_range_guard_3260.py +6 -4
  37. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/glcm.py +3 -0
  38. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/basin_d8.py +6 -4
  39. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/fill_d8.py +3 -2
  40. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_accumulation_d8.py +4 -2
  41. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_accumulation_dinf.py +3 -0
  42. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_accumulation_mfd.py +2 -0
  43. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_direction_d8.py +6 -3
  44. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_direction_dinf.py +5 -2
  45. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_length_d8.py +3 -1
  46. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_path_d8.py +10 -1
  47. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_path_dinf.py +3 -0
  48. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_path_mfd.py +3 -0
  49. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/hand_d8.py +9 -1
  50. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/hand_dinf.py +2 -0
  51. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/hand_mfd.py +2 -0
  52. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/sink_d8.py +4 -2
  53. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/snap_pour_point_d8.py +6 -1
  54. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/stream_link_d8.py +6 -4
  55. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/stream_link_dinf.py +5 -2
  56. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/stream_link_mfd.py +2 -0
  57. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/stream_order_d8.py +8 -5
  58. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/stream_order_dinf.py +7 -3
  59. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/stream_order_mfd.py +3 -0
  60. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/watershed_d8.py +4 -2
  61. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/watershed_dinf.py +2 -0
  62. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/watershed_mfd.py +2 -0
  63. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/interpolate/_idw.py +5 -3
  64. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/interpolate/_kriging.py +7 -2
  65. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/interpolate/_spline.py +5 -3
  66. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/mahalanobis.py +3 -0
  67. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/mcda/combine.py +3 -0
  68. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/mcda/sensitivity.py +2 -0
  69. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/mcda/standardize.py +6 -2
  70. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/morphology.py +3 -0
  71. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/multispectral.py +46 -24
  72. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/perlin.py +6 -4
  73. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/polygon_clip.py +3 -2
  74. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/proximity.py +13 -2
  75. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/rasterize.py +326 -52
  76. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/__init__.py +40 -14
  77. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/_itrf.py +15 -8
  78. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/_projections.py +4 -1
  79. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/_vertical.py +11 -3
  80. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/resample.py +19 -5
  81. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/sky_view_factor.py +3 -0
  82. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/terrain_metrics.py +14 -8
  83. xarray_spatial-0.10.8/xrspatial/tests/test_dask_task_names.py +357 -0
  84. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_focal.py +37 -9
  85. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_coverage_2026_06_09.py +52 -53
  86. xarray_spatial-0.10.8/xrspatial/tests/test_rasterize_lines_all_touched_3102.py +251 -0
  87. xarray_spatial-0.10.8/xrspatial/tests/test_reproject_cupy_promotion_3281.py +144 -0
  88. xarray_spatial-0.10.8/xrspatial/tests/test_reproject_parallel_kernels_3141.py +125 -0
  89. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_reproject_streaming_3101.py +22 -11
  90. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/worley.py +6 -4
  91. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/zonal.py +8 -3
  92. xarray_spatial-0.10.7/xrspatial/tests/test_dask_task_names.py +0 -154
  93. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/backend-parity.md +0 -0
  94. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/bench.md +0 -0
  95. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/dask-notebook.md +0 -0
  96. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/deep-sweep.md +0 -0
  97. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/efficiency-audit.md +0 -0
  98. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/new-issues.md +0 -0
  99. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/ready-to-merge.md +0 -0
  100. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/release-major.md +0 -0
  101. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/release-minor.md +0 -0
  102. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/release-patch.md +0 -0
  103. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/review-contributor-pr.md +0 -0
  104. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/review-pr.md +0 -0
  105. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/rockout.md +0 -0
  106. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/sweep-accuracy.md +0 -0
  107. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/sweep-api-consistency.md +0 -0
  108. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/sweep-metadata.md +0 -0
  109. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/sweep-performance.md +0 -0
  110. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/sweep-security.md +0 -0
  111. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/sweep-style.md +0 -0
  112. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/sweep-test-coverage.md +0 -0
  113. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/user-guide-notebook.md +0 -0
  114. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/commands/validate.md +0 -0
  115. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/sweep-accuracy-state.csv +0 -0
  116. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/sweep-api-consistency-state.csv +0 -0
  117. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/sweep-metadata-state.csv +0 -0
  118. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/sweep-performance-state.csv +0 -0
  119. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/sweep-security-state.csv +0 -0
  120. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/sweep-style-state.csv +0 -0
  121. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.claude/sweep-test-coverage-state.csv +0 -0
  122. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/backend-parity.md +0 -0
  123. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/bench.md +0 -0
  124. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/dask-notebook.md +0 -0
  125. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/deep-sweep.md +0 -0
  126. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/efficiency-audit.md +0 -0
  127. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/new-issues.md +0 -0
  128. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/ready-to-merge.md +0 -0
  129. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/release-major.md +0 -0
  130. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/release-minor.md +0 -0
  131. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/release-patch.md +0 -0
  132. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/review-contributor-pr.md +0 -0
  133. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/review-pr.md +0 -0
  134. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/rockout.md +0 -0
  135. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/sweep-accuracy.md +0 -0
  136. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/sweep-api-consistency.md +0 -0
  137. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/sweep-metadata.md +0 -0
  138. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/sweep-performance.md +0 -0
  139. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/sweep-security.md +0 -0
  140. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/sweep-style.md +0 -0
  141. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/sweep-test-coverage.md +0 -0
  142. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/user-guide-notebook.md +0 -0
  143. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/commands/validate.md +0 -0
  144. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/sweep-accuracy-state.csv +0 -0
  145. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/sweep-api-consistency-state.csv +0 -0
  146. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/sweep-metadata-state.csv +0 -0
  147. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/sweep-performance-state.csv +0 -0
  148. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/sweep-security-state.csv +0 -0
  149. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/sweep-style-state.csv +0 -0
  150. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.codex/sweep-test-coverage-state.csv +0 -0
  151. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/backend-parity.mdc +0 -0
  152. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/bench.mdc +0 -0
  153. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/dask-notebook.mdc +0 -0
  154. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/deep-sweep.mdc +0 -0
  155. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/efficiency-audit.mdc +0 -0
  156. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/new-issues.mdc +0 -0
  157. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/ready-to-merge.mdc +0 -0
  158. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/release-major.mdc +0 -0
  159. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/release-minor.mdc +0 -0
  160. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/release-patch.mdc +0 -0
  161. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/review-contributor-pr.mdc +0 -0
  162. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/review-pr.mdc +0 -0
  163. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/rockout.mdc +0 -0
  164. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/sweep-accuracy.mdc +0 -0
  165. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/sweep-api-consistency.mdc +0 -0
  166. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/sweep-metadata.mdc +0 -0
  167. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/sweep-performance.mdc +0 -0
  168. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/sweep-security.mdc +0 -0
  169. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/sweep-style.mdc +0 -0
  170. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/sweep-test-coverage.mdc +0 -0
  171. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/user-guide-notebook.mdc +0 -0
  172. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursor/rules/validate.mdc +0 -0
  173. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.cursorrules +0 -0
  174. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.efficiency-audit-baseline.json +0 -0
  175. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.efficiency-audit-baseline.prev.json +0 -0
  176. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.gitattributes +0 -0
  177. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  178. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/ISSUE_TEMPLATE/feature-proposal.md +0 -0
  179. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/ISSUE_TEMPLATE/new-contributor.md +0 -0
  180. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/labeler.yml +0 -0
  181. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/pull_request_template.md +0 -0
  182. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/workflows/benchmarks.yml +0 -0
  183. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/workflows/copilot-review.yml +0 -0
  184. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/workflows/docs.yml +0 -0
  185. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/workflows/labeler.yml +0 -0
  186. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/workflows/pypi-publish.yml +0 -0
  187. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/workflows/test-cog-validator.yml +0 -0
  188. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/workflows/test-geotiff-corpus.yml +0 -0
  189. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/workflows/test.yml +0 -0
  190. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.github/workflows/welcome-contributor.yml +0 -0
  191. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.gitignore +0 -0
  192. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/backend-parity.md +0 -0
  193. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/bench.md +0 -0
  194. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/dask-notebook.md +0 -0
  195. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/deep-sweep.md +0 -0
  196. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/efficiency-audit.md +0 -0
  197. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/new-issues.md +0 -0
  198. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/ready-to-merge.md +0 -0
  199. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/release-major.md +0 -0
  200. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/release-minor.md +0 -0
  201. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/release-patch.md +0 -0
  202. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/review-contributor-pr.md +0 -0
  203. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/review-pr.md +0 -0
  204. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/rockout.md +0 -0
  205. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/sweep-accuracy.md +0 -0
  206. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/sweep-api-consistency.md +0 -0
  207. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/sweep-metadata.md +0 -0
  208. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/sweep-performance.md +0 -0
  209. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/sweep-security.md +0 -0
  210. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/sweep-style.md +0 -0
  211. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/sweep-test-coverage.md +0 -0
  212. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/user-guide-notebook.md +0 -0
  213. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/command/validate.md +0 -0
  214. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/sweep-accuracy-state.csv +0 -0
  215. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/sweep-api-consistency-state.csv +0 -0
  216. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/sweep-metadata-state.csv +0 -0
  217. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/sweep-performance-state.csv +0 -0
  218. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/sweep-security-state.csv +0 -0
  219. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/sweep-style-state.csv +0 -0
  220. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.kilo/sweep-test-coverage-state.csv +0 -0
  221. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/.readthedocs.yml +0 -0
  222. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/AI_POLICY.md +0 -0
  223. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/CLAUDE.md +0 -0
  224. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/CODE_OF_CONDUCT.md +0 -0
  225. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/CONTRIBUTING.md +0 -0
  226. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/Citation-styles.md +0 -0
  227. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/LICENSE.txt +0 -0
  228. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/MANIFEST.in +0 -0
  229. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/README.md +0 -0
  230. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/RELEASE.md +0 -0
  231. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/codecov.yml +0 -0
  232. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/pyproject.toml +0 -0
  233. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/setup.cfg +0 -0
  234. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/setup.py +0 -0
  235. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xarray_spatial.egg-info/dependency_links.txt +0 -0
  236. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xarray_spatial.egg-info/entry_points.txt +0 -0
  237. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xarray_spatial.egg-info/not-zip-safe +0 -0
  238. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xarray_spatial.egg-info/requires.txt +0 -0
  239. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xarray_spatial.egg-info/top_level.txt +0 -0
  240. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/__init__.py +0 -0
  241. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/__main__.py +0 -0
  242. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/accessor.py +0 -0
  243. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/analytics.py +0 -0
  244. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/aspect.py +0 -0
  245. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/balanced_allocation.py +0 -0
  246. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/bilateral.py +0 -0
  247. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/bump.py +0 -0
  248. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/contour.py +0 -0
  249. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/convolution.py +0 -0
  250. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/corridor.py +0 -0
  251. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/curvature.py +0 -0
  252. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/dataset_support.py +0 -0
  253. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/datasets/__init__.py +0 -0
  254. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/datasets/sentinel-2/blue_band.nc +0 -0
  255. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/datasets/sentinel-2/green_band.nc +0 -0
  256. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/datasets/sentinel-2/nir_band.nc +0 -0
  257. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/datasets/sentinel-2/red_band.nc +0 -0
  258. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/datasets/sentinel-2/swir1_band.nc +0 -0
  259. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/datasets/sentinel-2/swir2_band.nc +0 -0
  260. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/diagnostics.py +0 -0
  261. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/edge_detection.py +0 -0
  262. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/erosion.py +0 -0
  263. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/experimental/__init__.py +0 -0
  264. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/experimental/min_observable_height.py +0 -0
  265. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geodesic.py +0 -0
  266. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/__init__.py +0 -0
  267. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_backends/__init__.py +0 -0
  268. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_backends/_gpu_helpers.py +0 -0
  269. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_backends/vrt.py +0 -0
  270. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_cog_http.py +0 -0
  271. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_compression.py +0 -0
  272. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_coords.py +0 -0
  273. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_crs.py +0 -0
  274. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_decode.py +0 -0
  275. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_dtypes.py +0 -0
  276. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_encode.py +0 -0
  277. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_errors.py +0 -0
  278. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_geotags.py +0 -0
  279. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_gpu_decode.py +0 -0
  280. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_header.py +0 -0
  281. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_layout.py +0 -0
  282. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_nodata.py +0 -0
  283. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_overview.py +0 -0
  284. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_overview_kernels.py +0 -0
  285. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_reader.py +0 -0
  286. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_runtime.py +0 -0
  287. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_safe_xml.py +0 -0
  288. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_sidecar.py +0 -0
  289. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_sources.py +0 -0
  290. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_vrt.py +0 -0
  291. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_vrt_validation.py +0 -0
  292. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_write_layout.py +0 -0
  293. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_writer.py +0 -0
  294. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_writers/__init__.py +0 -0
  295. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/_writers/vrt.py +0 -0
  296. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/__init__.py +0 -0
  297. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/_geotiff_fixtures.py +0 -0
  298. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/_helpers/__init__.py +0 -0
  299. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/_helpers/markers.py +0 -0
  300. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/_helpers/tiff_builders.py +0 -0
  301. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/_helpers/tiff_surgery.py +0 -0
  302. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/attrs/__init__.py +0 -0
  303. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/bench_vs_rioxarray.py +0 -0
  304. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/conftest.py +0 -0
  305. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/README.md +0 -0
  306. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/__init__.py +0 -0
  307. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/_marks.py +0 -0
  308. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/_oracle.py +0 -0
  309. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/cog_internal_overview_uint16.tif +0 -0
  310. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/compression_deflate_predictor2_uint16.tif +0 -0
  311. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/compression_deflate_predictor3_float32.tif +0 -0
  312. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/compression_jpeg_uint8_ycbcr.tif +0 -0
  313. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/compression_lerc_float32.tif +0 -0
  314. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/compression_lzw_predictor2_int16.tif +0 -0
  315. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/compression_none_uint8.tif +0 -0
  316. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/crs_citation_only.tif +0 -0
  317. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/crs_epsg_3857.tif +0 -0
  318. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/crs_wkt_utm10n.tif +0 -0
  319. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/dtype_float32.tif +0 -0
  320. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/dtype_float64.tif +0 -0
  321. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/dtype_int16.tif +0 -0
  322. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/dtype_int32.tif +0 -0
  323. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/dtype_int8.tif +0 -0
  324. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/dtype_uint16.tif +0 -0
  325. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/dtype_uint32.tif +0 -0
  326. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/dtype_uint8.tif +0 -0
  327. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/extra_tags_uint16.tif +0 -0
  328. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/gdal_metadata_namespaced_uint16.tif +0 -0
  329. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/nodata_int_sentinel_uint16.tif +0 -0
  330. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/nodata_miniswhite_uint8.tif +0 -0
  331. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/nodata_nan_float32.tif +0 -0
  332. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/overview_external_ovr_uint16.tif +0 -0
  333. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/overview_external_ovr_uint16.tif.ovr +0 -0
  334. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/overview_internal_uint16.tif +0 -0
  335. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/planar_separate_uint8_rgb.tif +0 -0
  336. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/sparse_tiled_uint16.tif +0 -0
  337. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/stripped_be_uint16.tif +0 -0
  338. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/stripped_le_uint16.tif +0 -0
  339. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/tiled_be_uint16.tif +0 -0
  340. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/fixtures/tiled_le_uint16.tif +0 -0
  341. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/generate.py +0 -0
  342. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/manifest.yaml +0 -0
  343. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_compression.py +0 -0
  344. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_corpus_determinism.py +0 -0
  345. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_dask_gpu.py +0 -0
  346. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_dask_numpy.py +0 -0
  347. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_dtype_variants.py +0 -0
  348. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_eager_numpy.py +0 -0
  349. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_fsspec.py +0 -0
  350. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_gpu.py +0 -0
  351. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_http.py +0 -0
  352. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_layout_endian.py +0 -0
  353. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_manifest.py +0 -0
  354. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_metadata_tags.py +0 -0
  355. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_nodata_sentinels.py +0 -0
  356. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_oracle.py +0 -0
  357. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_overview_cog.py +0 -0
  358. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/golden_corpus/test_vrt.py +0 -0
  359. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/gpu/__init__.py +0 -0
  360. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/gpu/test_codec.py +0 -0
  361. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/gpu/test_kernels_and_kwargs.py +0 -0
  362. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/gpu/test_reader.py +0 -0
  363. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/integration/__init__.py +0 -0
  364. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/integration/test_dask_pipeline.py +0 -0
  365. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/integration/test_gpu_pipeline.py +0 -0
  366. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/integration/test_http_sources.py +0 -0
  367. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/integration/test_sidecar.py +0 -0
  368. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/parity/__init__.py +0 -0
  369. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/parity/test_api_consolidation.py +0 -0
  370. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/parity/test_backend_matrix.py +0 -0
  371. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/parity/test_finalization.py +0 -0
  372. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/parity/test_pixel_equality.py +0 -0
  373. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/parity/test_reference.py +0 -0
  374. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/parity/test_signature_contract.py +0 -0
  375. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/__init__.py +0 -0
  376. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_basic.py +0 -0
  377. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_bbox_2555.py +0 -0
  378. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_bbox_vrt_2668.py +0 -0
  379. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_compression.py +0 -0
  380. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_coords.py +0 -0
  381. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_crs.py +0 -0
  382. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_degenerate_shapes.py +0 -0
  383. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_dtypes.py +0 -0
  384. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_endianness.py +0 -0
  385. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_georef.py +0 -0
  386. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_overview.py +0 -0
  387. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_streaming.py +0 -0
  388. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_tiling.py +0 -0
  389. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/read/test_unpack_noop_doc_3263.py +0 -0
  390. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/release_gates/__init__.py +0 -0
  391. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/release_gates/test_stable_features.py +0 -0
  392. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/test_edge_cases.py +0 -0
  393. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/test_fuzz_hypothesis.py +0 -0
  394. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/test_polish.py +0 -0
  395. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/test_round_trip.py +0 -0
  396. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/test_security.py +0 -0
  397. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/test_shutdown_cleanup_2486.py +0 -0
  398. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/test_stable_only_bbox_ordering_2869.py +0 -0
  399. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/test_stable_only_remote_2821.py +0 -0
  400. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/__init__.py +0 -0
  401. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_codec_roundtrip.py +0 -0
  402. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_compression.py +0 -0
  403. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_exception_exports_3265.py +0 -0
  404. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_geotags.py +0 -0
  405. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_header.py +0 -0
  406. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_ifd.py +0 -0
  407. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_input_validation.py +0 -0
  408. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_metadata.py +0 -0
  409. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_photometric.py +0 -0
  410. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/unit/test_predictor.py +0 -0
  411. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/vrt/__init__.py +0 -0
  412. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/vrt/test_dtype_conversion.py +0 -0
  413. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/vrt/test_missing_sources.py +0 -0
  414. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/vrt/test_non_georef_placement_3116.py +0 -0
  415. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/vrt/test_parity.py +0 -0
  416. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/vrt/test_source_opt_ins_2672.py +0 -0
  417. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/vrt/test_validation.py +0 -0
  418. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/vrt/test_window.py +0 -0
  419. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/__init__.py +0 -0
  420. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_bigtiff.py +0 -0
  421. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_cog.py +0 -0
  422. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_crs.py +0 -0
  423. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_nodata.py +0 -0
  424. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_overview.py +0 -0
  425. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_pack_64bit_sentinel_3264.py +0 -0
  426. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_streaming.py +0 -0
  427. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/geotiff/tests/write/test_vrt_atomic.py +0 -0
  428. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/gpu_rtx/__init__.py +0 -0
  429. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/gpu_rtx/_memory.py +0 -0
  430. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/gpu_rtx/cuda_utils.py +0 -0
  431. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/gpu_rtx/hillshade.py +0 -0
  432. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/gpu_rtx/mesh_utils.py +0 -0
  433. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/gpu_rtx/viewshed.py +0 -0
  434. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hillshade.py +0 -0
  435. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/__init__.py +0 -0
  436. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/_boundary_store.py +0 -0
  437. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_direction_mfd.py +0 -0
  438. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_length_dinf.py +0 -0
  439. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/flow_length_mfd.py +0 -0
  440. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/__init__.py +0 -0
  441. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/conftest.py +0 -0
  442. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_basin_d8.py +0 -0
  443. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_fill_d8.py +0 -0
  444. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_accumulation_d8.py +0 -0
  445. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_accumulation_dinf.py +0 -0
  446. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_accumulation_mfd.py +0 -0
  447. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_direction_d8.py +0 -0
  448. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_direction_dinf.py +0 -0
  449. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_direction_mfd.py +0 -0
  450. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_length_d8.py +0 -0
  451. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_length_dinf.py +0 -0
  452. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_length_mfd.py +0 -0
  453. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_path_d8.py +0 -0
  454. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_path_dinf.py +0 -0
  455. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_flow_path_mfd.py +0 -0
  456. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_hand_d8.py +0 -0
  457. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_hand_dinf.py +0 -0
  458. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_hand_mfd.py +0 -0
  459. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_sink_d8.py +0 -0
  460. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_snap_pour_point_d8.py +0 -0
  461. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_stream_link_d8.py +0 -0
  462. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_stream_link_dinf.py +0 -0
  463. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_stream_link_mfd.py +0 -0
  464. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_stream_order_d8.py +0 -0
  465. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_stream_order_dinf.py +0 -0
  466. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_stream_order_mfd.py +0 -0
  467. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_twi_d8.py +0 -0
  468. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_validate_cellsize.py +0 -0
  469. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_validate_mfd_companion_shape.py +0 -0
  470. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_validate_mfd_fractions.py +0 -0
  471. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_validate_scalar_params.py +0 -0
  472. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_validate_secondary_args.py +0 -0
  473. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_watershed_d8.py +0 -0
  474. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_watershed_dinf.py +0 -0
  475. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/tests/test_watershed_mfd.py +0 -0
  476. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/hydro/twi_d8.py +0 -0
  477. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/interpolate/__init__.py +0 -0
  478. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/interpolate/_validation.py +0 -0
  479. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/kde.py +0 -0
  480. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/mcda/__init__.py +0 -0
  481. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/mcda/constrain.py +0 -0
  482. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/mcda/weights.py +0 -0
  483. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/normalize.py +0 -0
  484. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/pathfinding.py +0 -0
  485. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/polygonize.py +0 -0
  486. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/preview.py +0 -0
  487. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/_crs_utils.py +0 -0
  488. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/_grid.py +0 -0
  489. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/_interpolate.py +0 -0
  490. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/_lite_crs.py +0 -0
  491. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/_merge.py +0 -0
  492. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/_projections_cuda.py +0 -0
  493. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/_transform.py +0 -0
  494. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/reproject/grids/us_nga_egm96_15.tif +0 -0
  495. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/sieve.py +0 -0
  496. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/slope.py +0 -0
  497. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/surface_distance.py +0 -0
  498. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/terrain.py +0 -0
  499. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/__init__.py +0 -0
  500. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/bench_reproject_vs_rioxarray.py +0 -0
  501. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/conftest.py +0 -0
  502. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/general_checks.py +0 -0
  503. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_accessor.py +0 -0
  504. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_analytics.py +0 -0
  505. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_aspect.py +0 -0
  506. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_balanced_allocation.py +0 -0
  507. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_bilateral.py +0 -0
  508. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_bump.py +0 -0
  509. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_classify.py +0 -0
  510. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_contour.py +0 -0
  511. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_convolution.py +0 -0
  512. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_corridor.py +0 -0
  513. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_cost_distance.py +0 -0
  514. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_curvature.py +0 -0
  515. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_dask_cupy_gaps.py +0 -0
  516. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_dask_laziness.py +0 -0
  517. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_dasymetric.py +0 -0
  518. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_dataset_support.py +0 -0
  519. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_datasets.py +0 -0
  520. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_diagnostics.py +0 -0
  521. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_diffusion.py +0 -0
  522. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_edge_detection.py +0 -0
  523. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_emerging_hotspots.py +0 -0
  524. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_erosion.py +0 -0
  525. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_fire.py +0 -0
  526. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_flood.py +0 -0
  527. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_fused_overlap.py +0 -0
  528. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_geodesic_aspect.py +0 -0
  529. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_geodesic_slope.py +0 -0
  530. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_glcm.py +0 -0
  531. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_glcm_metric_order.py +0 -0
  532. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_gpu_rtx_has_rtx.py +0 -0
  533. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_gpu_rtx_memory.py +0 -0
  534. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_gpu_rtx_mesh.py +0 -0
  535. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_hillshade.py +0 -0
  536. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_hypsometric_integral.py +0 -0
  537. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_interpolation.py +0 -0
  538. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_kde.py +0 -0
  539. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_lite_crs.py +0 -0
  540. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_mahalanobis.py +0 -0
  541. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_mcda.py +0 -0
  542. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_min_observable_height.py +0 -0
  543. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_morphology.py +0 -0
  544. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_morphology_derived.py +0 -0
  545. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_multi_overlap.py +0 -0
  546. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_multispectral.py +0 -0
  547. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_normalize.py +0 -0
  548. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_northness_eastness.py +0 -0
  549. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_open_geotiff_coregister.py +0 -0
  550. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_open_geotiff_resampling.py +0 -0
  551. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_optional_shapely.py +0 -0
  552. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_pathfinding.py +0 -0
  553. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_perlin.py +0 -0
  554. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygon_clip.py +0 -0
  555. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize.py +0 -0
  556. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_atol_rtol_backend_coverage_2026_05_27.py +0 -0
  557. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_coverage_2026_05_19.py +0 -0
  558. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_dask_row_batch_2608.py +0 -0
  559. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_issue_2172.py +0 -0
  560. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_issue_2583.py +0 -0
  561. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_issue_2606.py +0 -0
  562. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_issue_2666.py +0 -0
  563. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_issue_2677.py +0 -0
  564. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_issue_3292.py +0 -0
  565. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_issue_3303.py +0 -0
  566. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_mask_chunk_mismatch_3299.py +0 -0
  567. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_polygonize_mask_dtype_coverage_2026_05_29.py +0 -0
  568. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_preview.py +0 -0
  569. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_proximity.py +0 -0
  570. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize.py +0 -0
  571. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_accuracy.py +0 -0
  572. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_all_touched_supercover_2169.py +0 -0
  573. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_alloc_3107.py +0 -0
  574. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_coverage_2026_05_17.py +0 -0
  575. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_coverage_2026_05_21.py +0 -0
  576. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_coverage_2026_05_27.py +0 -0
  577. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_coverage_2026_05_29.py +0 -0
  578. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_crs_mismatch_3058.py +0 -0
  579. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_descending_x_2568.py +0 -0
  580. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_dtype_annot_3291.py +0 -0
  581. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_fill_dtype_3054.py +0 -0
  582. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_geom_crs_3087.py +0 -0
  583. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_gpu_alias_3089.py +0 -0
  584. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_gpu_callable_warn_3057.py +0 -0
  585. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_gpu_race_2167.py +0 -0
  586. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_int_precision_3056.py +0 -0
  587. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_linearring_3055.py +0 -0
  588. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_merge_dedup_3304.py +0 -0
  589. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_mixed_type_ordered_merge_3296.py +0 -0
  590. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_nan_int_fill_2504.py +0 -0
  591. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_nan_propagation_2255.py +0 -0
  592. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_nonfinite_burn_3085.py +0 -0
  593. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_nonfinite_burn_3088.py +0 -0
  594. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_nonfinite_coords_3295.py +0 -0
  595. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_partial_dims_2569.py +0 -0
  596. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_props_hoist_2506.py +0 -0
  597. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_resolution_exact_2573.py +0 -0
  598. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_resolution_validation_2576.py +0 -0
  599. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_signature_annot_2250.py +0 -0
  600. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_signed_step_2566.py +0 -0
  601. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rasterize_tile_props_slice_2020.py +0 -0
  602. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_rechunk_no_shuffle.py +0 -0
  603. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_reproject.py +0 -0
  604. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_reproject_coverage_2026_05_27.py +0 -0
  605. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_reproject_cupy_gate_2564.py +0 -0
  606. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_reproject_inverse_kernels_3274.py +0 -0
  607. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_reproject_itrf_scale_3276.py +0 -0
  608. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_reproject_pyproj_warning_3242.py +0 -0
  609. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_reproject_sphere_ellipsoid_guard_3275.py +0 -0
  610. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_resample.py +0 -0
  611. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_resample_coverage_2026_05_27.py +0 -0
  612. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_resample_cupy_agg_fallback_2615.py +0 -0
  613. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_resample_input_validation_2574.py +0 -0
  614. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_resample_irregular_coords_2663.py +0 -0
  615. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_resample_nodata_dask_parity_3073.py +0 -0
  616. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_resample_signature_annot_2544.py +0 -0
  617. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_sieve.py +0 -0
  618. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_sieve_gdal_parity.py +0 -0
  619. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_sky_view_factor.py +0 -0
  620. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_slope.py +0 -0
  621. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_surface_distance.py +0 -0
  622. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_sweep_state_csv_merge_2754.py +0 -0
  623. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_terrain.py +0 -0
  624. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_terrain_metrics.py +0 -0
  625. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_utils.py +0 -0
  626. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_validation.py +0 -0
  627. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_viewshed.py +0 -0
  628. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_visibility.py +0 -0
  629. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_zonal.py +0 -0
  630. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/tests/test_zonal_backend_coverage_2026_05_27.py +0 -0
  631. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/utils.py +0 -0
  632. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/viewshed.py +0 -0
  633. {xarray_spatial-0.10.7 → xarray_spatial-0.10.8}/xrspatial/visibility.py +0 -0
@@ -2,6 +2,20 @@
2
2
  -----------
3
3
 
4
4
 
5
+ ### Version 0.10.8 - 2026-06-14
6
+
7
+ #### Bug fixes and improvements
8
+ - geotiff: gate dict gdal_metadata behind the experimental rich-tag opt-in (#3327)
9
+ - name dask tasks for remaining xrspatial tool modules (#3326)
10
+ - geotiff: don't flip masked_nodata True on a caller dtype= cast of an unmasked buffer (#3325)
11
+ - to_geotiff: type-check compression_level (#3324)
12
+ - rasterize: burn all_touched lines with the supercover walk (#3322)
13
+ - focal: handle empty rasters consistently across backends (#3319)
14
+ - reproject: promote large-output in-memory cupy inputs to dask (#3318)
15
+ - reproject: serialize all parallel=True kernel launches behind one lock (#3317)
16
+ - docs: add an examples-and-data getting-started page and landing index (#3316)
17
+
18
+
5
19
  ### Version 0.10.7 - 2026-06-13
6
20
 
7
21
  #### New features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xarray-spatial
3
- Version: 0.10.7
3
+ Version: 0.10.8
4
4
  Summary: xarray-based spatial analysis tools
5
5
  Home-page: https://github.com/xarray-contrib/xarray-spatial
6
6
  Author: Xarray-Spatial Developers
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: xarray-spatial
3
- Version: 0.10.7
3
+ Version: 0.10.8
4
4
  Summary: xarray-based spatial analysis tools
5
5
  Home-page: https://github.com/xarray-contrib/xarray-spatial
6
6
  Author: Xarray-Spatial Developers
@@ -582,6 +582,7 @@ xrspatial/tests/test_rasterize_gpu_callable_warn_3057.py
582
582
  xrspatial/tests/test_rasterize_gpu_race_2167.py
583
583
  xrspatial/tests/test_rasterize_int_precision_3056.py
584
584
  xrspatial/tests/test_rasterize_linearring_3055.py
585
+ xrspatial/tests/test_rasterize_lines_all_touched_3102.py
585
586
  xrspatial/tests/test_rasterize_merge_dedup_3304.py
586
587
  xrspatial/tests/test_rasterize_mixed_type_ordered_merge_3296.py
587
588
  xrspatial/tests/test_rasterize_nan_int_fill_2504.py
@@ -600,8 +601,10 @@ xrspatial/tests/test_rechunk_no_shuffle.py
600
601
  xrspatial/tests/test_reproject.py
601
602
  xrspatial/tests/test_reproject_coverage_2026_05_27.py
602
603
  xrspatial/tests/test_reproject_cupy_gate_2564.py
604
+ xrspatial/tests/test_reproject_cupy_promotion_3281.py
603
605
  xrspatial/tests/test_reproject_inverse_kernels_3274.py
604
606
  xrspatial/tests/test_reproject_itrf_scale_3276.py
607
+ xrspatial/tests/test_reproject_parallel_kernels_3141.py
605
608
  xrspatial/tests/test_reproject_pyproj_warning_3242.py
606
609
  xrspatial/tests/test_reproject_sphere_ellipsoid_guard_3275.py
607
610
  xrspatial/tests/test_reproject_streaming_3101.py
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.10.7'
22
- __version_tuple__ = version_tuple = (0, 10, 7)
21
+ __version__ = version = '0.10.8'
22
+ __version_tuple__ = version_tuple = (0, 10, 8)
23
23
 
24
- __commit_id__ = commit_id = 'g9c1a81aac'
24
+ __commit_id__ = commit_id = 'ge2c258bf7'
@@ -26,6 +26,7 @@ import numpy as np
26
26
 
27
27
  from xrspatial.utils import (
28
28
  ArrayTypeFunctionMapping,
29
+ _dask_task_name_kwargs,
29
30
  _validate_raster,
30
31
  _validate_scalar,
31
32
  cuda_args,
@@ -74,7 +75,7 @@ def _run_numpy_binary(data, values):
74
75
 
75
76
  def _run_dask_numpy_binary(data, values):
76
77
  _func = partial(_run_numpy_binary, values=values)
77
- out = data.map_blocks(_func)
78
+ out = data.map_blocks(_func, **_dask_task_name_kwargs('xrspatial.binary'))
78
79
  return out
79
80
 
80
81
 
@@ -104,7 +105,8 @@ def _run_cupy_binary(data, values):
104
105
 
105
106
 
106
107
  def _run_dask_cupy_binary(data, values_cupy):
107
- out = data.map_blocks(lambda da: _run_cupy_binary(da, values_cupy), meta=cupy.array(()))
108
+ out = data.map_blocks(lambda da: _run_cupy_binary(da, values_cupy), meta=cupy.array(()),
109
+ **_dask_task_name_kwargs('xrspatial.binary'))
108
110
  return out
109
111
 
110
112
 
@@ -224,7 +226,7 @@ def _run_dask_numpy_bin(data, bins, new_values):
224
226
  bins=bins,
225
227
  new_values=new_values)
226
228
 
227
- out = data.map_blocks(_func)
229
+ out = data.map_blocks(_func, **_dask_task_name_kwargs('xrspatial.reclassify'))
228
230
  return out
229
231
 
230
232
 
@@ -281,7 +283,8 @@ def _run_cupy_bin(data, bins, new_values):
281
283
  def _run_dask_cupy_bin(data, bins_cupy, new_values_cupy):
282
284
  out = data.map_blocks(lambda da:
283
285
  _run_cupy_bin(da, bins_cupy, new_values_cupy),
284
- meta=cupy.array(()))
286
+ meta=cupy.array(()),
287
+ **_dask_task_name_kwargs('xrspatial.reclassify'))
285
288
  return out
286
289
 
287
290
 
@@ -49,6 +49,7 @@ except ImportError:
49
49
  ndarray = False
50
50
 
51
51
  from xrspatial.utils import (
52
+ _dask_task_name_kwargs,
52
53
  _validate_raster,
53
54
  cuda_args, get_dataarray_resolution, ngjit,
54
55
  has_cuda_and_cupy, is_cupy_array, is_dask_cupy,
@@ -506,6 +507,7 @@ def _cost_distance_dask_cupy(source_da, friction_da,
506
507
  boundary=np.nan,
507
508
  dtype=np.float32,
508
509
  meta=cp.array((), dtype=cp.float32),
510
+ **_dask_task_name_kwargs('xrspatial.cost_distance'),
509
511
  )
510
512
 
511
513
  # Unbounded or padding too large: convert to dask+numpy, use CPU path
@@ -1187,6 +1189,7 @@ def _cost_distance_dask(source_da, friction_da, cellsize_x, cellsize_y,
1187
1189
  boundary=np.nan,
1188
1190
  dtype=np.float32,
1189
1191
  meta=np.array((), dtype=np.float32),
1192
+ **_dask_task_name_kwargs('xrspatial.cost_distance'),
1190
1193
  )
1191
1194
  return out
1192
1195
 
@@ -52,6 +52,7 @@ except ImportError:
52
52
 
53
53
  from xrspatial.utils import (
54
54
  ArrayTypeFunctionMapping,
55
+ _dask_task_name_kwargs,
55
56
  has_cuda_and_cupy,
56
57
  has_dask_array,
57
58
  is_cupy_array,
@@ -293,6 +294,7 @@ def _disaggregate_dask_numpy(zones_da, weight_da, values_dict, method,
293
294
  method=method,
294
295
  nodata_zone=nodata_zone,
295
296
  dtype=np.float64,
297
+ **_dask_task_name_kwargs('xrspatial.disaggregate'),
296
298
  )
297
299
  return result
298
300
 
@@ -33,6 +33,7 @@ except ImportError:
33
33
  from xrspatial.utils import (
34
34
  ArrayTypeFunctionMapping,
35
35
  _boundary_to_dask,
36
+ _dask_task_name_kwargs,
36
37
  _pad_array,
37
38
  _validate_boundary,
38
39
  _validate_raster,
@@ -267,6 +268,7 @@ def _diffuse_dask_numpy(data, alpha, steps, dt_over_dx2, boundary):
267
268
  depth=(1, 1),
268
269
  boundary=_boundary_to_dask(boundary),
269
270
  meta=np.array(()),
271
+ **_dask_task_name_kwargs('xrspatial.diffuse'),
270
272
  )
271
273
  else:
272
274
  # Pass alpha as a second dask argument to map_overlap
@@ -278,6 +280,7 @@ def _diffuse_dask_numpy(data, alpha, steps, dt_over_dx2, boundary):
278
280
  meta=np.array(()),
279
281
  steps=1,
280
282
  dt_over_dx2=dt_over_dx2,
283
+ **_dask_task_name_kwargs('xrspatial.diffuse'),
281
284
  )
282
285
  return u
283
286
 
@@ -318,6 +321,7 @@ def _diffuse_dask_cupy(data, alpha, steps, dt_over_dx2, boundary):
318
321
  depth=(1, 1),
319
322
  boundary=_boundary_to_dask(boundary, is_cupy=True),
320
323
  meta=cp.array(()),
324
+ **_dask_task_name_kwargs('xrspatial.diffuse'),
321
325
  )
322
326
  else:
323
327
  u = da.map_overlap(
@@ -327,6 +331,7 @@ def _diffuse_dask_cupy(data, alpha, steps, dt_over_dx2, boundary):
327
331
  boundary=_boundary_to_dask(boundary, is_cupy=True),
328
332
  meta=cp.array(()),
329
333
  dt_over_dx2=dt_over_dx2,
334
+ **_dask_task_name_kwargs('xrspatial.diffuse'),
330
335
  )
331
336
  return u
332
337
 
@@ -30,6 +30,7 @@ from xrspatial.focal import (
30
30
  )
31
31
  from xrspatial.utils import (
32
32
  ArrayTypeFunctionMapping,
33
+ _dask_task_name_kwargs,
33
34
  _validate_boundary,
34
35
  ngjit,
35
36
  not_implemented_func,
@@ -608,6 +609,7 @@ def _emerging_hotspots_dask_numpy(raster, kernel, boundary='nan'):
608
609
  gi_zscore,
609
610
  dtype=np.int8,
610
611
  meta=np.array((), dtype=np.int8),
612
+ **_dask_task_name_kwargs('xrspatial.emerging_hotspots.gi_bin'),
611
613
  )
612
614
 
613
615
  # Pass 3: Mann-Kendall + classification via map_blocks
@@ -620,6 +622,7 @@ def _emerging_hotspots_dask_numpy(raster, kernel, boundary='nan'):
620
622
  drop_axis=0,
621
623
  new_axis=0,
622
624
  meta=np.array((), dtype=np.float32),
625
+ **_dask_task_name_kwargs('xrspatial.emerging_hotspots.mk_classify'),
623
626
  )
624
627
 
625
628
  return gi_zscore, gi_bin, mk_result
@@ -690,6 +693,7 @@ def _emerging_hotspots_dask_cupy(raster, kernel, boundary='nan'):
690
693
  gi_zscore,
691
694
  dtype=np.int8,
692
695
  meta=cupy.array((), dtype=cupy.int8),
696
+ **_dask_task_name_kwargs('xrspatial.emerging_hotspots.gi_bin'),
693
697
  )
694
698
 
695
699
  # Pass 3: Mann-Kendall + classification via map_blocks
@@ -701,6 +705,7 @@ def _emerging_hotspots_dask_cupy(raster, kernel, boundary='nan'):
701
705
  drop_axis=0,
702
706
  new_axis=0,
703
707
  meta=cupy.array((), dtype=cupy.float32),
708
+ **_dask_task_name_kwargs('xrspatial.emerging_hotspots.mk_classify'),
704
709
  )
705
710
 
706
711
  return gi_zscore, gi_bin, mk_result
@@ -26,6 +26,7 @@ from numba import cuda
26
26
  from xrspatial.dataset_support import supports_dataset
27
27
  from xrspatial.utils import (
28
28
  ArrayTypeFunctionMapping,
29
+ _dask_task_name_kwargs,
29
30
  _validate_raster,
30
31
  _validate_scalar,
31
32
  cuda_args,
@@ -165,7 +166,8 @@ def _dnbr_gpu(pre_data, post_data, out):
165
166
 
166
167
 
167
168
  def _dnbr_dask(pre_data, post_data):
168
- return da.map_blocks(_dnbr_cpu, pre_data, post_data, meta=np.array(()))
169
+ return da.map_blocks(_dnbr_cpu, pre_data, post_data, meta=np.array(()),
170
+ **_dask_task_name_kwargs('xrspatial.dnbr'))
169
171
 
170
172
 
171
173
  def _dnbr_cupy(pre_data, post_data):
@@ -178,7 +180,8 @@ def _dnbr_cupy(pre_data, post_data):
178
180
 
179
181
  def _dnbr_dask_cupy(pre_data, post_data):
180
182
  return da.map_blocks(_dnbr_cupy, pre_data, post_data,
181
- dtype=cupy.float32, meta=cupy.array(()))
183
+ dtype=cupy.float32, meta=cupy.array(()),
184
+ **_dask_task_name_kwargs('xrspatial.dnbr'))
182
185
 
183
186
 
184
187
  def dnbr(pre_nbr_agg: xr.DataArray,
@@ -256,7 +259,8 @@ def _rdnbr_gpu(dnbr_data, pre_data, out):
256
259
 
257
260
 
258
261
  def _rdnbr_dask(dnbr_data, pre_data):
259
- return da.map_blocks(_rdnbr_cpu, dnbr_data, pre_data, meta=np.array(()))
262
+ return da.map_blocks(_rdnbr_cpu, dnbr_data, pre_data, meta=np.array(()),
263
+ **_dask_task_name_kwargs('xrspatial.rdnbr'))
260
264
 
261
265
 
262
266
  def _rdnbr_cupy(dnbr_data, pre_data):
@@ -269,7 +273,8 @@ def _rdnbr_cupy(dnbr_data, pre_data):
269
273
 
270
274
  def _rdnbr_dask_cupy(dnbr_data, pre_data):
271
275
  return da.map_blocks(_rdnbr_cupy, dnbr_data, pre_data,
272
- dtype=cupy.float32, meta=cupy.array(()))
276
+ dtype=cupy.float32, meta=cupy.array(()),
277
+ **_dask_task_name_kwargs('xrspatial.rdnbr'))
273
278
 
274
279
 
275
280
  def rdnbr(dnbr_agg: xr.DataArray,
@@ -382,7 +387,8 @@ def _bsc_gpu(data, out):
382
387
 
383
388
 
384
389
  def _bsc_dask(data):
385
- return da.map_blocks(_bsc_cpu, data, dtype=np.int8, meta=np.array(()))
390
+ return da.map_blocks(_bsc_cpu, data, dtype=np.int8, meta=np.array(()),
391
+ **_dask_task_name_kwargs('xrspatial.burn_severity_class'))
386
392
 
387
393
 
388
394
  def _bsc_cupy(data):
@@ -394,7 +400,8 @@ def _bsc_cupy(data):
394
400
 
395
401
  def _bsc_dask_cupy(data):
396
402
  return da.map_blocks(_bsc_cupy, data,
397
- dtype=np.int8, meta=cupy.array(()))
403
+ dtype=np.int8, meta=cupy.array(()),
404
+ **_dask_task_name_kwargs('xrspatial.burn_severity_class'))
398
405
 
399
406
 
400
407
  @supports_dataset
@@ -464,7 +471,8 @@ def _fli_gpu(fuel_data, spread_data, heat_content, out):
464
471
 
465
472
  def _fli_dask(fuel_data, spread_data, heat_content):
466
473
  return da.map_blocks(_fli_cpu, fuel_data, spread_data, heat_content,
467
- meta=np.array(()))
474
+ meta=np.array(()),
475
+ **_dask_task_name_kwargs('xrspatial.fireline_intensity'))
468
476
 
469
477
 
470
478
  def _fli_cupy(fuel_data, spread_data, heat_content):
@@ -477,7 +485,8 @@ def _fli_cupy(fuel_data, spread_data, heat_content):
477
485
 
478
486
  def _fli_dask_cupy(fuel_data, spread_data, heat_content):
479
487
  return da.map_blocks(_fli_cupy, fuel_data, spread_data, heat_content,
480
- dtype=cupy.float32, meta=cupy.array(()))
488
+ dtype=cupy.float32, meta=cupy.array(()),
489
+ **_dask_task_name_kwargs('xrspatial.fireline_intensity'))
481
490
 
482
491
 
483
492
  def fireline_intensity(fuel_consumed_agg: xr.DataArray,
@@ -562,7 +571,8 @@ def _fl_gpu(intensity_data, out):
562
571
 
563
572
 
564
573
  def _fl_dask(intensity_data):
565
- return da.map_blocks(_fl_cpu, intensity_data, meta=np.array(()))
574
+ return da.map_blocks(_fl_cpu, intensity_data, meta=np.array(()),
575
+ **_dask_task_name_kwargs('xrspatial.flame_length'))
566
576
 
567
577
 
568
578
  def _fl_cupy(intensity_data):
@@ -575,7 +585,8 @@ def _fl_cupy(intensity_data):
575
585
 
576
586
  def _fl_dask_cupy(intensity_data):
577
587
  return da.map_blocks(_fl_cupy, intensity_data,
578
- dtype=cupy.float32, meta=cupy.array(()))
588
+ dtype=cupy.float32, meta=cupy.array(()),
589
+ **_dask_task_name_kwargs('xrspatial.flame_length'))
579
590
 
580
591
 
581
592
  @supports_dataset
@@ -733,6 +744,7 @@ def _ros_dask(slope_data, wind_data, moisture_data,
733
744
  w_0, h, M_x, beta, rho_b, Gamma, eta_s, xi, epsilon,
734
745
  C_w, B_w, E_w,
735
746
  meta=np.array(()),
747
+ **_dask_task_name_kwargs('xrspatial.rate_of_spread'),
736
748
  )
737
749
 
738
750
 
@@ -758,6 +770,7 @@ def _ros_dask_cupy(slope_data, wind_data, moisture_data,
758
770
  w_0, h, M_x, beta, rho_b, Gamma, eta_s, xi, epsilon,
759
771
  C_w, B_w, E_w,
760
772
  dtype=cupy.float32, meta=cupy.array(()),
773
+ **_dask_task_name_kwargs('xrspatial.rate_of_spread'),
761
774
  )
762
775
 
763
776
 
@@ -907,6 +920,7 @@ def _kbdi_dask(kbdi_prev_data, max_temp_data, precip_data, annual_precip):
907
920
  return da.map_blocks(
908
921
  _kbdi_cpu, kbdi_prev_data, max_temp_data, precip_data, annual_precip,
909
922
  meta=np.array(()),
923
+ **_dask_task_name_kwargs('xrspatial.kbdi'),
910
924
  )
911
925
 
912
926
 
@@ -926,6 +940,7 @@ def _kbdi_dask_cupy(kbdi_prev_data, max_temp_data, precip_data,
926
940
  _kbdi_cupy, kbdi_prev_data, max_temp_data, precip_data,
927
941
  annual_precip,
928
942
  dtype=cupy.float32, meta=cupy.array(()),
943
+ **_dask_task_name_kwargs('xrspatial.kbdi'),
929
944
  )
930
945
 
931
946
 
@@ -29,6 +29,7 @@ except ImportError:
29
29
  da = None
30
30
 
31
31
  from xrspatial.utils import (
32
+ _dask_task_name_kwargs,
32
33
  _validate_raster,
33
34
  has_cuda_and_cupy,
34
35
  is_cupy_array,
@@ -627,6 +628,7 @@ def _veg_roughness_nlcd_dask(data, lut):
627
628
  return _da.map_blocks(
628
629
  _apply_lut, data, dtype=np.float64,
629
630
  meta=np.array((), dtype=np.float64),
631
+ **_dask_task_name_kwargs('xrspatial.vegetation_roughness_nlcd'),
630
632
  )
631
633
 
632
634
 
@@ -669,6 +671,7 @@ def _veg_roughness_ndvi_dask(data):
669
671
  return _da.map_blocks(
670
672
  _apply, data, dtype=np.float64,
671
673
  meta=np.array((), dtype=np.float64),
674
+ **_dask_task_name_kwargs('xrspatial.vegetation_roughness_ndvi'),
672
675
  )
673
676
 
674
677
 
@@ -795,6 +798,7 @@ def _veg_cn_dask(lc, sg, lut):
795
798
  return _da.map_blocks(
796
799
  _apply, lc, sg, dtype=np.float64,
797
800
  meta=np.array((), dtype=np.float64),
801
+ **_dask_task_name_kwargs('xrspatial.vegetation_curve_number'),
798
802
  )
799
803
 
800
804
 
@@ -28,9 +28,22 @@ except ImportError:
28
28
  from xrspatial.convolution import (_available_memory_bytes, _promote_float, convolve_2d,
29
29
  custom_kernel)
30
30
  from xrspatial.dataset_support import supports_dataset
31
- from xrspatial.utils import (ArrayTypeFunctionMapping, _boundary_to_dask, _pad_array,
32
- _validate_boundary, _validate_raster, _validate_scalar, cuda_args,
33
- is_cupy_array, is_dask_cupy, ngjit)
31
+ from xrspatial.utils import (ArrayTypeFunctionMapping, _boundary_to_dask, _dask_task_name_kwargs,
32
+ _pad_array, _validate_boundary, _validate_raster, _validate_scalar,
33
+ cuda_args, is_cupy_array, is_dask_cupy, ngjit)
34
+
35
+
36
+ def _is_empty_raster(agg):
37
+ """True if *agg* has a degenerate spatial axis (0 rows or 0 cols).
38
+
39
+ An empty raster has no cells to filter, but the GPU and dask paths
40
+ crash on it rather than no-op: ``cuda_args`` hands ``cuLaunchKernel``
41
+ a zero-sized grid, and ``map_overlap`` rejects a depth that exceeds
42
+ the (zero-length) axis. The numpy path already returns an empty
43
+ result with the input shape preserved, so the focal APIs short
44
+ circuit empty input to match it on every backend (issue #3225).
45
+ """
46
+ return agg.shape[-2] == 0 or agg.shape[-1] == 0
34
47
 
35
48
 
36
49
  def _validate_binary_kernel(kernel, func_name):
@@ -210,7 +223,8 @@ def _mean_dask_numpy(data, excludes, boundary='nan'):
210
223
  out = data.map_overlap(_func,
211
224
  depth=(1, 1),
212
225
  boundary=_boundary_to_dask(boundary),
213
- meta=np.array((), dtype=data.dtype))
226
+ meta=np.array((), dtype=data.dtype),
227
+ **_dask_task_name_kwargs('xrspatial.mean'))
214
228
  return out
215
229
 
216
230
 
@@ -220,7 +234,8 @@ def _mean_dask_cupy(data, excludes, boundary='nan'):
220
234
  out = data.map_overlap(_func,
221
235
  depth=(1, 1),
222
236
  boundary=_boundary_to_dask(boundary, is_cupy=True),
223
- meta=cupy.array((), dtype=data.dtype))
237
+ meta=cupy.array((), dtype=data.dtype),
238
+ **_dask_task_name_kwargs('xrspatial.mean'))
224
239
  return out
225
240
 
226
241
 
@@ -441,6 +456,16 @@ def mean(agg, passes=1, excludes=None, name='mean', boundary='nan'):
441
456
  return _apply_per_band(mean, agg, passes=passes, excludes=excludes,
442
457
  name=name, boundary=boundary)
443
458
 
459
+ if _is_empty_raster(agg):
460
+ # No cells to filter; return an empty result of the input shape
461
+ # and dtype contract, matching the numpy path on every backend
462
+ # (issue #3225).
463
+ return DataArray(agg.data.astype(_promote_float(agg.dtype)),
464
+ name=name,
465
+ dims=agg.dims,
466
+ coords=agg.coords,
467
+ attrs=agg.attrs)
468
+
444
469
  # Preserve the input float dtype, promoting ints to float32 -- the same
445
470
  # contract as apply() / focal_stats() (#2769) and convolve_2d() (#1096).
446
471
  # Cast excludes to the working dtype so value matching behaves the same
@@ -565,7 +590,8 @@ def _apply_dask_numpy(data, kernel, func, boundary='nan'):
565
590
  out = data.map_overlap(_func,
566
591
  depth=(pad_h, pad_w),
567
592
  boundary=_boundary_to_dask(boundary),
568
- meta=np.array((), dtype=data.dtype))
593
+ meta=np.array((), dtype=data.dtype),
594
+ **_dask_task_name_kwargs('xrspatial.apply'))
569
595
  return out
570
596
 
571
597
 
@@ -595,7 +621,8 @@ def _apply_dask_cupy(data, kernel, func, boundary='nan'):
595
621
  out = data.map_overlap(_func,
596
622
  depth=(pad_h, pad_w),
597
623
  boundary=_boundary_to_dask(boundary, is_cupy=True),
598
- meta=cupy.array((), dtype=data.dtype))
624
+ meta=cupy.array((), dtype=data.dtype),
625
+ **_dask_task_name_kwargs('xrspatial.apply'))
599
626
  return out
600
627
 
601
628
 
@@ -759,6 +786,15 @@ def apply(agg=None, kernel=None, func=None, name='focal_apply',
759
786
  chunks=getattr(agg.data, 'chunks', None),
760
787
  itemsize=itemsize)
761
788
 
789
+ if _is_empty_raster(agg):
790
+ # No cells to filter; return an empty result of the input shape,
791
+ # matching the numpy path on every backend (issue #3225).
792
+ return DataArray(agg.data.astype(_promote_float(agg.dtype)),
793
+ name=name,
794
+ coords=agg.coords,
795
+ dims=agg.dims,
796
+ attrs=agg.attrs)
797
+
762
798
  # apply kernel to raster values
763
799
  # if agg is a numpy or dask with numpy backed data array,
764
800
  # the function func must be a @ngjit
@@ -1246,7 +1282,8 @@ def _focal_stats_dask_cupy(agg, kernel, stats_funcs, boundary='nan'):
1246
1282
  data = agg.data.astype(_promote_float(agg.data.dtype))
1247
1283
  stats_data = data.map_overlap(
1248
1284
  _func, depth=(pad_h, pad_w),
1249
- boundary=dask_bnd, meta=cupy.array((), dtype=data.dtype))
1285
+ boundary=dask_bnd, meta=cupy.array((), dtype=data.dtype),
1286
+ **_dask_task_name_kwargs('xrspatial.focal_stats'))
1250
1287
  stats_agg = xr.DataArray(
1251
1288
  stats_data, dims=agg.dims, coords=agg.coords, attrs=agg.attrs)
1252
1289
  stats_aggs.append(stats_agg)
@@ -1402,6 +1439,16 @@ def focal_stats(agg,
1402
1439
  chunks=getattr(agg.data, 'chunks', None),
1403
1440
  itemsize=itemsize)
1404
1441
 
1442
+ if _is_empty_raster(agg):
1443
+ # No cells to filter; build the empty stacked result the same way
1444
+ # the real paths do, reusing apply()'s empty short circuit so the
1445
+ # output matches the numpy path on every backend (issue #3225).
1446
+ stats_aggs = [apply(agg, kernel, boundary=boundary) for _ in stats_funcs]
1447
+ result = xr.concat(stats_aggs,
1448
+ pd.Index(stats_funcs, name='stats', dtype=object))
1449
+ result.name = name
1450
+ return result
1451
+
1405
1452
  mapper = ArrayTypeFunctionMapping(
1406
1453
  numpy_func=partial(_focal_stats_cpu, boundary=boundary),
1407
1454
  cupy_func=partial(_focal_stats_cupy_boundary, boundary=boundary),
@@ -1587,9 +1634,11 @@ def _hotspots_dask_numpy(raster, kernel, boundary='nan'):
1587
1634
  # all-NaN / single-valid-cell rasters raise at compute time instead of
1588
1635
  # classifying to a silent all-zeros raster (issue #2843).
1589
1636
  z_array = da.map_blocks(_gistar_validate_lazy, z_array, global_std, n,
1590
- dtype=z_array.dtype, meta=z_array._meta)
1637
+ dtype=z_array.dtype, meta=z_array._meta,
1638
+ **_dask_task_name_kwargs('xrspatial.hotspots.validate'))
1591
1639
  out = z_array.map_blocks(_calc_hotspots_numpy,
1592
- meta=np.array((), dtype=np.int8))
1640
+ meta=np.array((), dtype=np.int8),
1641
+ **_dask_task_name_kwargs('xrspatial.hotspots'))
1593
1642
  return out
1594
1643
 
1595
1644
 
@@ -1627,9 +1676,11 @@ def _hotspots_dask_cupy(raster, kernel, boundary='nan'):
1627
1676
  # all-NaN / single-valid-cell rasters raise at compute time instead of
1628
1677
  # classifying to a silent all-zeros raster (issue #2843).
1629
1678
  z_array = da.map_blocks(_gistar_validate_lazy, z_array, global_std, n,
1630
- dtype=z_array.dtype, meta=z_array._meta)
1679
+ dtype=z_array.dtype, meta=z_array._meta,
1680
+ **_dask_task_name_kwargs('xrspatial.hotspots.validate'))
1631
1681
  out = z_array.map_blocks(_calc_hotspots_cupy,
1632
- meta=cupy.array((), dtype=cupy.int8))
1682
+ meta=cupy.array((), dtype=cupy.int8),
1683
+ **_dask_task_name_kwargs('xrspatial.hotspots'))
1633
1684
  return out
1634
1685
 
1635
1686
 
@@ -1805,6 +1856,15 @@ def hotspots(agg=None, kernel=None, name='hotspots', boundary='nan', *,
1805
1856
  _check_kernel_vs_raster_memory(kernel, rows, cols, func_name='hotspots',
1806
1857
  chunks=getattr(agg.data, 'chunks', None))
1807
1858
 
1859
+ if _is_empty_raster(agg):
1860
+ # An empty raster has no valid cells, so Gi* is undefined. Raise the
1861
+ # same clear error the numpy path already raises, before the cupy and
1862
+ # dask backends crash on a zero-sized reduction or overlap (#3225).
1863
+ raise ValueError(
1864
+ "hotspots() needs at least 2 valid (non-NaN) cells to "
1865
+ "compute the Getis-Ord Gi* statistic."
1866
+ )
1867
+
1808
1868
  mapper = ArrayTypeFunctionMapping(
1809
1869
  numpy_func=partial(_hotspots_numpy, boundary=boundary),
1810
1870
  cupy_func=partial(_hotspots_cupy, boundary=boundary),
@@ -531,6 +531,11 @@ def _validate_write_rich_tag_optin(
531
531
  triggered: list[str] = []
532
532
  if attrs.get('gdal_metadata_xml') is not None:
533
533
  triggered.append("attrs['gdal_metadata_xml']")
534
+ # ``_extract_rich_tags`` only builds GDAL XML from ``gdal_metadata``
535
+ # when it is a dict (and ``gdal_metadata_xml`` is absent); a non-dict
536
+ # value is ignored by the writer, so it does not need gating.
537
+ if isinstance(attrs.get('gdal_metadata'), dict):
538
+ triggered.append("attrs['gdal_metadata']")
534
539
  if attrs.get('extra_tags') is not None:
535
540
  triggered.append("attrs['extra_tags']")
536
541
  if gdal_metadata_xml_kwarg is not None:
@@ -2211,6 +2216,11 @@ def _finalize_eager_read(
2211
2216
  # ``_validation``; local import keeps ``_attrs`` free of a top-level
2212
2217
  # validation dependency for parity with ``_validate_read_geo_info``.
2213
2218
  dtype_cast_attr: str | None = None
2219
+ # Capture float-ness BEFORE the caller's ``dtype=`` cast so ``masked``
2220
+ # below reflects masking-promotion, not the cast (issue #3323). A
2221
+ # caller casting an unmasked int buffer to float must not flip
2222
+ # ``masked_nodata`` to True.
2223
+ pre_cast_is_float = np.dtype(str(arr.dtype)).kind == 'f'
2214
2224
  if dtype is not None:
2215
2225
  from ._validation import _validate_dtype_cast
2216
2226
  target = np.dtype(dtype)
@@ -2219,16 +2229,18 @@ def _finalize_eager_read(
2219
2229
  dtype_cast_attr = target.name
2220
2230
 
2221
2231
  # Stamp the nodata lifecycle attrs. ``masked`` is True iff
2222
- # the caller opted into masking AND the final buffer dtype is float.
2232
+ # the caller opted into masking AND the pre-cast buffer dtype is float.
2223
2233
  # ``_apply_eager_nodata_mask`` promotes a maskable integer source to
2224
2234
  # float64 whenever masking is on (issue #2990), so an ``int`` buffer +
2225
2235
  # ``mask_nodata=True`` here means the sentinel was unmaskable
2226
2236
  # (out-of-range / non-finite / fractional) and could never match, not
2227
2237
  # that masking was disabled. Either way ``masked`` is correctly False
2228
- # because the literal sentinel still occupies its integer slot.
2238
+ # because the literal sentinel still occupies its integer slot. Using
2239
+ # the pre-cast dtype keeps a caller ``dtype=<float>`` cast from
2240
+ # flipping ``masked`` True on that unmasked int buffer (issue #3323).
2229
2241
  _set_nodata_attrs(
2230
2242
  attrs, nodata,
2231
- masked=(effective_mask and np.dtype(str(arr.dtype)).kind == 'f'),
2243
+ masked=(effective_mask and pre_cast_is_float),
2232
2244
  pixels_present=nodata_pixels_present,
2233
2245
  dtype_cast=dtype_cast_attr,
2234
2246
  )
@@ -521,10 +521,15 @@ def _read_geotiff_dask(source: str, *,
521
521
  # Share the validate-then-populate-then-stamp
522
522
  # block with the dask+GPU backend via ``_finalize_lazy_read_attrs``.
523
523
  #
524
- # ``graph_dtype`` is the resolved dask graph dtype so
525
- # ``masked_nodata`` reflects whether the per-chunk mask actually
526
- # ran (masking on an int source auto-promotes to float64; an
527
- # un-promoted int graph means masking didn't run).
524
+ # ``graph_dtype`` is ``effective_dtype`` -- the pre-cast graph dtype
525
+ # after the masking-induced int->float64 auto-promotion but BEFORE
526
+ # the caller's ``dtype=`` cast -- so ``masked_nodata`` reflects
527
+ # whether the per-chunk mask actually ran (masking on a maskable int
528
+ # source auto-promotes to float64; an un-promoted int graph means the
529
+ # sentinel was unmaskable and masking didn't run). Passing the
530
+ # post-cast ``target_dtype`` would let a caller ``dtype=<float>`` cast
531
+ # flip ``masked_nodata`` True on an unmasked int graph (issue #3323);
532
+ # the VRT path already threads its pre-cast dtype for the same reason.
528
533
  # ``caller_dtype`` is the caller's ``dtype=`` kwarg verbatim so
529
534
  # ``nodata_dtype_cast`` records caller intent rather than the
530
535
  # masking-induced auto-promotion.
@@ -538,7 +543,7 @@ def _read_geotiff_dask(source: str, *,
538
543
  geo_info=geo_info,
539
544
  nodata=nodata_attr,
540
545
  mask_nodata=(mask_nodata or mask_and_scale),
541
- graph_dtype=target_dtype,
546
+ graph_dtype=effective_dtype,
542
547
  caller_dtype=dtype,
543
548
  window=window,
544
549
  allow_rotated=allow_rotated,