Files
Plugin_SN_Verfahrensgebiet/functions/flurstueck_alkis.py
T
2026-04-21 21:50:26 +02:00

114 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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