Skip to content

Commit fd6f799

Browse files
committed
Ensured nodata is replaced with 255 in all level4 plugins
1 parent 8227e5b commit fd6f799

15 files changed

+48
-46
lines changed

odc/stats/plugins/l34_utils/l4_bare_gradation.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,23 @@
77

88
def bare_gradation(xx: xr.Dataset, bare_threshold, veg_cover):
99

10+
bs_pc_50 = expr_eval(
11+
"where((a!=a), nodata, a)",
12+
{"a": xx.bs_pc_50.data},
13+
name="mark_veg",
14+
dtype="float32",
15+
**{"nodata": NODATA},
16+
)
17+
1018
# Map any data > 100 ---> 100
1119
bs_pc_50 = expr_eval(
1220
"where((a>100)&(a!=nodata), 100, a)",
13-
{"a": xx.bs_pc_50.data},
21+
{"a": bs_pc_50},
1422
name="mark_veg",
1523
dtype="uint8",
1624
**{"nodata": NODATA},
1725
)
18-
26+
1927
# 60% <= data --> 15
2028
bs_mask = expr_eval(
2129
"where((a>=m)&(a!=nodata), 15, a)",

odc/stats/plugins/l34_utils/l4_veg_cover.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def canopyco_veg_con(xx: xr.Dataset, veg_threshold):
1515
dtype="float32",
1616
**{"nodata": NODATA},
1717
)
18-
18+
1919
# Map any data > 100 ---> 100
2020
pv_pc_50 = expr_eval(
2121
"where((a>100) & (a!=nodata), 100, a)",
@@ -27,7 +27,7 @@ def canopyco_veg_con(xx: xr.Dataset, veg_threshold):
2727
**{"nodata": NODATA},
2828
)
2929

