|
6 | 6 | mask_invalid_data,
|
7 | 7 | )
|
8 | 8 |
|
9 |
| -from xarray import DataArray |
| 9 | + |
| 10 | +from xarray import DataArray, Dataset |
10 | 11 |
|
11 | 12 | # Top left is cloud, top right is cloud shadow
|
12 | 13 | # Bottom left is both cloud and cloud shadow, bottom right is neither
|
13 | 14 | xx_bits = DataArray(
|
14 |
| - [[0b00010000, 0b00001000], [0b00011000, 0b00000000]], dims=("y", "x") |
| 15 | + [[0b00010000, 0b00001000], [0b00011000, 0b00000000]], dims=("y", "x"), attrs={"nodata": 0} |
15 | 16 | )
|
16 | 17 |
|
17 | 18 | # Set up a 2x2 8 bit integer DataArray with some
|
18 | 19 | # 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}) |
20 | 21 |
|
21 | 22 | # 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}) |
23 | 24 |
|
24 | 25 |
|
25 | 26 | # Test bits_to_bool
|
@@ -54,17 +55,37 @@ def test_scale_and_offset():
|
54 | 55 | mask = scale_and_offset(xx_values, scale=1.0, offset=0.0)
|
55 | 56 | assert mask.equals(DataArray([[3, 9], [3, 0]], dims=("y", "x")))
|
56 | 57 |
|
57 |
| - mask = scale_and_offset(xx_values, scale=None, offset=None, ignore_missing=True) |
| 58 | + mask = scale_and_offset(xx_values) |
58 | 59 | assert mask.equals(DataArray([[3, 9], [3, 0]], dims=("y", "x")))
|
59 | 60 |
|
60 | 61 | 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"))) |
62 | 63 |
|
63 | 64 |
|
64 | 65 | # Test mask_invalid
|
65 | 66 | def test_mask_invalid_data():
|
66 | 67 | 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"))) |
68 | 69 |
|
69 | 70 | 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