@@ -71,6 +71,7 @@ def __init__(
71
71
saltpan_threshold : Optional [int ] = None ,
72
72
water_threshold : Optional [float ] = None ,
73
73
veg_threshold : Optional [int ] = None ,
74
+ water_seasonality_threshold : Optional [float ] = None ,
74
75
** kwargs ,
75
76
):
76
77
super ().__init__ (** kwargs )
@@ -83,11 +84,14 @@ def __init__(
83
84
)
84
85
self .water_threshold = water_threshold if water_threshold is not None else 0.2
85
86
self .veg_threshold = veg_threshold if veg_threshold is not None else 2
87
+ self .water_seasonality_threshold = (
88
+ water_seasonality_threshold if water_seasonality_threshold else 0.25
89
+ )
86
90
self .output_classes = output_classes
87
91
88
92
@property
89
93
def measurements (self ) -> Tuple [str , ...]:
90
- _measurements = ["classes_l3_l4" ]
94
+ _measurements = ["classes_l3_l4" , "water_seasonality" ]
91
95
return _measurements
92
96
93
97
def native_transform (self , xx ):
@@ -193,6 +197,7 @@ def l3_class(self, xx: xr.Dataset):
193
197
# issues:
194
198
# - nodata information from non-indexed datasets missing
195
199
200
+ # Mask nans with NODATA
196
201
l3_mask = expr_eval (
197
202
"where((a!=a)|(b>=nodata), nodata, e)" ,
198
203
{
@@ -205,17 +210,51 @@ def l3_class(self, xx: xr.Dataset):
205
210
** {"nodata" : NODATA },
206
211
)
207
212
208
- return l3_mask
213
+ # Now add the water frequency
214
+ # Divide water frequency into following classes:
215
+ # 0 --> 0
216
+ # (0,0.25] --> 1
217
+ # (0.25,1] --> 2
209
218
210
- def reduce (self , xx : xr .Dataset ) -> xr .Dataset :
211
- l3_mask = self .l3_class (xx )
219
+ water_seasonality = expr_eval (
220
+ "where((a > 0) & (a <= wt), 1, a)" ,
221
+ {"a" : xx ["frequency" ].data },
222
+ name = "mark_wo_fq" ,
223
+ dtype = "float32" ,
224
+ ** {"wt" : self .water_seasonality_threshold },
225
+ )
226
+
227
+ water_seasonality = expr_eval (
228
+ "where((a > wt) & (a <= 1), 2, b)" ,
229
+ {"a" : xx ["frequency" ].data , "b" : water_seasonality },
230
+ name = "mark_wo_fq" ,
231
+ dtype = "float32" ,
232
+ ** {"wt" : self .water_seasonality_threshold },
233
+ )
234
+
235
+ water_seasonality = expr_eval (
236
+ "where((a != a), nodata, a)" ,
237
+ {
238
+ "a" : water_seasonality ,
239
+ },
240
+ name = "mark_nodata" ,
241
+ dtype = "uint8" ,
242
+ ** {"nodata" : NODATA },
243
+ )
244
+
245
+ return l3_mask , water_seasonality
212
246
247
+ def reduce (self , xx : xr .Dataset ) -> xr .Dataset :
248
+ l3_mask , water_seasonality = self .l3_class (xx )
213
249
attrs = xx .attrs .copy ()
214
250
attrs ["nodata" ] = int (NODATA )
215
251
data_vars = {
216
252
"classes_l3_l4" : xr .DataArray (
217
253
l3_mask [0 ], dims = xx ["veg_frequency" ].dims [1 :], attrs = attrs
218
- )
254
+ ),
255
+ "water_seasonality" : xr .DataArray (
256
+ water_seasonality [0 ], dims = xx ["veg_frequency" ].dims [1 :], attrs = attrs
257
+ ),
219
258
}
220
259
coords = dict ((dim , xx .coords [dim ]) for dim in xx ["veg_frequency" ].dims [1 :])
221
260
return xr .Dataset (data_vars = data_vars , coords = coords , attrs = xx .attrs )
0 commit comments