30-
# ## data < 1 ---> 0
30+
# data < 1 ---> 0
3131
veg_mask = expr_eval(
3232
"where(a<m, 0, a)",
3333
{

odc/stats/plugins/l34_utils/l4_water.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ def water_classification(xx, intertidal_mask, water_persistence):
77

88
l4 = expr_eval(
99
"where(((a==223)|(a==221))&(b==1), 101, a)",
10-
{"a": xx.classes_l3_l4.data, "b": water_persistence},
10+
{"a": xx.level_3_4.data, "b": water_persistence},
1111
name="mark_water",
1212
dtype="uint8",
1313
)

odc/stats/plugins/l34_utils/l4_water_persistence.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,14 @@
77

88

99
def water_persistence(xx: xr.Dataset, watper_threshold):
10-
11-
# Apply nodata
10+
11+
# Address nan
1212
water_frequency = expr_eval(
13-
"where((a==water_freq_nodata), nodata, a)",
13+
"where((a!=a), nodata, a)",
1414
{"a": xx.water_frequency.data},
1515
name="mark_water",
16-
dtype="uint8",
17-
**{
18-
"m": watper_threshold[3],
19-
"nodata": NODATA,
20-
"water_freq_nodata": WATER_FREQ_NODATA,
21-
},
16+
dtype="float32",
17+
**{"nodata": NODATA},
2218
)
2319

2420
# 10 <= water_frequency < 1 --> 1

odc/stats/plugins/l34_utils/lc_intertidal_mask.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def intertidal_mask(xx: xr.Dataset):
99

1010
res = expr_eval(
1111
"where(a==_u, 1, 0)",
12-
{"a": xx.classes_l3_l4.data},
12+
{"a": xx.level_3_4.data},
1313
name="mask_intertidal",
1414
dtype="uint8",
1515
**{"_u": 223},

odc/stats/plugins/l34_utils/lc_level3.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def lc_level3(xx: xr.Dataset):
1414

1515
res = expr_eval(
1616
"where((a!=a)|(a>=nodata), b, a)",
17-
{"a": xx.cultivated.data, "b": xx.classes_l3_l4.data},
17+
{"a": xx.cultivated.data, "b": xx.level_3_4.data},
1818
name="mask_cultivated",
1919
dtype="float32",
2020
**{"nodata": xx.cultivated.attrs.get("nodata")},
@@ -46,7 +46,7 @@ def lc_level3(xx: xr.Dataset):
4646
# Add intertidal as water
4747
res = expr_eval(
4848
"where((a==223)|(a==221), 220, b)",
49-
{"a": xx.classes_l3_l4.data, "b": res},
49+
{"a": xx.level_3_4.data, "b": res},
5050
name="mark_urban",
5151
dtype="uint8",
5252
)

odc/stats/plugins/l34_utils/lc_water_seasonality.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,20 @@
22

33
from odc.stats._algebra import expr_eval
44

5-
WATER_FREQ_NODATA = -999
65
NODATA = 255
76

87

98
def water_seasonality(xx: xr.Dataset, water_seasonality_threshold):
109
# >= 3 months ----> 1 Semi-permanent or permanent
1110
# < 3 months ----> 2 Temporary or seasonal
12-
11+
1312
# Apply nodata
1413
water_frequency = expr_eval(
15-
"where((a!=a)|(a==watersea_nodata), nodata, a)",
14+
"where((a!=a), nodata, a)",
1615
{"a": xx.water_frequency.data},
1716
name="mark_water_season",
1817
dtype="float32",
19-
**{"nodata": NODATA, "watersea_nodata": WATER_FREQ_NODATA},
18+
**{"nodata": NODATA},
2019
)
2120

2221
water_season_mask = expr_eval(

odc/stats/plugins/lc_level34.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,16 @@ def reduce(self, xx: xr.Dataset) -> xr.Dataset:
6464
water_persistence = l4_water_persistence.water_persistence(
6565
xx, self.watper_threshold
6666
)
67-
67+
# print("### Water Persistence", np.unique(water_persistence.compute()))
6868
water_seasonality = lc_water_seasonality.water_seasonality(
6969
xx, self.water_seasonality_threshold
7070
)
71-
71+
# print("### Water Seasonality", np.unique(water_persistence.compute()))
7272
intertidal_mask = lc_intertidal_mask.intertidal_mask(xx)
7373

7474
# #TODO WATER (99-104)
7575
l4 = l4_water.water_classification(xx, intertidal_mask, water_persistence)
76-
76+
# print("### Water classification", np.unique(water_persistence.compute()))
7777
# Generate Level3 classes
7878
level3 = lc_level3.lc_level3(xx)
7979

@@ -93,7 +93,6 @@ def reduce(self, xx: xr.Dataset) -> xr.Dataset:
9393
bare_gradation = l4_bare_gradation.bare_gradation(
9494
xx, self.bare_threshold, veg_cover
9595
)
96-
9796
l4 = l4_natural_aquatic.natural_auquatic_veg(l4, veg_cover, water_seasonality)
9897

9998
level4 = l4_surface.lc_l4_surface(l4, level3, bare_gradation)
@@ -103,7 +102,7 @@ def reduce(self, xx: xr.Dataset) -> xr.Dataset:
103102

104103
attrs = xx.attrs.copy()
105104
attrs["nodata"] = NODATA
106-
dims = xx.classes_l3_l4.dims[1:]
105+
dims = xx.level_3_4.dims[1:]
107106
data_vars = {
108107
k: xr.DataArray(v, dims=dims, attrs=attrs)
109108
for k, v in zip(self.measurements, [level3.squeeze(), level4.squeeze()])

tests/test_lc_l34.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def image_groups():
106106
}
107107

108108
data_vars = {
109-
"classes_l3_l4": xr.DataArray(
109+
"level_3_4": xr.DataArray(
110110
da.from_array(l34, chunks=(1, -1, -1)),
111111
dims=("spec", "y", "x"),
112112
attrs={"nodata": 255},

tests/test_lc_l4_ctv.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def image_groups(l34, urban, cultivated, woody, pv_pc_50):
2727
}
2828

2929
data_vars = {
30-
"classes_l3_l4": xr.DataArray(
30+
"level_3_4": xr.DataArray(
3131
da.from_array(l34, chunks=(1, -1, -1)),
3232
dims=("spec", "y", "x"),
3333
attrs={"nodata": 255},
@@ -135,7 +135,7 @@ def test_ctv_classes_woody():
135135
veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold)
136136

137137
l4_ctv = l4_cultivated.lc_l4_cultivated(
138-
xx.classes_l3_l4, level3, lifeform, veg_cover
138+
xx.level_3_4, level3, lifeform, veg_cover
139139
)
140140

141141
assert (l4_ctv.compute() == expected_cultivated_classes).all()
@@ -217,7 +217,7 @@ def test_ctv_classes_herbaceous():
217217
veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold)
218218

219219
l4_ctv = l4_cultivated.lc_l4_cultivated(
220-
xx.classes_l3_l4, level3, lifeform, veg_cover
220+
xx.level_3_4, level3, lifeform, veg_cover
221221
)
222222
assert (l4_ctv.compute() == expected_cultivated_classes).all()
223223

@@ -298,7 +298,7 @@ def test_ctv_classes_woody_herbaceous():
298298
veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold)
299299

300300
l4_ctv = l4_cultivated.lc_l4_cultivated(
301-
xx.classes_l3_l4, level3, lifeform, veg_cover
301+
xx.level_3_4, level3, lifeform, veg_cover
302302
)
303303

304304
assert (l4_ctv.compute() == expected_cultivated_classes).all()
@@ -380,6 +380,6 @@ def test_ctv_classes_no_vegcover():
380380
veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold)
381381

382382
l4_ctv = l4_cultivated.lc_l4_cultivated(
383-
xx.classes_l3_l4, level3, lifeform, veg_cover
383+
xx.level_3_4, level3, lifeform, veg_cover
384384
)
385385
assert (l4_ctv.compute() == expected_cultivated_classes).all()

0 commit comments

Comments
 (0)