Skip to content

Commit e90c970

Browse files
committed
Fixes and tests
1 parent ec117db commit e90c970

File tree

2 files changed

+33
-12
lines changed

2 files changed

+33
-12
lines changed

odc/geo/masking.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ class LANDSAT_C2L2_PIXEL_QA(Enum):
6464

6565
def bits_to_bool(
6666
xx: DataArray,
67-
bits: Sequence[int] | None,
68-
bitflags: int | None,
67+
bits: Sequence[int] | None = None,
68+
bitflags: int | None = None,
6969
invert: bool = False,
7070
) -> DataArray:
7171
"""
@@ -121,8 +121,8 @@ def enum_to_bool(
121121

122122
def scale_and_offset(
123123
xx: DataArray | Dataset,
124-
scale: float | None,
125-
offset: float | None,
124+
scale: float | None = None,
125+
offset: float | None = None,
126126
clip: Annotated[Sequence[int | float], 2] | None = None,
127127
) -> DataArray | Dataset:
128128
"""

tests/test_masking.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,21 @@
66
mask_invalid_data,
77
)
88

9-
from xarray import DataArray
9+
10+
from xarray import DataArray, Dataset
1011

1112
# Top left is cloud, top right is cloud shadow
1213
# Bottom left is both cloud and cloud shadow, bottom right is neither
1314
xx_bits = DataArray(
14-
[[0b00010000, 0b00001000], [0b00011000, 0b00000000]], dims=("y", "x")
15+
[[0b00010000, 0b00001000], [0b00011000, 0b00000000]], dims=("y", "x"), attrs={"nodata": 0}
1516
)
1617

1718
# Set up a 2x2 8 bit integer DataArray with some
1819
# values set to 3 (shadow), 9 (high confidence cloud).
19-
xx_values = DataArray([[3, 9], [3, 0]], dims=("y", "x"))
20+
xx_values = DataArray([[3, 9], [3, 0]], dims=("y", "x"), attrs={"nodata": 0})
2021

2122
# Array with some zeros
22-
xx_with_nodata = DataArray([[1, 2], [0, 0]], dims=("y", "x"), attrs={"nodata": 0})
23+
xx_with_nodata = DataArray([[0, 1], [2, 3]], dims=("y", "x"), attrs={"nodata": 0})
2324

2425

2526
# Test bits_to_bool
@@ -54,17 +55,37 @@ def test_scale_and_offset():
5455
mask = scale_and_offset(xx_values, scale=1.0, offset=0.0)
5556
assert mask.equals(DataArray([[3, 9], [3, 0]], dims=("y", "x")))
5657

57-
mask = scale_and_offset(xx_values, scale=None, offset=None, ignore_missing=True)
58+
mask = scale_and_offset(xx_values)
5859
assert mask.equals(DataArray([[3, 9], [3, 0]], dims=("y", "x")))
5960

6061
mask = scale_and_offset(xx_values, scale=2.0, offset=1.0)
61-
assert mask.equals(DataArray([[7, 19], [7, 1]], dims=("y", "x")))
62+
assert mask.equals(DataArray([[7, 19], [7, 0]], dims=("y", "x")))
6263

6364

6465
# Test mask_invalid
6566
def test_mask_invalid_data():
6667
mask = mask_invalid_data(xx_with_nodata)
67-
assert mask.equals(DataArray([[1.0, 2.0], [np.nan, np.nan]], dims=("y", "x")))
68+
assert mask.equals(DataArray([[np.nan, 1.0], [2.0, 3.0]], dims=("y", "x")))
6869

6970
mask = mask_invalid_data(xx_with_nodata, nodata=1)
70-
assert mask.equals(DataArray([[np.nan, 2], [0, 0]], dims=("y", "x")))
71+
assert mask.equals(DataArray([[0, np.nan], [2, 3]], dims=("y", "x")))
72+
73+
74+
# Test landsat masking
75+
def test_mask_landsat():
76+
xx = Dataset({"pixel_qa": xx_bits, "red": scale_and_offset(xx_with_nodata, offset=20000)})
77+
print(xx)
78+
79+
xx = xx.odc.mask_ls()
80+
81+
assert xx["red"].equals(DataArray([[np.nan, np.nan], [np.nan, 0.3500825]], dims=("y", "x")))
82+
83+
84+
def test_mask_sentinel2():
85+
xx = Dataset({"scl": xx_values, "red": scale_and_offset(xx_with_nodata, offset=8000)})
86+
87+
xx = xx.odc.mask_s2()
88+
89+
assert xx["red"].equals(DataArray([[np.nan, np.nan], [np.nan, 0.7003]], dims=("y", "x")))
90+
91+
assert xx.red.odc.nodata is not None

0 commit comments

Comments
 (0)