114 lines
4.0 KiB
Python
114 lines
4.0 KiB
Python
"""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
|