diff --git a/src/rasterstats/io.py b/src/rasterstats/io.py index 04e2687..a54eecc 100644 --- a/src/rasterstats/io.py +++ b/src/rasterstats/io.py @@ -9,6 +9,7 @@ import rasterio import warnings from rasterio.transform import guard_transform +from rasterio.enums import MaskFlags from affine import Affine import numpy as np try: @@ -305,6 +306,11 @@ def read(self, bounds=None, window=None, masked=False): self.array, window=win, nodata=nodata, masked=masked) elif self.src: # It's an open rasterio dataset + if all(MaskFlags.per_dataset in flags for flags in self.src.mask_flag_enums): + if not masked: + masked = True + warnings.warn("Setting masked to True because dataset mask has been detected") + new_array = self.src.read( self.band, window=win, boundless=True, masked=masked) diff --git a/tests/data/dataset_mask.tif b/tests/data/dataset_mask.tif new file mode 100644 index 0000000..0207d12 Binary files /dev/null and b/tests/data/dataset_mask.tif differ diff --git a/tests/test_zonal.py b/tests/test_zonal.py index 898b8eb..ecd5138 100644 --- a/tests/test_zonal.py +++ b/tests/test_zonal.py @@ -204,6 +204,14 @@ def test_nodata(): assert '1.0' not in stats[0] +def test_dataset_mask(): + polygons = os.path.join(DATA, 'polygons.shp') + raster = os.path.join(DATA, 'dataset_mask.tif') + stats = zonal_stats(polygons, raster, stats="*") + assert stats[0]['count'] == 75 + assert stats[1]['count'] == 0 + + def test_partial_overlap(): polygons = os.path.join(DATA, 'polygons_partial_overlap.shp') stats = zonal_stats(polygons, raster, stats="count")