From 07e780a67e7124a31fc14489b1806a423626fcd8 Mon Sep 17 00:00:00 2001 From: Denis Rykov Date: Tue, 15 Oct 2019 16:19:59 +0200 Subject: [PATCH] Take into account per dataset mask --- src/rasterstats/io.py | 6 ++++++ tests/data/dataset_mask.tif | Bin 0 -> 2377 bytes tests/test_zonal.py | 8 ++++++++ 3 files changed, 14 insertions(+) create mode 100644 tests/data/dataset_mask.tif 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 0000000000000000000000000000000000000000..0207d121a9a67941ab7407075dba525f75682c4a GIT binary patch literal 2377 zcmebD)MAifV_*-pD0NKn?HY2c@;`Qy!3=u$D325<# zb{+;!Ao~)Ky|JB%As)zxaD!=3 z%m6`ys{@#3@PN{eP&)1aNW8&c3GP22*I`*mgyV{zucyc^DRKbGgFtCsUSe))N{zd7 zu!0|urC_Vz9u%x#XlY@f;Th`gt^;Oj*0>~=l;#2@OY^ex^2_sTTyt_V3ySkIQy>~F z3~B<3GILWwO5BT5Q}fC*lQU{+7#MgN{sDs&I12Rr9NPo!BZbdFD&(` z0+Rxv)TaVePbl?)>;i!X2893%6)|4+7N^939VuqA{2eYyffh@`bj5qzk^^@ZwKQyP_?ocn&|Oc<_Qr3B$O*Gnopv^Ti|;fR3DI@8a~Pu6nR8FQ_Og8Y zy}a_(TR(lQJ`i7E{zpulvweS3LB$#~t-{`;Pl_aM+`P4?983KiIpFrd0Jv~_r3l4i*G*M+WX(W{QB+hJFE7~ z``^F);O&0@-+%r&_`kmN(V@VHm+4?{4l|RJK!`M}@aX%lY|&$aB{}b0H?Ap_a_mOJ)|rEG`$$DUq=L!Wde zs-DQ-GF9!AkVvNbsUVxh!j3|FW@;V#v}CQGcOc7V1D{EM;`P0YO)iW16o(u(Iy5=w zy7}1)SDsq=6}KGu>2JK|&u3rZqpY@Wo=Z9HFXX#2JD=Z@RqPgMQasc3qDZTvS5U~B zyFNiCZ@&5kUAZzdASC3=+Mr-lpVE+!t0Bv+ub7s4{kbMOH#anNYHxJtwXIWY9m7rc zmJ3Fh{w=lkpC;Ryd}8X`smZ}*r86@^%BD`wzO~JFdHVG--JQ96r+qz`<1V&!W&WA( zrWcE^e!F_I@Laj*{mQe`OK(1w=veA5x>S>6R>g~XG@fYn0Q_6 z#(9z*u@+_O&F3t(Y4)D4m}c4jz~Y2qKAzMpl8i9v{9u2cZ# z5?HRpRVT;*3voiZ@;|V=CX_3Y>x5sx$^cd;2(csT1ScRHRwsM{vSD?C6|l%?Si;26 z4Rr4;AbYfa82t5vjk}AZk8f&8VoG93q8*olf{kYhuoeMTO14TRsW~~NMVZO*Nr`zW z@gT8cCA(;YSQ~wiB6QV7sl|!81v!~{=}HPI`MHUidA3SLnfdYgWvNAFnW^PUcFCnl ynaMECHu|VmGgQn;PLN1y_-W7aM{&|WLzkEQ&OLPoE-#r`UIsdd1Cw0cSq%VU2YkT* literal 0 HcmV?d00001 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")