Flst_Laden, VerfGebiet bilden
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user