"""sn_verfahrensgebiet/functions/flurstueck_alkis.py – ALKIS-Integration für Flurstücke. Lädt Flurstücke aus dem ALKIS-WFS-Dienst (adv:AX_Flurstueck) anhand von Gemarkungsschlüsseln, die der Nutzer interaktiv eingibt. Der WFS-Layer wird direkt (nicht als Memory-Layer) ins Projekt geladen, da die einzelnen Features für die spätere Auswahl benötigt werden. """ from sn_basis.functions import QgsVectorLayer, QgsProject from sn_basis.functions import QMessageBox from sn_basis.functions.dialog_wrapper import ask_text # LoadStatus aus verfahrensgebiet_alkis wiederverwenden (identische Semantik) from sn_verfahrensgebiet.functions.verfahrensgebiet_alkis import LoadStatus ALKIS_NAS_URL = "https://geodienste.sachsen.de/aaa/public_alkis/nas/wfs" FLST_TYPENAME = "adv:AX_Flurstueck" FLST_LAYER_NAME = "Flurstücke" def _check_existing_flurstueck_layer(tab_widget): """Prüft, ob ein Flurstück-Layer bereits im Projekt existiert. Returns ------- Tuple[Optional[QgsVectorLayer], LoadStatus] Bei ``LoadStatus.KEEP`` enthält das Tuple den vorhandenen Layer, bei ``LoadStatus.FIRST`` und ``LoadStatus.RELOAD`` ist es None. """ project = QgsProject.instance() existing_layers = project.mapLayersByName(FLST_LAYER_NAME) if not existing_layers: return None, LoadStatus.FIRST reply = QMessageBox.question( tab_widget, "Layer bereits vorhanden", f"Der Layer '{FLST_LAYER_NAME}' existiert bereits.\n" "Möchten Sie ihn löschen und neu laden?", QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, QMessageBox.StandardButton.No, ) if reply == QMessageBox.StandardButton.Yes: for lyr in existing_layers: project.removeMapLayer(lyr.id()) return None, LoadStatus.RELOAD else: return existing_layers[0], LoadStatus.KEEP def flurstueck_alkis(tab_widget): """Lädt Flurstücke aus ALKIS-WFS anhand von Gemarkungsschlüsseln. Der Nutzer gibt einen oder mehrere Gemarkungsschlüssel (kommagetrennt) ein. Der WFS wird per SQL-Filter auf ``gemarkung_ax_gemarkung_schluessel_gemarkungsnummer IN (...)`` abgefragt. Parameters ---------- tab_widget : Eltern-Widget für Dialoge. Returns ------- Tuple[Optional[QgsVectorLayer], LoadStatus] Geladener WFS-Layer und Ladestatus. Bei Fehlern ist der Layer None und der Status LoadStatus.NONE. """ # 1. Vorhandenen Layer prüfen existing, status = _check_existing_flurstueck_layer(tab_widget) if status == LoadStatus.KEEP: return existing, status # 2. Gemarkungsschlüssel abfragen eingabe, ok = ask_text( "Gemarkungsschlüssel", "Gemarkungsschlüssel eingeben (mehrere mit Komma trennen):", parent=tab_widget, ) if not ok or not eingabe.strip(): QMessageBox.warning( tab_widget, "Abgebrochen", "Bitte mindestens einen gültigen Gemarkungsschlüssel eingeben.", ) return None, LoadStatus.NONE schluessel_liste = [s.strip() for s in eingabe.split(",") if s.strip()] if not schluessel_liste: QMessageBox.warning(tab_widget, "Fehler", "Keine gültigen Schlüssel gefunden.") return None, LoadStatus.NONE schluessel_str = ", ".join(f"'{s}'" for s in schluessel_liste) # 3. WFS-URI aufbauen und Layer laden wfs_uri = ( f"url='{ALKIS_NAS_URL}' typename='{FLST_TYPENAME}' srsname='EPSG:25833' " f"sql=SELECT * FROM AX_Flurstueck " f"WHERE gemarkung_ax_gemarkung_schluessel_gemarkungsnummer IN ({schluessel_str})" ) layer = QgsVectorLayer(wfs_uri, FLST_LAYER_NAME, "WFS") if not layer.isValid(): QMessageBox.critical( tab_widget, "Fehler", "Flurstück-Layer konnte nicht geladen werden.\n" "Bitte Gemarkungsschlüssel und Netzwerkverbindung prüfen.", ) return None, LoadStatus.NONE return layer, status