@@ -29,7 +29,7 @@ class StatsVegCount(StatsPluginInterface):
29
29
VERSION = "0.0.1"
30
30
PRODUCT_FAMILY = "lccs"
31
31
32
- BAD_BITS_MASK = dict ( cloud = (1 << 6 ), cloud_shadow = (1 << 5 ))
32
+ BAD_BITS_MASK = { " cloud" : (1 << 6 ), " cloud_shadow" : (1 << 5 )}
33
33
34
34
def __init__ (
35
35
self ,
@@ -44,7 +44,7 @@ def __init__(
44
44
45
45
@property
46
46
def measurements (self ) -> Tuple [str , ...]:
47
- _measurements = ["veg_frequency" ]
47
+ _measurements = ["veg_frequency" , "water_frequency" ]
48
48
return _measurements
49
49
50
50
def native_transform (self , xx ):
@@ -80,10 +80,10 @@ def native_transform(self, xx):
80
80
# get valid wo pixels, both dry and wet
81
81
data = expr_eval (
82
82
"where(a|b, a, _nan)" ,
83
- dict ( a = wet .data , b = valid .data ) ,
83
+ { "a" : wet .data , "b" : valid .data } ,
84
84
name = "get_valid_pixels" ,
85
85
dtype = "float32" ,
86
- ** dict ( _nan = np .nan ) ,
86
+ ** { " _nan" : np .nan } ,
87
87
)
88
88
89
89
# Pick out the fc pixels that have an unmixing error of less than the threshold
@@ -111,30 +111,49 @@ def _veg_or_not(self, xx: xr.Dataset):
111
111
# otherwise 0
112
112
data = expr_eval (
113
113
"where((a>b)|(c>b), 1, 0)" ,
114
- dict ( a = xx ["pv" ].data , c = xx ["npv" ].data , b = xx ["bs" ].data ) ,
114
+ { "a" : xx ["pv" ].data , "c" : xx ["npv" ].data , "b" : xx ["bs" ].data } ,
115
115
name = "get_veg" ,
116
116
dtype = "uint8" ,
117
117
)
118
118
119
119
# mark nans
120
120
data = expr_eval (
121
121
"where(a!=a, nodata, b)" ,
122
- dict ( a = xx ["pv" ].data , b = data ) ,
122
+ { "a" : xx ["pv" ].data , "b" : data } ,
123
123
name = "get_veg" ,
124
124
dtype = "uint8" ,
125
- ** dict ( nodata = int (NODATA )) ,
125
+ ** { " nodata" : int (NODATA )} ,
126
126
)
127
127
128
128
# mark water freq >= 0.5 as 0
129
129
data = expr_eval (
130
130
"where(a>0, 0, b)" ,
131
- dict ( a = xx ["wet" ].data , b = data ) ,
131
+ { "a" : xx ["wet" ].data , "b" : data } ,
132
132
name = "get_veg" ,
133
133
dtype = "uint8" ,
134
134
)
135
135
136
136
return data
137
137
138
+ def _water_or_not (self , xx : xr .Dataset ):
139
+ # mark water freq > 0.5 as 1
140
+ data = expr_eval (
141
+ "where(a>0.5, 1, 0)" ,
142
+ {"a" : xx ["wet" ].data },
143
+ name = "get_water" ,
144
+ dtype = "uint8" ,
145
+ )
146
+
147
+ # mark nans
148
+ data = expr_eval (
149
+ "where(a!=a, nodata, b)" ,
150
+ {"a" : xx ["wet" ].data , "b" : data },
151
+ name = "get_water" ,
152
+ dtype = "uint8" ,
153
+ ** {"nodata" : int (NODATA )},
154
+ )
155
+ return data
156
+
138
157
def _max_consecutive_months (self , data , nodata ):
139
158
nan_mask = da .ones (data .shape [1 :], chunks = data .chunks [1 :], dtype = "bool" )
140
159
tmp = da .zeros (data .shape [1 :], chunks = data .chunks [1 :], dtype = "uint8" )
@@ -144,44 +163,44 @@ def _max_consecutive_months(self, data, nodata):
144
163
# +1 if not nodata
145
164
tmp = expr_eval (
146
165
"where(a==nodata, b, a+b)" ,
147
- dict ( a = t , b = tmp ) ,
166
+ { "a" : t , "b" : tmp } ,
148
167
name = "compute_consecutive_month" ,
149
168
dtype = "uint8" ,
150
- ** dict ( nodata = nodata ) ,
169
+ ** { " nodata" : nodata } ,
151
170
)
152
171
153
172
# save the max
154
173
max_count = expr_eval (
155
174
"where(a>b, a, b)" ,
156
- dict ( a = max_count , b = tmp ) ,
175
+ { "a" : max_count , "b" : tmp } ,
157
176
name = "compute_consecutive_month" ,
158
177
dtype = "uint8" ,
159
178
)
160
179
161
180
# reset if not veg
162
181
tmp = expr_eval (
163
182
"where((a<=0), 0, b)" ,
164
- dict ( a = t , b = tmp ) ,
183
+ { "a" : t , "b" : tmp } ,
165
184
name = "compute_consecutive_month" ,
166
185
dtype = "uint8" ,
167
186
)
168
187
169
188
# mark nodata
170
189
nan_mask = expr_eval (
171
190
"where(a==nodata, b, False)" ,
172
- dict ( a = t , b = nan_mask ) ,
191
+ { "a" : t , "b" : nan_mask } ,
173
192
name = "mark_nodata" ,
174
193
dtype = "bool" ,
175
- ** dict ( nodata = nodata ) ,
194
+ ** { " nodata" : nodata } ,
176
195
)
177
196
178
197
# mark nodata
179
198
max_count = expr_eval (
180
199
"where(a, nodata, b)" ,
181
- dict ( a = nan_mask , b = max_count ) ,
200
+ { "a" : nan_mask , "b" : max_count } ,
182
201
name = "mark_nodata" ,
183
202
dtype = "uint8" ,
184
- ** dict ( nodata = int (nodata )) ,
203
+ ** { " nodata" : int (nodata )} ,
185
204
)
186
205
return max_count
187
206
@@ -190,14 +209,20 @@ def reduce(self, xx: xr.Dataset) -> xr.Dataset:
190
209
xx = xx .groupby ("time.month" ).map (median_ds , dim = "spec" )
191
210
192
211
data = self ._veg_or_not (xx )
193
- max_count = self ._max_consecutive_months (data , NODATA )
212
+ max_count_veg = self ._max_consecutive_months (data , NODATA )
213
+
214
+ data = self ._water_or_not (xx )
215
+ max_count_water = self ._max_consecutive_months (data , NODATA )
194
216
195
217
attrs = xx .attrs .copy ()
196
218
attrs ["nodata" ] = int (NODATA )
197
219
data_vars = {
198
220
"veg_frequency" : xr .DataArray (
199
- max_count , dims = xx ["wet" ].dims [1 :], attrs = attrs
200
- )
221
+ max_count_veg , dims = xx ["wet" ].dims [1 :], attrs = attrs
222
+ ),
223
+ "water_frequency" : xr .DataArray (
224
+ max_count_water , dims = xx ["wet" ].dims [1 :], attrs = attrs
225
+ ),
201
226
}
202
227
coords = dict ((dim , xx .coords [dim ]) for dim in xx ["wet" ].dims [1 :])
203
228
return xr .Dataset (data_vars = data_vars , coords = coords , attrs = xx .attrs )
0 commit comments