From 3e26a67794df43426004fffdf6c8dcc1f02aa0e7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 03:14:15 +0000 Subject: [PATCH] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../plugins/l34_utils/l4_bare_gradation.py | 96 ++-- odc/stats/plugins/l34_utils/l4_cultivated.py | 94 ++-- .../plugins/l34_utils/l4_natural_aquatic.py | 455 +++++++++--------- odc/stats/plugins/l34_utils/l4_natural_veg.py | 126 ++--- odc/stats/plugins/l34_utils/l4_surface.py | 35 +- odc/stats/plugins/l34_utils/l4_veg_cover.py | 3 - odc/stats/plugins/l34_utils/l4_water.py | 41 +- .../plugins/l34_utils/l4_water_persistence.py | 18 +- odc/stats/plugins/l34_utils/lc_level3.py | 10 +- odc/stats/plugins/lc_level3.py | 10 +- odc/stats/plugins/lc_level34.py | 102 ++-- tests/test_lc_l4.py | 3 +- tests/test_lc_l4_ctv.py | 65 ++- tests/test_lc_l4_natural_surface.py | 60 ++- tests/test_lc_l4_nav.py | 215 +++++---- tests/test_lc_l4_ntv.py | 80 +-- tests/test_lc_l4_water.py | 80 ++- tests/test_lc_level3.py | 1 + 18 files changed, 788 insertions(+), 706 deletions(-) diff --git a/odc/stats/plugins/l34_utils/l4_bare_gradation.py b/odc/stats/plugins/l34_utils/l4_bare_gradation.py index 4f57ef9d..07b1f19f 100644 --- a/odc/stats/plugins/l34_utils/l4_bare_gradation.py +++ b/odc/stats/plugins/l34_utils/l4_bare_gradation.py @@ -1,53 +1,53 @@ - import xarray as xr from odc.stats._algebra import expr_eval + def bare_gradation(xx: xr.Dataset, bare_threshold, veg_cover, NODATA): - # Now add the bare gradation - fcp_nodaata = -999 - bs_mask = expr_eval( - "where(a!=nodata, a, NODATA)", - {"a": xx.bs_pc_50.data}, - name="mark_nodata", - dtype="uint8", - **{"nodata": fcp_nodaata, "NODATA": NODATA}, - ) - - # Map any data > 100 ---> 100 - bs_mask = expr_eval( - "where((a>100)&(a!=nodata), 100, a)", - {"a": bs_mask}, - name="mark_veg", - dtype="uint8", - **{"nodata": NODATA}, - ) - - # 60% <= data --> 15(0) - bs_mask = expr_eval( - "where((a>=m)&(a!=nodata), 150, a)", - {"a": bs_mask}, - name="mark_veg", - dtype="uint8", - **{"m": bare_threshold[1], "nodata": NODATA}, - ) - - # 20% <= data < 60% --> 12(0) - bs_mask = expr_eval( - "where((a>=m)&(a 10(0) - bs_mask = expr_eval( - "where(a 100 ---> 100 + bs_mask = expr_eval( + "where((a>100)&(a!=nodata), 100, a)", + {"a": bs_mask}, + name="mark_veg", + dtype="uint8", + **{"nodata": NODATA}, + ) + + # 60% <= data --> 15(0) + bs_mask = expr_eval( + "where((a>=m)&(a!=nodata), 150, a)", + {"a": bs_mask}, + name="mark_veg", + dtype="uint8", + **{"m": bare_threshold[1], "nodata": NODATA}, + ) + + # 20% <= data < 60% --> 12(0) + bs_mask = expr_eval( + "where((a>=m)&(a 10(0) + bs_mask = expr_eval( + "where(a= 0.2) l4 = expr_eval( "where((a==221)&(b==220)&(c==nodata), 99, a)", - {"a": l4, - "b": level3, - "c": water_persistence}, + {"a": l4, "b": level3, "c": water_persistence}, name="mark_water", dtype="uint8", **{"nodata": NODATA}, ) - + l4 = expr_eval( - "where((a==221), 98, a)", - {"a": l4}, - name="mark_water", - dtype="uint8" + "where((a==221), 98, a)", {"a": l4}, name="mark_water", dtype="uint8" ) - return l4 \ No newline at end of file + return l4 diff --git a/odc/stats/plugins/l34_utils/l4_water_persistence.py b/odc/stats/plugins/l34_utils/l4_water_persistence.py index d6aaac98..b2e6dfd3 100644 --- a/odc/stats/plugins/l34_utils/l4_water_persistence.py +++ b/odc/stats/plugins/l34_utils/l4_water_persistence.py @@ -1,8 +1,8 @@ - import xarray as xr - + from odc.stats._algebra import expr_eval + def water_persistence(xx: xr.Dataset, watper_threshold, NODATA): # Now add water persistence # water_mask = expr_eval( @@ -12,7 +12,7 @@ def water_persistence(xx: xr.Dataset, watper_threshold, NODATA): # dtype="uint8", # **{"nodata": NODATA}, # ) - + # 10 <= water_frequency < 1 --> 1(0) water_mask = expr_eval( "where((a>=m)&(a!=nodata), 100, a)", @@ -21,7 +21,7 @@ def water_persistence(xx: xr.Dataset, watper_threshold, NODATA): dtype="uint8", **{"m": watper_threshold[3], "nodata": NODATA}, ) - + # 7 <= water_frequency < 10 --> 7(0) water_mask = expr_eval( "where((a>=m)&(a 8(00) water_mask = expr_eval( "where((a>=m)&(a 9(00) water_mask = expr_eval( "where((a>=m)&(a 0 # water_mask = expr_eval( # "where(a<1, 0, a)", @@ -57,5 +57,5 @@ def water_persistence(xx: xr.Dataset, watper_threshold, NODATA): # dtype="uint8", # **{"m": watper_threshold[0]}, # ) - - return water_mask \ No newline at end of file + + return water_mask diff --git a/odc/stats/plugins/l34_utils/lc_level3.py b/odc/stats/plugins/l34_utils/lc_level3.py index 61ce471b..ae8b6ac8 100644 --- a/odc/stats/plugins/l34_utils/lc_level3.py +++ b/odc/stats/plugins/l34_utils/lc_level3.py @@ -18,11 +18,13 @@ def lc_level3(xx: xr.Dataset, NODATA): # Urban is classified on l3/4 surface output (210) urban_mask = l34_dss == 210 - l34_urban_cultivated_masked = xr.where( - urban_mask, urban_dss, l34_cultivated_masked - ) + l34_urban_cultivated_masked = xr.where(urban_mask, urban_dss, l34_cultivated_masked) # Replace nan with NODATA - l34_urban_cultivated_masked = xr.where(l34_urban_cultivated_masked==l34_urban_cultivated_masked, l34_urban_cultivated_masked, NODATA) + l34_urban_cultivated_masked = xr.where( + l34_urban_cultivated_masked == l34_urban_cultivated_masked, + l34_urban_cultivated_masked, + NODATA, + ) return intertidal_mask, l34_urban_cultivated_masked diff --git a/odc/stats/plugins/lc_level3.py b/odc/stats/plugins/lc_level3.py index abd17df1..c64c1e5f 100644 --- a/odc/stats/plugins/lc_level3.py +++ b/odc/stats/plugins/lc_level3.py @@ -25,7 +25,7 @@ def reduce(self, xx: xr.Dataset) -> xr.Dataset: l34_dss = xx.classes_l3_l4 urban_dss = xx.urban_classes cultivated_dss = xx.cultivated_class - + # Cultivated pipeline applies a mask which feeds only terrestrial veg (110) to the model # Just exclude no data (255) and apply the cultivated results cultivated_mask = cultivated_dss != int(NODATA) @@ -38,9 +38,11 @@ def reduce(self, xx: xr.Dataset) -> xr.Dataset: ) # Map intertidal areas to water - intertidal_mask = (l34_dss == 223) - dss = xr.where(intertidal_mask | (l34_dss == 221), 220, l34_urban_cultivated_masked) - + intertidal_mask = l34_dss == 223 + dss = xr.where( + intertidal_mask | (l34_dss == 221), 220, l34_urban_cultivated_masked + ) + # attrs = xx.attrs.copy() # attrs["nodata"] = NODATA # dss = dss.squeeze(dim=["spec"]) diff --git a/odc/stats/plugins/lc_level34.py b/odc/stats/plugins/lc_level34.py index 331d9636..c88741f4 100644 --- a/odc/stats/plugins/lc_level34.py +++ b/odc/stats/plugins/lc_level34.py @@ -10,12 +10,23 @@ from odc.stats._algebra import expr_eval from ._registry import StatsPluginInterface, register -from .l34_utils import l4_water_persistence, l4_veg_cover, lc_level3, l4_cultivated, l4_natural_veg, l4_natural_aquatic, l4_surface, l4_bare_gradation, l4_water +from .l34_utils import ( + l4_water_persistence, + l4_veg_cover, + lc_level3, + l4_cultivated, + l4_natural_veg, + l4_natural_aquatic, + l4_surface, + l4_bare_gradation, + l4_water, +) NODATA = 255 water_frequency_nodata = -999 + class StatsLccsLevel4(StatsPluginInterface): NAME = "ga_ls_lccs_veg_bare_class_a3" SHORT_NAME = NAME @@ -43,8 +54,10 @@ def __init__( self.watper_threshold = ( watper_threshold if watper_threshold is not None else [1, 4, 7, 10] ) - self.water_seasonality_threshold = water_seasonality_threshold if water_seasonality_threshold else 3 - + self.water_seasonality_threshold = ( + water_seasonality_threshold if water_seasonality_threshold else 3 + ) + # The mapping below are from the LC KH page # Map vegetation cover classes self.veg_mapping = {160: 16, 150: 15, 130: 13, 120: 12, 100: 10} @@ -52,14 +65,10 @@ def __init__( self.bs_mapping = {100: 10, 120: 12, 150: 15} # Map values to the classes expected in water persistence in land cover Level-4 output self.waterper_wat_mapping = {100: 1, 70: 7, 80: 8, 90: 9} - @property def measurements(self) -> Tuple[str, ...]: - _measurements = [ - "level3", - "level4" - ] + _measurements = ["level3", "level4"] return _measurements def native_transform(self, xx): @@ -76,24 +85,24 @@ def apply_mapping(data, class_mapping): def define_life_form(self, xx: xr.Dataset): lifeform = xx.woody_cover.data - + # 113 ----> 1 woody # 114 ----> 2 herbaceous lifeform_mask = expr_eval( "where(a==113, 1, a)", {"a": xx.woody_cover.data}, name="mark_lifeform", - dtype="uint8" + dtype="uint8", ) lifeform_mask = expr_eval( "where(a==114, 2, a)", {"a": lifeform_mask}, name="mark_lifeform", - dtype="uint8" + dtype="uint8", ) - + return lifeform_mask - + def define_water_seasonality(self, xx: xr.Dataset): # >= 3 months ----> 1 Semi-permanent or permanent # < 3 months ----> 2 Temporary or seasonal @@ -117,69 +126,84 @@ def define_water_seasonality(self, xx: xr.Dataset): {"a": water_season_mask}, name="mark_water_season", dtype="uint8", - **{"watseas_trh": self.water_seasonality_threshold, - "watersea_nodata": water_frequency_nodata}, + **{ + "watseas_trh": self.water_seasonality_threshold, + "watersea_nodata": water_frequency_nodata, + }, ) - mapping = {100:1, 200:2} + mapping = {100: 1, 200: 2} water_season_mask = self.apply_mapping(water_season_mask, mapping) - + return water_season_mask - def reduce(self, xx: xr.Dataset) -> xr.Dataset: - intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) - + intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) + # Vegetation cover fc_nodata = -9999 - veg_cover = l4_veg_cover.canopyco_veg_con(xx, self.veg_threshold, NODATA, fc_nodata) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, self.veg_threshold, NODATA, fc_nodata + ) # Define mapping from current output to expected a3 output veg_cover = self.apply_mapping(veg_cover, self.veg_mapping) # Define life form lifeform = self.define_life_form(xx) # Apply cultivated Level-4 classes (1-18) - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) # Apply terrestrial vegetation classes [19-36] - l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg(l4_ctv, level3, lifeform, veg_cover) + l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg( + l4_ctv, level3, lifeform, veg_cover + ) # Bare gradation - bare_gradation = l4_bare_gradation.bare_gradation(xx, self.bare_threshold, veg_cover, NODATA) + bare_gradation = l4_bare_gradation.bare_gradation( + xx, self.bare_threshold, veg_cover, NODATA + ) # Apply bare gradation expected output classes bare_gradation = self.apply_mapping(bare_gradation, self.bs_mapping) - # Water persistence - water_persistence = l4_water_persistence.water_persistence(xx, self.watper_threshold, NODATA) + water_persistence = l4_water_persistence.water_persistence( + xx, self.watper_threshold, NODATA + ) # Apply water persistence expcted classes - water_persistence = self.apply_mapping(water_persistence, self.waterper_wat_mapping) - - water_seasonality = self.define_water_seasonality(xx) + water_persistence = self.apply_mapping( + water_persistence, self.waterper_wat_mapping + ) + + water_seasonality = self.define_water_seasonality(xx) - l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg(l4_ctv_ntv, lifeform, veg_cover, water_seasonality) - l4_ctv_ntv_nav_surface = l4_surface.lc_l4_surface(l4_ctv_ntv_nav, level3, bare_gradation) + l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) + l4_ctv_ntv_nav_surface = l4_surface.lc_l4_surface( + l4_ctv_ntv_nav, level3, bare_gradation + ) # #TODO WATER (99-104) - l4_ctv_ntv_nav_surface_water = l4_water.water_classification(l4_ctv_ntv_nav_surface, level3, intertidal_mask, water_persistence, NODATA) + l4_ctv_ntv_nav_surface_water = l4_water.water_classification( + l4_ctv_ntv_nav_surface, level3, intertidal_mask, water_persistence, NODATA + ) attrs = xx.attrs.copy() attrs["nodata"] = NODATA l3 = level3.squeeze(dim=["spec"]) dims = level3.dims - attrs = xx.attrs.copy() attrs["nodata"] = int(NODATA) data_vars = { - "level3": xr.DataArray( - level3, dims=xx["pv_pc_50"].dims, attrs=attrs - ), + "level3": xr.DataArray(level3, dims=xx["pv_pc_50"].dims, attrs=attrs), "level4": xr.DataArray( l4_ctv_ntv_nav_surface_water, dims=xx["pv_pc_50"].dims, attrs=attrs - ) + ), } - + coords = dict((dim, xx.coords[dim]) for dim in dims) return xr.Dataset(data_vars=data_vars, coords=coords, attrs=xx.attrs) -register("lc_l3_l4", StatsLccsLevel4) \ No newline at end of file +register("lc_l3_l4", StatsLccsLevel4) diff --git a/tests/test_lc_l4.py b/tests/test_lc_l4.py index cc37fa0f..92e57c03 100644 --- a/tests/test_lc_l4.py +++ b/tests/test_lc_l4.py @@ -8,6 +8,7 @@ [220, 255, 220], ] + @pytest.fixture(scope="module") def image_groups(): l34 = np.array( @@ -76,4 +77,4 @@ def test_l3_classes(image_groups): lc_level3 = StatsLccsLevel3() intertidal_mask, level3_classes = lc_level3.reduce(image_groups) - assert (level3_classes == expected_l3_classes).all() \ No newline at end of file + assert (level3_classes == expected_l3_classes).all() diff --git a/tests/test_lc_l4_ctv.py b/tests/test_lc_l4_ctv.py index 52469585..bd21dde9 100644 --- a/tests/test_lc_l4_ctv.py +++ b/tests/test_lc_l4_ctv.py @@ -13,7 +13,7 @@ # @pytest.fixture(scope="module") def image_groups(l34, urban, cultivated, woody, pv_pc_50): - + tuples = [ (np.datetime64("2000-01-01T00"), np.datetime64("2000-01-01")), ] @@ -101,7 +101,7 @@ def test_ctv_classes_woody(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -114,16 +114,21 @@ def test_ctv_classes_woody(): dtype="int", ) xx = image_groups(l34, urban, cultivated, woody, pv_pc_50) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) - - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) assert (l4_ctv.compute() == expected_cultivated_classes).all() + def test_ctv_classes_herbaceous(): expected_cultivated_classes = [ @@ -180,7 +185,7 @@ def test_ctv_classes_herbaceous(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -193,14 +198,18 @@ def test_ctv_classes_herbaceous(): dtype="int", ) xx = image_groups(l34, urban, cultivated, woody, pv_pc_50) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) - - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) assert (l4_ctv.compute() == expected_cultivated_classes).all() @@ -212,7 +221,7 @@ def test_ctv_classes_woody_herbaceous(): [13, 11, 11], [17, 18, 15], ] - + l34 = np.array( [ [ @@ -260,7 +269,7 @@ def test_ctv_classes_woody_herbaceous(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -273,14 +282,18 @@ def test_ctv_classes_woody_herbaceous(): dtype="int", ) xx = image_groups(l34, urban, cultivated, woody, pv_pc_50) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) - - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) assert (l4_ctv.compute() == expected_cultivated_classes).all() @@ -292,7 +305,7 @@ def test_ctv_classes_no_vegcover(): [2, 2, 2], [3, 3, 3], ] - + l34 = np.array( [ [ @@ -340,7 +353,7 @@ def test_ctv_classes_no_vegcover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -353,12 +366,16 @@ def test_ctv_classes_no_vegcover(): dtype="int", ) xx = image_groups(l34, urban, cultivated, woody, pv_pc_50) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) - - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) - assert (l4_ctv.compute() == expected_cultivated_classes).all() \ No newline at end of file + + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) + assert (l4_ctv.compute() == expected_cultivated_classes).all() diff --git a/tests/test_lc_l4_natural_surface.py b/tests/test_lc_l4_natural_surface.py index 7f7ab516..b8016840 100644 --- a/tests/test_lc_l4_natural_surface.py +++ b/tests/test_lc_l4_natural_surface.py @@ -6,7 +6,15 @@ import xarray as xr import dask.array as da from odc.stats.plugins.lc_level34 import StatsLccsLevel4 -from odc.stats.plugins.l34_utils import l4_cultivated, lc_level3, l4_veg_cover, l4_natural_veg, l4_natural_aquatic, l4_surface, l4_bare_gradation +from odc.stats.plugins.l34_utils import ( + l4_cultivated, + lc_level3, + l4_veg_cover, + l4_natural_veg, + l4_natural_aquatic, + l4_surface, + l4_bare_gradation, +) import pytest import pandas as pd @@ -17,7 +25,7 @@ def image_groups(l34, urban, woody, bs_pc_50, pv_pc_50, cultivated, water_frequency): - + tuples = [ (np.datetime64("2000-01-01T00"), np.datetime64("2000-01-01")), ] @@ -61,8 +69,8 @@ def test_ns(): [97, 96, 96], [95, 95, 95], [94, 95, 96], - ] - + ] + l34 = np.array( [ [ @@ -86,7 +94,7 @@ def test_ns(): ], dtype="int", ) - + woody = np.array( [ [ @@ -98,7 +106,7 @@ def test_ns(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -122,7 +130,7 @@ def test_ns(): ], dtype="int", ) - # 112 --> natural veg + # 112 --> natural veg cultivated = np.array( [ [ @@ -146,27 +154,39 @@ def test_ns(): ], dtype="int", ) - - xx = image_groups(l34, urban, woody, bs_pc_50, pv_pc_50, cultivated, water_frequency) - + + xx = image_groups( + l34, urban, woody, bs_pc_50, pv_pc_50, cultivated, water_frequency + ) + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) # Apply cultivated to match the code in Level4 processing - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg(l4_ctv, level3, lifeform, veg_cover) - - water_seasonality = stats_l4.define_water_seasonality(xx) - l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg(l4_ctv_ntv, lifeform, veg_cover, water_seasonality) - # Bare gradation - bare_gradation = l4_bare_gradation.bare_gradation(xx, stats_l4.bare_threshold, veg_cover, NODATA) + water_seasonality = stats_l4.define_water_seasonality(xx) + l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) + + # Bare gradation + bare_gradation = l4_bare_gradation.bare_gradation( + xx, stats_l4.bare_threshold, veg_cover, NODATA + ) # Apply bare gradation expected output classes bare_gradation = stats_l4.apply_mapping(bare_gradation, stats_l4.bs_mapping) - - l4_ctv_ntv_nav_surface = l4_surface.lc_l4_surface(l4_ctv_ntv_nav, level3, bare_gradation) - + + l4_ctv_ntv_nav_surface = l4_surface.lc_l4_surface( + l4_ctv_ntv_nav, level3, bare_gradation + ) + assert (l4_ctv_ntv_nav_surface.compute() == expected_l4_srf_classes).all() diff --git a/tests/test_lc_l4_nav.py b/tests/test_lc_l4_nav.py index 8b7dc370..b37b7315 100644 --- a/tests/test_lc_l4_nav.py +++ b/tests/test_lc_l4_nav.py @@ -6,7 +6,14 @@ import xarray as xr import dask.array as da from odc.stats.plugins.lc_level34 import StatsLccsLevel4 -from odc.stats.plugins.l34_utils import l4_cultivated, lc_level3, l4_veg_cover, l4_natural_veg, l4_water_persistence, l4_natural_aquatic +from odc.stats.plugins.l34_utils import ( + l4_cultivated, + lc_level3, + l4_veg_cover, + l4_natural_veg, + l4_water_persistence, + l4_natural_aquatic, +) import pytest import pandas as pd @@ -17,7 +24,7 @@ def image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency): - + tuples = [ (np.datetime64("2000-01-01T00"), np.datetime64("2000-01-01")), ] @@ -53,12 +60,7 @@ def image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency): def test_ntv_classes_woody_herbaceous(): - expected_l4_ntv_classes = [ - [56, 56, 56], - [56, 56, 55], - [57, 57, 57], - [57, 57, 55] - ] + expected_l4_ntv_classes = [[56, 56, 56], [56, 56, 55], [57, 57, 57], [57, 57, 55]] l34 = np.array( [ @@ -107,7 +109,7 @@ def test_ntv_classes_woody_herbaceous(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -119,7 +121,7 @@ def test_ntv_classes_woody_herbaceous(): ], dtype="int", ) - + water_frequency = np.array( [ [ @@ -131,21 +133,27 @@ def test_ntv_classes_woody_herbaceous(): ], dtype="int", ) - + xx = image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) # Apply cultivated to match the code in Level4 processing - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg(l4_ctv, level3, lifeform, veg_cover) - - water_seasonality = stats_l4.define_water_seasonality(xx) - l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg(l4_ctv_ntv, lifeform, veg_cover, water_seasonality) + + water_seasonality = stats_l4.define_water_seasonality(xx) + l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) assert (l4_ctv_ntv_nav.compute() == expected_l4_ntv_classes).all() @@ -205,7 +213,7 @@ def test_ntv_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -220,7 +228,7 @@ def test_ntv_veg_cover(): water_frequency = np.array( [ [ - [-9999, -9999,- 9999], + [-9999, -9999, -9999], [-9999, -9999, -9999], [-9999, -9999, -9999], [-9999, -9999, -9999], @@ -228,23 +236,30 @@ def test_ntv_veg_cover(): ], dtype="int", ) - + xx = image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) # Apply cultivated to match the code in Level4 processing - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg(l4_ctv, level3, lifeform, veg_cover) - - water_seasonality = stats_l4.define_water_seasonality(xx) - l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg(l4_ctv_ntv, lifeform, veg_cover, water_seasonality) + + water_seasonality = stats_l4.define_water_seasonality(xx) + l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) assert (l4_ctv_ntv_nav.compute() == expected_l4_ntv_classes).all() + def test_ntv_woody_veg_cover(): expected_l4_ntv_classes = [ [75, 66, 63], @@ -300,7 +315,7 @@ def test_ntv_woody_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -315,7 +330,7 @@ def test_ntv_woody_veg_cover(): water_frequency = np.array( [ [ - [-9999, -9999,- 9999], + [-9999, -9999, -9999], [-9999, -9999, -9999], [-9999, -9999, -9999], [-9999, -9999, -9999], @@ -323,21 +338,27 @@ def test_ntv_woody_veg_cover(): ], dtype="int", ) - + xx = image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) # Apply cultivated to match the code in Level4 processing - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg(l4_ctv, level3, lifeform, veg_cover) - - water_seasonality = stats_l4.define_water_seasonality(xx) - l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg(l4_ctv_ntv, lifeform, veg_cover, water_seasonality) + + water_seasonality = stats_l4.define_water_seasonality(xx) + l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) assert (l4_ctv_ntv_nav.compute() == expected_l4_ntv_classes).all() @@ -396,7 +417,7 @@ def test_ntv_woody_seasonal_water_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -419,24 +440,31 @@ def test_ntv_woody_seasonal_water_veg_cover(): ], dtype="int", ) - + xx = image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) # Apply cultivated to match the code in Level4 processing - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg(l4_ctv, level3, lifeform, veg_cover) - - water_seasonality = stats_l4.define_water_seasonality(xx) - l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg(l4_ctv_ntv, lifeform, veg_cover, water_seasonality) + + water_seasonality = stats_l4.define_water_seasonality(xx) + l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) assert (l4_ctv_ntv_nav.compute() == expected_l4_ntv_classes).all() + def test_ntv_woody_permanent_water_veg_cover(): expected_l4_ntv_classes = [ [76, 67, 64], @@ -492,7 +520,7 @@ def test_ntv_woody_permanent_water_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -515,30 +543,32 @@ def test_ntv_woody_permanent_water_veg_cover(): ], dtype="int", ) - + xx = image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) # Apply cultivated to match the code in Level4 processing - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg(l4_ctv, level3, lifeform, veg_cover) - - water_seasonality = stats_l4.define_water_seasonality(xx) - l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg(l4_ctv_ntv, lifeform, veg_cover, water_seasonality) + + water_seasonality = stats_l4.define_water_seasonality(xx) + l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) assert (l4_ctv_ntv_nav.compute() == expected_l4_ntv_classes).all() + def test_ntv_herbaceous_veg_cover(): - expected_l4_ntv_classes = [ - [90, 81, 78], - [78, 81, 81], - [90, 84, 84], - [87, 90, 81] - ] + expected_l4_ntv_classes = [[90, 81, 78], [78, 81, 81], [90, 84, 84], [87, 90, 81]] l34 = np.array( [ @@ -587,7 +617,7 @@ def test_ntv_herbaceous_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -602,7 +632,7 @@ def test_ntv_herbaceous_veg_cover(): water_frequency = np.array( [ [ - [-9999, -9999,- 9999], + [-9999, -9999, -9999], [-9999, -9999, -9999], [-9999, -9999, -9999], [-9999, -9999, -9999], @@ -610,21 +640,27 @@ def test_ntv_herbaceous_veg_cover(): ], dtype="int", ) - + xx = image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) # Apply cultivated to match the code in Level4 processing - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg(l4_ctv, level3, lifeform, veg_cover) - - water_seasonality = stats_l4.define_water_seasonality(xx) - l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg(l4_ctv_ntv, lifeform, veg_cover, water_seasonality) + + water_seasonality = stats_l4.define_water_seasonality(xx) + l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) assert (l4_ctv_ntv_nav.compute() == expected_l4_ntv_classes).all() @@ -683,7 +719,7 @@ def test_ntv_herbaceous_seasonal_water_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -706,24 +742,31 @@ def test_ntv_herbaceous_seasonal_water_veg_cover(): ], dtype="int", ) - + xx = image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) # Apply cultivated to match the code in Level4 processing - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg(l4_ctv, level3, lifeform, veg_cover) - - water_seasonality = stats_l4.define_water_seasonality(xx) - l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg(l4_ctv_ntv, lifeform, veg_cover, water_seasonality) + + water_seasonality = stats_l4.define_water_seasonality(xx) + l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) assert (l4_ctv_ntv_nav.compute() == expected_l4_ntv_classes).all() + def test_ntv_herbaceous_permanent_water_veg_cover(): expected_l4_ntv_classes = [ [91, 82, 79], @@ -779,7 +822,7 @@ def test_ntv_herbaceous_permanent_water_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -802,19 +845,25 @@ def test_ntv_herbaceous_permanent_water_veg_cover(): ], dtype="int", ) - + xx = image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) # Apply cultivated to match the code in Level4 processing - l4_ctv = l4_cultivated.lc_l4_cultivated(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ctv = l4_cultivated.lc_l4_cultivated( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) l4_ctv_ntv = l4_natural_veg.lc_l4_natural_veg(l4_ctv, level3, lifeform, veg_cover) - - water_seasonality = stats_l4.define_water_seasonality(xx) - l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg(l4_ctv_ntv, lifeform, veg_cover, water_seasonality) - assert (l4_ctv_ntv_nav.compute() == expected_l4_ntv_classes).all() \ No newline at end of file + + water_seasonality = stats_l4.define_water_seasonality(xx) + l4_ctv_ntv_nav = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) + assert (l4_ctv_ntv_nav.compute() == expected_l4_ntv_classes).all() diff --git a/tests/test_lc_l4_ntv.py b/tests/test_lc_l4_ntv.py index 77886a3c..4059e679 100644 --- a/tests/test_lc_l4_ntv.py +++ b/tests/test_lc_l4_ntv.py @@ -6,7 +6,12 @@ import xarray as xr import dask.array as da from odc.stats.plugins.lc_level34 import StatsLccsLevel4 -from odc.stats.plugins.l34_utils import l4_cultivated, lc_level3, l4_veg_cover, l4_natural_veg +from odc.stats.plugins.l34_utils import ( + l4_cultivated, + lc_level3, + l4_veg_cover, + l4_natural_veg, +) import pytest import pandas as pd @@ -14,9 +19,10 @@ NODATA = 255 FC_NODATA = -9999 + # @pytest.fixture(scope="module") def image_groups(l34, urban, cultivated, woody, pv_pc_50): - + tuples = [ (np.datetime64("2000-01-01T00"), np.datetime64("2000-01-01")), ] @@ -49,12 +55,12 @@ def image_groups(l34, urban, cultivated, woody, pv_pc_50): def test_ntv_classes_herbaceous(): - + expected_natural_terrestrial_veg_classes = [ [36, 33, 32], [110, 33, 33], [36, 34, 34], - [35, 36, 33] + [35, 36, 33], ] l34 = np.array( @@ -104,7 +110,7 @@ def test_ntv_classes_herbaceous(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -117,24 +123,28 @@ def test_ntv_classes_herbaceous(): dtype="int", ) xx = image_groups(l34, urban, cultivated, woody, pv_pc_50) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) - l4_ntv = l4_natural_veg.lc_l4_natural_veg(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ntv = l4_natural_veg.lc_l4_natural_veg( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) assert (l4_ntv.compute() == expected_natural_terrestrial_veg_classes).all() def test_ntv_classes_woody(): - + expected_natural_terrestrial_veg_classes = [ - [31, 28, 27], + [31, 28, 27], [110, 28, 28], [31, 29, 29], - [30, 26, 28] + [30, 26, 28], ] l34 = np.array( @@ -184,7 +194,7 @@ def test_ntv_classes_woody(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -197,23 +207,28 @@ def test_ntv_classes_woody(): dtype="int", ) xx = image_groups(l34, urban, cultivated, woody, pv_pc_50) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) - l4_ntv = l4_natural_veg.lc_l4_natural_veg(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ntv = l4_natural_veg.lc_l4_natural_veg( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) assert (l4_ntv.compute() == expected_natural_terrestrial_veg_classes).all() + def test_ntv_classes_no_veg(): - + expected_natural_terrestrial_veg_classes = [ [20, 20, 20], [110, 21, 21], [20, 20, 20], - [21, 21, 21] + [21, 21, 21], ] l34 = np.array( @@ -263,7 +278,7 @@ def test_ntv_classes_no_veg(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -276,23 +291,28 @@ def test_ntv_classes_no_veg(): dtype="int", ) xx = image_groups(l34, urban, cultivated, woody, pv_pc_50) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) - l4_ntv = l4_natural_veg.lc_l4_natural_veg(xx.classes_l3_l4, level3, lifeform, veg_cover) + l4_ntv = l4_natural_veg.lc_l4_natural_veg( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) assert (l4_ntv.compute() == expected_natural_terrestrial_veg_classes).all() + def test_ntv_classes_no_lifeform(): - + expected_natural_terrestrial_veg_classes = [ [26, 23, 22], [22, 23, 23], [26, 24, 24], - [25, 26, 23] + [25, 26, 23], ] l34 = np.array( @@ -342,7 +362,7 @@ def test_ntv_classes_no_lifeform(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -355,12 +375,16 @@ def test_ntv_classes_no_lifeform(): dtype="int", ) xx = image_groups(l34, urban, cultivated, woody, pv_pc_50) - + stats_l4 = StatsLccsLevel4() intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) - l4_ntv = l4_natural_veg.lc_l4_natural_veg(xx.classes_l3_l4, level3, lifeform, veg_cover) - assert (l4_ntv.compute() == expected_natural_terrestrial_veg_classes).all() \ No newline at end of file + l4_ntv = l4_natural_veg.lc_l4_natural_veg( + xx.classes_l3_l4, level3, lifeform, veg_cover + ) + assert (l4_ntv.compute() == expected_natural_terrestrial_veg_classes).all() diff --git a/tests/test_lc_l4_water.py b/tests/test_lc_l4_water.py index 3095c775..b0448bc6 100644 --- a/tests/test_lc_l4_water.py +++ b/tests/test_lc_l4_water.py @@ -7,7 +7,17 @@ import dask.array as da from odc.stats.plugins.lc_level34 import StatsLccsLevel4 from odc.stats.plugins.lc_level3 import StatsLccsLevel3 -from odc.stats.plugins.l34_utils import l4_cultivated, lc_level3, l4_veg_cover, l4_natural_veg, l4_natural_aquatic, l4_bare_gradation, l4_water_persistence, l4_surface, l4_water +from odc.stats.plugins.l34_utils import ( + l4_cultivated, + lc_level3, + l4_veg_cover, + l4_natural_veg, + l4_natural_aquatic, + l4_bare_gradation, + l4_water_persistence, + l4_surface, + l4_water, +) import pytest import pandas as pd @@ -15,9 +25,10 @@ NODATA = 255 FC_NODATA = -999 + # @pytest.fixture(scope="module") def image_groups(l34, urban, cultivated, woody, bs_pc_50, pv_pc_50, water_frequency): - + tuples = [ (np.datetime64("2000-01-01T00"), np.datetime64("2000-01-01")), ] @@ -56,12 +67,12 @@ def image_groups(l34, urban, cultivated, woody, bs_pc_50, pv_pc_50, water_freque def test_water_classes(): - + expected_water_classes = [ [104, 104, 104], [103, 103, 103], [102, 102, 101], - [101, 101, 101] + [101, 101, 101], ] l34 = np.array( @@ -111,7 +122,7 @@ def test_water_classes(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -145,31 +156,42 @@ def test_water_classes(): ], dtype="int", ) - xx = image_groups(l34, urban, cultivated, woody, bs_pc_50, pv_pc_50, water_frequency) - + xx = image_groups( + l34, urban, cultivated, woody, bs_pc_50, pv_pc_50, water_frequency + ) + stats_l4 = StatsLccsLevel4() stats_l3 = StatsLccsLevel3() intertidal_mask, level3 = stats_l3.reduce(xx) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) - + # Water persistence - water_persistence = l4_water_persistence.water_persistence(xx, stats_l4.watper_threshold, NODATA) + water_persistence = l4_water_persistence.water_persistence( + xx, stats_l4.watper_threshold, NODATA + ) # Apply water persistence expcted classes - water_persistence = stats_l4.apply_mapping(water_persistence, stats_l4.waterper_wat_mapping) - l4_water_classes = l4_water.water_classification(xx.classes_l3_l4, level3, intertidal_mask, water_persistence, NODATA) - + water_persistence = stats_l4.apply_mapping( + water_persistence, stats_l4.waterper_wat_mapping + ) + l4_water_classes = l4_water.water_classification( + xx.classes_l3_l4, level3, intertidal_mask, water_persistence, NODATA + ) + assert (l4_water_classes.compute() == expected_water_classes).all() + def test_water_intertidal(): - + expected_water_classes = [ [104, 104, 104], [103, 103, 103], [102, 102, 101], - [101, 99, 99] + [101, 99, 99], ] l34 = np.array( @@ -219,7 +241,7 @@ def test_water_intertidal(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -253,20 +275,30 @@ def test_water_intertidal(): ], dtype="int", ) - xx = image_groups(l34, urban, cultivated, woody, bs_pc_50, pv_pc_50, water_frequency) - + xx = image_groups( + l34, urban, cultivated, woody, bs_pc_50, pv_pc_50, water_frequency + ) + stats_l4 = StatsLccsLevel4() stats_l3 = StatsLccsLevel3() intertidal_mask, level3 = stats_l3.reduce(xx) lifeform = stats_l4.define_life_form(xx) - veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold, NODATA, FC_NODATA) + veg_cover = l4_veg_cover.canopyco_veg_con( + xx, stats_l4.veg_threshold, NODATA, FC_NODATA + ) veg_cover = stats_l4.apply_mapping(veg_cover, stats_l4.veg_mapping) - + # Water persistence - water_persistence = l4_water_persistence.water_persistence(xx, stats_l4.watper_threshold, NODATA) + water_persistence = l4_water_persistence.water_persistence( + xx, stats_l4.watper_threshold, NODATA + ) # Apply water persistence expcted classes - water_persistence = stats_l4.apply_mapping(water_persistence, stats_l4.waterper_wat_mapping) - l4_water_classes = l4_water.water_classification(xx.classes_l3_l4, level3, intertidal_mask, water_persistence, NODATA) + water_persistence = stats_l4.apply_mapping( + water_persistence, stats_l4.waterper_wat_mapping + ) + l4_water_classes = l4_water.water_classification( + xx.classes_l3_l4, level3, intertidal_mask, water_persistence, NODATA + ) - assert (l4_water_classes.compute() == expected_water_classes).all() \ No newline at end of file + assert (l4_water_classes.compute() == expected_water_classes).all() diff --git a/tests/test_lc_level3.py b/tests/test_lc_level3.py index 4b89d619..a7a50c89 100644 --- a/tests/test_lc_level3.py +++ b/tests/test_lc_level3.py @@ -12,6 +12,7 @@ [220, 255, 220], ] + @pytest.fixture(scope="module") def image_groups(): l34 = np.array(