From 598418d051619709bf3d69eec4052f55f0f0e0f0 Mon Sep 17 00:00:00 2001 From: Brendan Collins Date: Wed, 1 Jul 2026 23:37:14 -0400 Subject: [PATCH] Remove unused xrspatial.analytics module (#3601) summarize_terrain was a thin wrapper over slope/aspect/curvature that was never exported from the package, never documented, and had no internal callers. Drop the module and its test file. --- xrspatial/analytics.py | 87 ------------------------------- xrspatial/tests/test_analytics.py | 33 ------------ 2 files changed, 120 deletions(-) delete mode 100644 xrspatial/analytics.py delete mode 100644 xrspatial/tests/test_analytics.py diff --git a/xrspatial/analytics.py b/xrspatial/analytics.py deleted file mode 100644 index e4282889f..000000000 --- a/xrspatial/analytics.py +++ /dev/null @@ -1,87 +0,0 @@ -import xarray as xr - -from xrspatial import aspect, curvature, slope - - -def summarize_terrain(terrain: xr.DataArray): - """ - Calculates slope, aspect, and curvature of an elevation terrain and return a dataset - of the computed data. - - Parameters - ---------- - terrain: xarray.DataArray - 2D NumPy, CuPy, or Dask with NumPy-backed xarray DataArray of elevation values. - - Returns - ------- - summarized_terrain: xarray.Dataset - Dataset with slope, aspect, curvature variables with a naming convention of - `terrain.name-variable_name` - - Examples - -------- - .. sourcecode:: python - - >>> import numpy as np - >>> import xarray as xr - >>> from xrspatial.analytics import summarize_terrain - >>> data = np.array([ - [0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 1, 0, 0, -1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0]], dtype=np.float64) - >>> raster = xr.DataArray(data, name='myraster', attrs={'res': (1, 1)}) - >>> summarized_terrain = summarize_terrain(raster) - >>> summarized_terrain - - Dimensions: (dim_0: 5, dim_1: 8) - Dimensions without coordinates: dim_0, dim_1 - Data variables: - myraster (dim_0, dim_1) float64 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 - myraster-slope (dim_0, dim_1) float32 nan nan nan nan ... nan nan nan - myraster-curvature (dim_0, dim_1) float64 nan nan nan nan ... nan nan nan - myraster-aspect (dim_0, dim_1) float32 nan nan nan nan ... nan nan nan - >>> summarized_terrain['myraster-slope'] - - array([[ nan, nan, nan, nan, nan, nan, nan, nan], - [ nan, 10.024988, 14.036243, 10.024988, 10.024988, 14.036243, 10.024988, nan], - [ nan, 14.036243, 0. , 14.036243, 14.036243, 0. , 14.036243, nan], - [ nan, 10.024988, 14.036243, 10.024988, 10.024988, 14.036243, 10.024988, nan], - [ nan, nan, nan, nan, nan, nan, nan, nan]], dtype=float32) # noqa - Dimensions without coordinates: dim_0, dim_1 - Attributes: - res: (1, 1) - - >>> summarized_terrain['myraster-curvature'] - - array([[ nan, nan, nan, nan, nan, nan, nan, nan], - [ nan, -0., -100., -0., -0., 100., -0., nan], - [ nan, -100., 400., -100., 100., -400., 100., nan], - [ nan, -0., -100., -0., -0., 100., -0., nan], - [ nan, nan, nan, nan, nan, nan, nan, nan]]) - Dimensions without coordinates: dim_0, dim_1 - Attributes: - res: (1, 1) - - >>> summarized_terrain['myraster-aspect'] - - array([[ nan, nan, nan, nan, nan, nan, nan, nan], - [ nan, 315., 0., 45., 135., 180., 225., nan], - [ nan, 270., -1., 90., 90., -1., 270., nan], - [ nan, 225., 180., 135., 45., 0., 315., nan], - [ nan, nan, nan, nan, nan, nan, nan, nan]], dtype=float32) - Dimensions without coordinates: dim_0, dim_1 - Attributes: - res: (1, 1) - """ - - if terrain.name is None: - raise NameError('Requires xr.DataArray.name property to be set') - - ds = terrain.to_dataset() - ds[f'{terrain.name}-slope'] = slope(terrain) - ds[f'{terrain.name}-curvature'] = curvature(terrain) - ds[f'{terrain.name}-aspect'] = aspect(terrain) - return ds diff --git a/xrspatial/tests/test_analytics.py b/xrspatial/tests/test_analytics.py deleted file mode 100644 index 8a843a9dc..000000000 --- a/xrspatial/tests/test_analytics.py +++ /dev/null @@ -1,33 +0,0 @@ -import numpy as np -import pytest - -from xrspatial import aspect, curvature, slope -from xrspatial.analytics import summarize_terrain -from xrspatial.tests.general_checks import create_test_raster - - -def test_summarize_terrain_no_name(): - data = np.zeros((10, 20)) - test_terrain = create_test_raster(data, name=None) - msg = "Requires xr.DataArray.name property to be set" - with pytest.raises(NameError, match=msg): - summarize_terrain(test_terrain) - - -@pytest.mark.parametrize("size", [(2, 4), (100, 150)]) -@pytest.mark.parametrize( - "dtype", [np.int32, np.int64, np.uint32, np.uint64, np.float32, np.float64] -) -def test_summarize_terrain(random_data): - test_terrain = create_test_raster(random_data, name='myterrain') - summarized_ds = summarize_terrain(test_terrain) - variables = [v for v in summarized_ds] - should_have = ['myterrain', - 'myterrain-slope', - 'myterrain-curvature', - 'myterrain-aspect'] - assert variables == should_have - - np.testing.assert_allclose(summarized_ds['myterrain-slope'], slope(test_terrain)) - np.testing.assert_allclose(summarized_ds['myterrain-curvature'], curvature(test_terrain)) - np.testing.assert_allclose(summarized_ds['myterrain-aspect'], aspect(test_terrain))