diff --git a/u4py/analysis/classify.py b/u4py/analysis/classify.py index 6ac75bf0c003b86785349ed7a3167613d179b479..d32242a44c64aa8246644b7ea3b6166e36a7c48e 100644 --- a/u4py/analysis/classify.py +++ b/u4py/analysis/classify.py @@ -157,6 +157,10 @@ def classify_shape( else: res.update(buildings(res, sub_set_hull, shp_cfg, osm_path)) + # District + if use_online: + res.update(district(res, sub_set_hull, out_folder=cache_path)) + # Water res.update(rivers_water(res, sub_set_hull, osm_path, shp_cfg)) @@ -244,14 +248,15 @@ def preallocate_results() -> U4ResDict: "aspect_polygons_std_19": [], "aspect_polygons_std_21": [], "buildings_area": np.nan, - "buildings": gp.GeoDataFrame(), - "buildings_num": 0, "buildings_close": False, + "buildings_num": 0, + "buildings": gp.GeoDataFrame(), + "district": [], "geology_area": [], + "geology_mapname": [], + "geology_mapnum": [], "geology_percent": [], "geology_units": [], - "geology_mapnum": [], - "geology_mapname": [], "geometry": gp.GeoDataFrame(), "group": np.nan, "hydro_area": [], @@ -284,40 +289,40 @@ def preallocate_results() -> U4ResDict: "manual_unclear_1": False, "manual_unclear_2": False, "manual_unclear_3": False, + "railways_close": False, "railways_has": False, "railways_length": np.nan, - "railways_close": False, - "roads_has": False, "roads_close": False, "roads_has_motorway": False, "roads_has_primary": False, "roads_has_secondary": False, - "roads_motorway_names": [], - "roads_primary_names": [], - "roads_secondary_names": [], - "roads_motorway_length": [], - "roads_primary_length": [], - "roads_secondary_length": [], - "roads_nearest_motorway_name": "", - "roads_nearest_primary_name": "", - "roads_nearest_secondary_name": "", - "roads_nearest_motorway_dist": np.nan, - "roads_nearest_primary_dist": np.nan, - "roads_nearest_secondary_dist": np.nan, + "roads_has": False, "roads_main_area": np.nan, "roads_main": gp.GeoDataFrame(), "roads_minor_area": np.nan, "roads_minor": gp.GeoDataFrame(), + "roads_motorway_length": [], + "roads_motorway_names": [], + "roads_nearest_motorway_dist": np.nan, + "roads_nearest_motorway_name": "", + "roads_nearest_primary_dist": np.nan, + "roads_nearest_primary_name": "", + "roads_nearest_secondary_dist": np.nan, + "roads_nearest_secondary_name": "", + "roads_primary_length": [], + "roads_primary_names": [], + "roads_secondary_length": [], + "roads_secondary_names": [], "rockfall_num_1km": np.nan, "rockfall_num_inside": np.nan, + "shape_aspect": [], + "shape_breadth": [], "shape_ellipse_a": [], "shape_ellipse_b": [], "shape_ellipse_theta": [], "shape_flattening": [], "shape_roundness": [], "shape_width": [], - "shape_breadth": [], - "shape_aspect": [], "slope_hull_mean_14": [], "slope_hull_mean_19": [], "slope_hull_mean_21": [], @@ -336,11 +341,11 @@ def preallocate_results() -> U4ResDict: "slope_polygons_std_14": [], "slope_polygons_std_19": [], "slope_polygons_std_21": [], + "structural_region": [], "subsidence_area": [], "subsidence_percent": [], "subsidence_total": np.nan, "subsidence_units": [], - "structural_region": [], "timeseries_annual_cosine": np.nan, "timeseries_annual_max_amplitude": np.nan, "timeseries_annual_max_time": np.nan, @@ -356,14 +361,14 @@ def preallocate_results() -> U4ResDict: "topsoil_percent": np.nan, "topsoil_units": np.nan, "volumes_added": np.nan, - "volumes_moved": np.nan, - "volumes_removed": np.nan, - "volumes_total": np.nan, "volumes_error": np.nan, + "volumes_moved": np.nan, "volumes_polygons_added": np.nan, "volumes_polygons_moved": np.nan, "volumes_polygons_removed": np.nan, "volumes_polygons_total": np.nan, + "volumes_removed": np.nan, + "volumes_total": np.nan, "water_area": np.nan, } return res @@ -600,6 +605,31 @@ def buildings( return res +def district( + res: U4ResDict, + sub_set_hull: gp.GeoDataFrame, + out_folder: os.PathLike = "", +) -> U4ResDict: + district_data = u4web.query_hlnug( + "geobasis/alkis_grenzen/MapServer", + "GEMARKUNG", + region=sub_set_hull, + out_folder=out_folder, + suffix=f"{res['group']:05}", + ) + if district_data.empty: + logging.debug("Retrying to get building data.") + district_data = u4web.query_hlnug( + "geobasis/alkis_grenzen/MapServer", + "GEMARKUNG", + region=sub_set_hull, + out_folder=out_folder, + suffix=f"{res['group']:05}", + ) + res["district"] = district_data["GM_NA"].unique().tolist() + return res + + def rivers_water( res: U4ResDict, sub_set_hull: gp.GeoDataFrame, diff --git a/u4py/io/docx_report.py b/u4py/io/docx_report.py index b995041134d3a22e7ca4ac56488b77624a107425..2dcf8d6439f94d7ca0ef9538959555df33d4dac0 100644 --- a/u4py/io/docx_report.py +++ b/u4py/io/docx_report.py @@ -226,6 +226,19 @@ def hlnug_description( else: prgph.add_run(". ") + # Add district name(s) + try: + district = eval(row["district"]) + except NameError: + district = row["district"] + if district: + prgph.add_run("Sie befindet sich innerhalb ") + if isinstance(district, list): + district_string = u4human.listed_strings(district) + prgph.add_run(f"der Gemarkungen {district_string}. ") + else: + prgph.add_run(f"der Germarkung {district}. ") + # Add dimensions prgph.add_run( f"Sie hat eine Länge von ca. {hld['LAENGE_M'].values[0]}\u00a0m, eine Breite von ca. {hld['BREITE_M'].values[0]}\u00a0m und verläuft nach {u4human.direction_to_text(hld['EXPOSITION'].values[0], in_lang='de')}. " diff --git a/u4py/utils/types.py b/u4py/utils/types.py index 44337e4b579a4499fa281cbe04e681257bd7f525..80d7356b249bdff955ac4d59e0ed009d9cd82baa 100644 --- a/u4py/utils/types.py +++ b/u4py/utils/types.py @@ -86,14 +86,15 @@ class U4ResDict(TypedDict): aspect_polygons_std_19: list aspect_polygons_std_21: list buildings_area: float - buildings: gp.GeoDataFrame - buildings_num: int buildings_close: bool + buildings_num: int + buildings: gp.GeoDataFrame + district: list geology_area: list + geology_mapname: list + geology_mapnum: list geology_percent: list geology_units: list - geology_mapnum: list - geology_mapname: list geometry: gp.GeoDataFrame group: float hydro_area: list @@ -126,40 +127,40 @@ class U4ResDict(TypedDict): manual_unclear_1: bool manual_unclear_2: bool manual_unclear_3: bool + railways_close: bool railways_has: bool railways_length: float - railways_close: bool - roads_has: bool + roads_close: bool roads_has_motorway: bool roads_has_primary: bool roads_has_secondary: bool - roads_motorway_names: list - roads_primary_names: list - roads_secondary_names: list - roads_motorway_length: list - roads_primary_length: list - roads_secondary_length: list - roads_close: bool - roads_nearest_motorway_name: str - roads_nearest_primary_name: str - roads_nearest_secondary_name: str - roads_nearest_motorway_dist: float - roads_nearest_primary_dist: float - roads_nearest_secondary_dist: float + roads_has: bool roads_main_area: float roads_main: gp.GeoDataFrame roads_minor_area: float roads_minor: gp.GeoDataFrame + roads_motorway_length: list + roads_motorway_names: list + roads_nearest_motorway_dist: float + roads_nearest_motorway_name: str + roads_nearest_primary_dist: float + roads_nearest_primary_name: str + roads_nearest_secondary_dist: float + roads_nearest_secondary_name: str + roads_primary_length: list + roads_primary_names: list + roads_secondary_length: list + roads_secondary_names: list rockfall_num_1km: float rockfall_num_inside: float + shape_aspect: list + shape_breadth: list shape_ellipse_a: list shape_ellipse_b: list shape_ellipse_theta: list shape_flattening: list shape_roundness: list shape_width: list - shape_breadth: list - shape_aspect: list slope_hull_mean_14: list slope_hull_mean_19: list slope_hull_mean_21: list @@ -178,11 +179,11 @@ class U4ResDict(TypedDict): slope_polygons_std_14: list slope_polygons_std_19: list slope_polygons_std_21: list + structural_region: list subsidence_area: list subsidence_percent: list subsidence_total: float subsidence_units: list - structural_region: list timeseries_annual_cosine: float timeseries_annual_max_amplitude: float timeseries_annual_max_time: float @@ -198,14 +199,14 @@ class U4ResDict(TypedDict): topsoil_percent: float topsoil_units: float volumes_added: float - volumes_moved: float - volumes_removed: float - volumes_total: float volumes_error: float + volumes_moved: float volumes_polygons_added: float volumes_polygons_moved: float volumes_polygons_removed: float volumes_polygons_total: float + volumes_removed: float + volumes_total: float water_area: float well_number: int