From 9a6c987c37941d9313391e76a3fe3e0a774e576d 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 12:21:02 +0000 Subject: [PATCH] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .pre-commit-config.yaml | 2 +- .../plugins/l34_utils/l4_bare_gradation.py | 96 ++-- odc/stats/plugins/l34_utils/l4_cultivated.py | 91 ++-- .../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 | 4 +- odc/stats/plugins/l34_utils/l4_water.py | 42 +- .../plugins/l34_utils/l4_water_persistence.py | 19 +- odc/stats/plugins/l34_utils/lc_level3.py | 8 +- odc/stats/plugins/lc_level34.py | 105 ++-- tests/test_lc_l4.py | 3 +- tests/test_lc_l4_ctv.py | 50 +- tests/test_lc_l4_natural_surface.py | 57 ++- tests/test_lc_l4_nav.py | 184 ++++--- tests/test_lc_l4_ntv.py | 64 ++- tests/test_lc_l4_water.py | 78 ++- tests/test_lc_level3.py | 3 +- 18 files changed, 730 insertions(+), 692 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cbe6fbe5..7b022429 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -40,4 +40,4 @@ repos: "-rn", # Only display messages "-sn", # Don't display the score "--rcfile=pylintrc", # Link to your config file - ] \ No newline at end of file + ] diff --git a/odc/stats/plugins/l34_utils/l4_bare_gradation.py b/odc/stats/plugins/l34_utils/l4_bare_gradation.py index 81ee9936..d99d9b2b 100644 --- a/odc/stats/plugins/l34_utils/l4_bare_gradation.py +++ b/odc/stats/plugins/l34_utils/l4_bare_gradation.py @@ -1,55 +1,55 @@ - import xarray as xr from odc.stats._algebra import expr_eval NODATA = 255 + def bare_gradation(xx: xr.Dataset, bare_threshold, veg_cover): - # 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==220)&(b==1), 100, c)", - {"a": level3, - "b": intertidal_mask, - "c": l4}, + {"a": level3, "b": intertidal_mask, "c": l4}, name="mark_water", dtype="uint8", ) - + 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 44542296..20a8c932 100644 --- a/odc/stats/plugins/l34_utils/l4_water_persistence.py +++ b/odc/stats/plugins/l34_utils/l4_water_persistence.py @@ -1,9 +1,10 @@ - import xarray as xr - + from odc.stats._algebra import expr_eval + NODATA = 255 + def water_persistence(xx: xr.Dataset, watper_threshold): # Now add water persistence # water_mask = expr_eval( @@ -13,7 +14,7 @@ def water_persistence(xx: xr.Dataset, watper_threshold): # dtype="uint8", # **{"nodata": NODATA}, # ) - + # 10 <= water_frequency < 1 --> 1(0) water_mask = expr_eval( "where((a>=m)&(a!=nodata), 100, a)", @@ -22,7 +23,7 @@ def water_persistence(xx: xr.Dataset, watper_threshold): 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)", @@ -58,5 +59,5 @@ def water_persistence(xx: xr.Dataset, watper_threshold): # 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 fdf2de4c..1eaf4a19 100644 --- a/odc/stats/plugins/l34_utils/lc_level3.py +++ b/odc/stats/plugins/l34_utils/lc_level3.py @@ -4,6 +4,7 @@ NODATA = 255 + def lc_level3(xx: xr.Dataset): # Cultivated pipeline applies a mask which feeds only terrestrial veg (110) to the model @@ -41,14 +42,9 @@ def lc_level3(xx: xr.Dataset): # Add intertidal as water res = expr_eval( "where((a==223)|(a==221)|(c==1), 220, b)", - { - "a": xx.classes_l3_l4.data, - "b": res, - "c": intertidal_mask - }, + {"a": xx.classes_l3_l4.data, "b": res, "c": intertidal_mask}, name="mark_urban", dtype="uint8", ) return intertidal_mask, res - diff --git a/odc/stats/plugins/lc_level34.py b/odc/stats/plugins/lc_level34.py index 1294d28d..1433d2d3 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_Level34" 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,19 +126,20 @@ 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) - + # Vegetation cover veg_cover = l4_veg_cover.canopyco_veg_con(xx, self.veg_threshold) # Define mapping from current output to expected a3 output @@ -138,55 +148,66 @@ def reduce(self, xx: xr.Dataset) -> xr.Dataset: 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 + ) print("***** CULATIVATED: ", np.unique(l4_ctv.compute())) # 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 + ) print("***** CULATIVATED NTV : ", np.unique(l4_ctv_ntv.compute())) - + # Bare gradation - bare_gradation = l4_bare_gradation.bare_gradation(xx, self.bare_threshold, veg_cover) + bare_gradation = l4_bare_gradation.bare_gradation( + xx, self.bare_threshold, veg_cover + ) # 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) + water_persistence = l4_water_persistence.water_persistence( + xx, self.watper_threshold + ) # 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 = l4_natural_aquatic.natural_auquatic_veg( + l4_ctv_ntv, lifeform, veg_cover, water_seasonality + ) print("***** NAV : ", np.unique(l4_ctv_ntv_nav.compute())) - 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 + ) print("***** SURFACE : ", np.unique(l4_ctv_ntv_nav_surface.compute())) # #TODO WATER (99-104) - level4 = l4_water.water_classification(l4_ctv_ntv_nav_surface, level3, intertidal_mask, water_persistence) - print("***** LEVEL3:", np.unique(level3.compute())) + level4 = l4_water.water_classification( + l4_ctv_ntv_nav_surface, level3, intertidal_mask, water_persistence + ) + print("***** LEVEL3:", np.unique(level3.compute())) attrs = xx.attrs.copy() attrs["nodata"] = NODATA # l3 = level3.squeeze(dim=["spec"]) dims = xx.squeeze(dim=["spec"]).dims - + attrs = xx.attrs.copy() attrs["nodata"] = int(NODATA) level3 = level3.astype(np.uint8) level4 = level4.astype(np.uint8) data_vars = { - "level3": xr.DataArray( - level3, dims=xx["pv_pc_50"].dims, attrs=attrs - ), - "level4": xr.DataArray( - level4, dims=xx["pv_pc_50"].dims, attrs=attrs - ) + "level3": xr.DataArray(level3, dims=xx["pv_pc_50"].dims, attrs=attrs), + "level4": xr.DataArray(level4, dims=xx["pv_pc_50"].dims, attrs=attrs), } - + coords = dict((dim, xx.coords[dim]) for dim in dims) - + print(xr.Dataset(data_vars=data_vars, coords=coords, attrs=xx.attrs)) 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 6164d2c4..0a605392 100644 --- a/tests/test_lc_l4.py +++ b/tests/test_lc_l4.py @@ -10,6 +10,7 @@ NODATA = 255 + @pytest.fixture(scope="module") def image_groups(): l34 = np.array( @@ -79,4 +80,4 @@ def test_l4_classes(image_groups): intertidal_mask, level3 = lc_level3.lc_level3(xx, NODATA) # 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 9495163b..f5d12713 100644 --- a/tests/test_lc_l4_ctv.py +++ b/tests/test_lc_l4_ctv.py @@ -9,8 +9,9 @@ NODATA = 255 + def image_groups(l34, urban, cultivated, woody, pv_pc_50): - + tuples = [ (np.datetime64("2000-01-01T00"), np.datetime64("2000-01-01")), ] @@ -98,7 +99,7 @@ def test_ctv_classes_woody(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -111,16 +112,19 @@ 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) lifeform = stats_l4.define_life_form(xx) veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold) 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 = [ @@ -177,7 +181,7 @@ def test_ctv_classes_herbaceous(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -190,14 +194,16 @@ 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) lifeform = stats_l4.define_life_form(xx) veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold) 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() @@ -209,7 +215,7 @@ def test_ctv_classes_woody_herbaceous(): [13, 11, 11], [17, 18, 15], ] - + l34 = np.array( [ [ @@ -257,7 +263,7 @@ def test_ctv_classes_woody_herbaceous(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -270,14 +276,16 @@ 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) lifeform = stats_l4.define_life_form(xx) veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold) 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() @@ -289,7 +297,7 @@ def test_ctv_classes_no_vegcover(): [2, 2, 2], [3, 3, 3], ] - + l34 = np.array( [ [ @@ -337,7 +345,7 @@ def test_ctv_classes_no_vegcover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -350,12 +358,14 @@ 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) lifeform = stats_l4.define_life_form(xx) veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold) 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 29fad6cd..3f2a1fa7 100644 --- a/tests/test_lc_l4_natural_surface.py +++ b/tests/test_lc_l4_natural_surface.py @@ -6,15 +6,24 @@ 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 NODATA = 255 + 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")), ] @@ -58,8 +67,8 @@ def test_ns(): [97, 96, 96], [95, 95, 95], [94, 95, 96], - ] - + ] + l34 = np.array( [ [ @@ -83,7 +92,7 @@ def test_ns(): ], dtype="int", ) - + woody = np.array( [ [ @@ -95,7 +104,7 @@ def test_ns(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -119,7 +128,7 @@ def test_ns(): ], dtype="int", ) - # 112 --> natural veg + # 112 --> natural veg cultivated = np.array( [ [ @@ -143,9 +152,11 @@ 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) lifeform = stats_l4.define_life_form(xx) @@ -153,17 +164,25 @@ def test_ns(): 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) + 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 + ) # 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 c4e122f2..759b43fc 100644 --- a/tests/test_lc_l4_nav.py +++ b/tests/test_lc_l4_nav.py @@ -6,15 +6,23 @@ 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 NODATA = 255 + def image_groups(l34, urban, cultivated, woody, pv_pc_50, water_frequency): - + tuples = [ (np.datetime64("2000-01-01T00"), np.datetime64("2000-01-01")), ] @@ -50,12 +58,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( [ @@ -104,7 +107,7 @@ def test_ntv_classes_woody_herbaceous(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -116,7 +119,7 @@ def test_ntv_classes_woody_herbaceous(): ], dtype="int", ) - + water_frequency = np.array( [ [ @@ -128,9 +131,9 @@ 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) lifeform = stats_l4.define_life_form(xx) @@ -138,11 +141,15 @@ def test_ntv_classes_woody_herbaceous(): 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() @@ -202,7 +209,7 @@ def test_ntv_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -217,7 +224,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], @@ -225,9 +232,9 @@ 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) lifeform = stats_l4.define_life_form(xx) @@ -235,13 +242,18 @@ def test_ntv_veg_cover(): 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], @@ -297,7 +309,7 @@ def test_ntv_woody_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -312,7 +324,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], @@ -320,9 +332,9 @@ 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) lifeform = stats_l4.define_life_form(xx) @@ -330,11 +342,15 @@ def test_ntv_woody_veg_cover(): 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() @@ -393,7 +409,7 @@ def test_ntv_woody_seasonal_water_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -416,9 +432,9 @@ 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) lifeform = stats_l4.define_life_form(xx) @@ -426,14 +442,19 @@ def test_ntv_woody_seasonal_water_veg_cover(): 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], @@ -489,7 +510,7 @@ def test_ntv_woody_permanent_water_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -512,9 +533,9 @@ 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) lifeform = stats_l4.define_life_form(xx) @@ -522,20 +543,20 @@ def test_ntv_woody_permanent_water_veg_cover(): 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( [ @@ -584,7 +605,7 @@ def test_ntv_herbaceous_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -599,7 +620,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], @@ -607,9 +628,9 @@ 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) lifeform = stats_l4.define_life_form(xx) @@ -617,11 +638,15 @@ def test_ntv_herbaceous_veg_cover(): 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() @@ -680,7 +705,7 @@ def test_ntv_herbaceous_seasonal_water_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -703,9 +728,9 @@ 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) lifeform = stats_l4.define_life_form(xx) @@ -713,14 +738,19 @@ def test_ntv_herbaceous_seasonal_water_veg_cover(): 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], @@ -776,7 +806,7 @@ def test_ntv_herbaceous_permanent_water_veg_cover(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -799,9 +829,9 @@ 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) lifeform = stats_l4.define_life_form(xx) @@ -809,9 +839,13 @@ def test_ntv_herbaceous_permanent_water_veg_cover(): 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 c404f672..7a5757a7 100644 --- a/tests/test_lc_l4_ntv.py +++ b/tests/test_lc_l4_ntv.py @@ -6,16 +6,22 @@ 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 NODATA = 255 + # @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")), ] @@ -48,12 +54,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( @@ -103,7 +109,7 @@ def test_ntv_classes_herbaceous(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -116,24 +122,26 @@ 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) lifeform = stats_l4.define_life_form(xx) veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold) 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( @@ -183,7 +191,7 @@ def test_ntv_classes_woody(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -196,23 +204,26 @@ 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) lifeform = stats_l4.define_life_form(xx) veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold) 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( @@ -262,7 +273,7 @@ def test_ntv_classes_no_veg(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -275,23 +286,26 @@ 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) lifeform = stats_l4.define_life_form(xx) veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold) 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( @@ -341,7 +355,7 @@ def test_ntv_classes_no_lifeform(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -354,12 +368,14 @@ 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) lifeform = stats_l4.define_life_form(xx) veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold) 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 3fb02615..63c83622 100644 --- a/tests/test_lc_l4_water.py +++ b/tests/test_lc_l4_water.py @@ -6,16 +6,27 @@ 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_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 NODATA = 255 + # @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")), ] @@ -54,15 +65,15 @@ def image_groups(l34, urban, cultivated, woody, bs_pc_50, pv_pc_50, water_freque def test_water_classes(): - # [[[ 98 98 98] - # [103 98 98] - # [ 98 98 98] - # [ 98 98 98]]] + # [[[ 98 98 98] + # [103 98 98] + # [ 98 98 98] + # [ 98 98 98]]] expected_water_classes = [ [104, 104, 104], [103, 103, 103], [102, 102, 101], - [101, 101, 101] + [101, 101, 101], ] l34 = np.array( @@ -112,7 +123,7 @@ def test_water_classes(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -146,30 +157,39 @@ 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() intertidal_mask, level3 = lc_level3.lc_level3(xx) lifeform = stats_l4.define_life_form(xx) veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold) 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) + water_persistence = l4_water_persistence.water_persistence( + xx, stats_l4.watper_threshold + ) # 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) - + 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 + ) + 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 +239,7 @@ def test_water_intertidal(): ], dtype="int", ) - + pv_pc_50 = np.array( [ [ @@ -253,18 +273,26 @@ 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() intertidal_mask, level3 = lc_level3.lc_level3(xx) lifeform = stats_l4.define_life_form(xx) veg_cover = l4_veg_cover.canopyco_veg_con(xx, stats_l4.veg_threshold) 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) + water_persistence = l4_water_persistence.water_persistence( + xx, stats_l4.watper_threshold + ) # 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) + 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 + ) - 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 a13e892a..eac929f8 100644 --- a/tests/test_lc_level3.py +++ b/tests/test_lc_level3.py @@ -6,7 +6,7 @@ import pytest NODATA = 255 - + expected_l3_classes = [ [111, 112, 215], [124, 112, 215], @@ -14,6 +14,7 @@ [220, 255, 220], ] + @pytest.fixture(scope="module") def image_groups(): l34 = np.array(