From 62aa4ec59f825754027af21cef78469a690f4d2b Mon Sep 17 00:00:00 2001 From: "s0wlz (Matthias Puchstein)" Date: Wed, 4 Feb 2026 00:58:14 +0100 Subject: [PATCH] feat(config): Add configuration for lake processing and manual masks Added `LakeConfig` to `RiverErosionConfig` to support HydroLAKES integration and manual override settings. Updated config parsing logic to handle the new fields. --- geodata_pipeline/config.py | 14 +++++++++++++- tests/test_config_lakes.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 tests/test_config_lakes.py diff --git a/geodata_pipeline/config.py b/geodata_pipeline/config.py index daf9f5f..c305dd9 100644 --- a/geodata_pipeline/config.py +++ b/geodata_pipeline/config.py @@ -17,6 +17,7 @@ class RawConfig: dop20_dir: str = "raw/dop20/jp2" citygml_lod1_dir: str = "raw/citygml/lod1" citygml_lod2_dir: str = "raw/citygml/lod2" + hydrolakes_dir: str = "raw/hydrolakes/HydroLAKES_polys_v10_shp" @dataclass @@ -79,6 +80,14 @@ class RiverErosionLidarConfig: fill_holes_radius: int = 3 +@dataclass +class LakeConfig: + enabled: bool = True + source_path: str = "raw/hydrolakes/HydroLAKES_polys_v10_shp/HydroLAKES_polys_v10.shp" + default_depth_m: float = 5.0 + match_tolerance_m: float = 100.0 + + def _default_river_profile_vr() -> "RiverErosionProfileConfig": return RiverErosionProfileConfig( order_field="ORD_STRA", @@ -109,6 +118,7 @@ class RiverErosionConfig: manifest_vr: str = "export_unity/tile_index_river_vr.csv" vr: RiverErosionProfileConfig = field(default_factory=_default_river_profile_vr) lidar: RiverErosionLidarConfig = field(default_factory=RiverErosionLidarConfig) + lakes: LakeConfig = field(default_factory=LakeConfig) bridge_source: str = "dom1" bridge_height_min_m: float = 2.0 bridge_height_max_m: float = 12.0 @@ -393,9 +403,11 @@ def _river_erosion_from_dict(data: Dict[str, Any]) -> RiverErosionConfig: base = _filter_kwargs(RiverErosionConfig, data) base.pop("vr", None) base.pop("lidar", None) + base.pop("lakes", None) vr_cfg = RiverErosionProfileConfig(**_filter_kwargs(RiverErosionProfileConfig, data.get("vr", {}))) lidar_cfg = RiverErosionLidarConfig(**_filter_kwargs(RiverErosionLidarConfig, data.get("lidar", {}))) - return RiverErosionConfig(**base, vr=vr_cfg, lidar=lidar_cfg) + lakes_cfg = LakeConfig(**_filter_kwargs(LakeConfig, data.get("lakes", {}))) + return RiverErosionConfig(**base, vr=vr_cfg, lidar=lidar_cfg, lakes=lakes_cfg) def _swe_lod_from_dict(data: Dict[str, Any]) -> SweLodConfig: diff --git a/tests/test_config_lakes.py b/tests/test_config_lakes.py new file mode 100644 index 0000000..24609c8 --- /dev/null +++ b/tests/test_config_lakes.py @@ -0,0 +1,32 @@ +import unittest +from geodata_pipeline.config import Config, LakeConfig, RiverErosionConfig + +class TestConfigLakes(unittest.TestCase): + def test_default_lake_config(self): + cfg = Config.default() + self.assertIsInstance(cfg.river_erosion.lakes, LakeConfig) + self.assertTrue(cfg.river_erosion.lakes.enabled) + self.assertEqual(cfg.river_erosion.lakes.default_depth_m, 5.0) + self.assertEqual(cfg.river_erosion.lakes.match_tolerance_m, 100.0) + + def test_load_lake_config(self): + data = { + "river_erosion": { + "lakes": { + "enabled": False, + "default_depth_m": 10.0, + "match_tolerance_m": 50.0 + } + } + } + cfg = Config.from_dict(data) + self.assertFalse(cfg.river_erosion.lakes.enabled) + self.assertEqual(cfg.river_erosion.lakes.default_depth_m, 10.0) + self.assertEqual(cfg.river_erosion.lakes.match_tolerance_m, 50.0) + + def test_raw_config_hydrolakes(self): + cfg = Config.default() + self.assertEqual(cfg.raw.hydrolakes_dir, "raw/hydrolakes/HydroLAKES_polys_v10_shp") + +if __name__ == "__main__": + unittest.main()