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
|