diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 2d44e7fc..406c1e37 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 6.2.4 +current_version = 6.2.6 commit = True tag = True tag_name = {new_version} diff --git a/CHANGES.md b/CHANGES.md index 27a630f8..bf38d13f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,12 @@ +# 6.2.6 (2023-11-10) + +* validate `shape` in `ImageData.get_coverage_array` to avoid rasterio error when re-projecting the geometry + +# 6.2.5 (2023-11-06) + +* avoid `indexes` collision in `MultiBaseReader` + # 6.2.4 (2023-10-19) * fix issue with `WarpedVRT` when doing re-projection (ref: https://github.com/cogeotiff/rio-tiler/pull/648) diff --git a/rio_tiler/__init__.py b/rio_tiler/__init__.py index fffdac5c..eb27fb65 100644 --- a/rio_tiler/__init__.py +++ b/rio_tiler/__init__.py @@ -1,6 +1,6 @@ """rio-tiler.""" -__version__ = "6.2.4" +__version__ = "6.2.6" from . import ( # noqa colormap, diff --git a/rio_tiler/io/base.py b/rio_tiler/io/base.py index 75e8c752..5e98bfea 100644 --- a/rio_tiler/io/base.py +++ b/rio_tiler/io/base.py @@ -489,8 +489,11 @@ def tile( asset_indexes = asset_indexes or {} + # We fall back to `indexes` if provided + indexes = kwargs.pop("indexes", None) + def _reader(asset: str, *args: Any, **kwargs: Any) -> ImageData: - idx = asset_indexes.get(asset) or kwargs.pop("indexes", None) # type: ignore + idx = asset_indexes.get(asset) or indexes # type: ignore asset_info = self._get_asset_info(asset) url = asset_info["url"] @@ -567,8 +570,11 @@ def part( asset_indexes = asset_indexes or {} + # We fall back to `indexes` if provided + indexes = kwargs.pop("indexes", None) + def _reader(asset: str, *args: Any, **kwargs: Any) -> ImageData: - idx = asset_indexes.get(asset) or kwargs.pop("indexes", None) # type: ignore + idx = asset_indexes.get(asset) or indexes # type: ignore asset_info = self._get_asset_info(asset) url = asset_info["url"] @@ -643,8 +649,11 @@ def preview( asset_indexes = asset_indexes or {} + # We fall back to `indexes` if provided + indexes = kwargs.pop("indexes", None) + def _reader(asset: str, **kwargs: Any) -> ImageData: - idx = asset_indexes.get(asset) or kwargs.pop("indexes", None) # type: ignore + idx = asset_indexes.get(asset) or indexes # type: ignore asset_info = self._get_asset_info(asset) url = asset_info["url"] @@ -723,8 +732,11 @@ def point( asset_indexes = asset_indexes or {} + # We fall back to `indexes` if provided + indexes = kwargs.pop("indexes", None) + def _reader(asset: str, *args, **kwargs: Any) -> PointData: - idx = asset_indexes.get(asset) or kwargs.pop("indexes", None) # type: ignore + idx = asset_indexes.get(asset) or indexes # type: ignore asset_info = self._get_asset_info(asset) url = asset_info["url"] @@ -795,8 +807,11 @@ def feature( asset_indexes = asset_indexes or {} + # We fall back to `indexes` if provided + indexes = kwargs.pop("indexes", None) + def _reader(asset: str, *args: Any, **kwargs: Any) -> ImageData: - idx = asset_indexes.get(asset) or kwargs.pop("indexes", None) # type: ignore + idx = asset_indexes.get(asset) or indexes # type: ignore asset_info = self._get_asset_info(asset) url = asset_info["url"] diff --git a/rio_tiler/models.py b/rio_tiler/models.py index d74068c1..dcf38363 100644 --- a/rio_tiler/models.py +++ b/rio_tiler/models.py @@ -35,6 +35,7 @@ RIOResampling, ) from rio_tiler.utils import ( + _validate_shape_input, get_array_statistics, linear_rescale, non_alpha_indexes, @@ -822,10 +823,11 @@ def get_coverage_array( Note: code adapted from https://github.com/perrygeo/python-rasterstats/pull/136 by @sgoodm """ + shape = _validate_shape_input(shape) + if self.crs != shape_crs: shape = transform_geom(shape_crs, self.crs, shape) - shape = shape.get("geometry", shape) cover_array = rasterize( [(shape, 1)], out_shape=(self.height * cover_scale, self.width * cover_scale), diff --git a/tests/test_io_stac.py b/tests/test_io_stac.py index ff0f300b..062d205d 100644 --- a/tests/test_io_stac.py +++ b/tests/test_io_stac.py @@ -199,6 +199,22 @@ def test_tile_valid(rio): assert img.mask.shape == (256, 256) assert img.band_names == ["green_b1", "green_b1", "red_b1", "red_b1"] + # check that indexes and asset_indexes are not conflicting + img = stac.tile( + 71, + 102, + 8, + assets=("green", "red"), + indexes=None, + asset_indexes={ + "green": (1,), + "red": 1, + }, + ) + assert img.data.shape == (2, 256, 256) + assert img.mask.shape == (256, 256) + assert img.band_names == ["green_b1", "red_b1"] + img = stac.tile(71, 102, 8, expression="green_b1*2;green_b1;red_b1*2") assert img.data.shape == (3, 256, 256) assert img.mask.shape == (256, 256) diff --git a/tests/test_models.py b/tests/test_models.py index 2e200fa3..1a6afdfa 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -459,3 +459,24 @@ def test_imagedata_coverage(): coverage = im.get_coverage_array({"type": "Feature", "geometry": poly}) assert numpy.unique(coverage).tolist() == [0.25] + + poly = { + "type": "Polygon", + "coordinates": [ + [ + (-10018754.171394622, -5621521.486192066), + (10018754.171394622, -5621521.486192066), + (10018754.171394622, 5621521.486192066), + (-10018754.171394622, 5621521.486192066), + (-10018754.171394622, -5621521.486192066), + ] + ], + } + + coverage = im.get_coverage_array(poly, shape_crs="epsg:3857") + assert numpy.unique(coverage).tolist() == [0.25] + + coverage = im.get_coverage_array( + {"type": "Feature", "geometry": poly}, shape_crs="epsg:3857" + ) + assert numpy.unique(coverage).tolist() == [0.25]