anhängen-Funktion für Flurstücke
This commit is contained in:
@@ -53,23 +53,28 @@ def _check_existing_flurstueck_layer(tab_widget):
|
|||||||
if not existing_layers:
|
if not existing_layers:
|
||||||
return None, LoadStatus.FIRST
|
return None, LoadStatus.FIRST
|
||||||
|
|
||||||
reply = QMessageBox.question(
|
msg = QMessageBox(tab_widget)
|
||||||
tab_widget,
|
msg.setWindowTitle("Layer bereits vorhanden")
|
||||||
"Layer bereits vorhanden",
|
msg.setText(
|
||||||
f"Der Layer '{FLST_LAYER_NAME}' existiert bereits.\n"
|
f"Der Layer '{FLST_LAYER_NAME}' existiert bereits.\nWas soll geschehen?"
|
||||||
"Möchten Sie ihn löschen und neu laden?",
|
|
||||||
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
|
|
||||||
QMessageBox.StandardButton.No,
|
|
||||||
)
|
)
|
||||||
if reply == QMessageBox.StandardButton.Yes:
|
btn_ueberschreiben = msg.addButton("Überschreiben", QMessageBox.ButtonRole.DestructiveRole)
|
||||||
|
btn_anhaengen = msg.addButton("Anhängen", QMessageBox.ButtonRole.AcceptRole)
|
||||||
|
btn_abbrechen = msg.addButton("Abbrechen", QMessageBox.ButtonRole.RejectRole)
|
||||||
|
msg.setDefaultButton(btn_abbrechen)
|
||||||
|
msg.exec()
|
||||||
|
clicked = msg.clickedButton()
|
||||||
|
if clicked is btn_ueberschreiben:
|
||||||
for lyr in existing_layers:
|
for lyr in existing_layers:
|
||||||
project.removeMapLayer(lyr.id())
|
project.removeMapLayer(lyr.id())
|
||||||
return None, LoadStatus.RELOAD
|
return None, LoadStatus.RELOAD
|
||||||
|
elif clicked is btn_anhaengen:
|
||||||
|
return existing_layers[0], LoadStatus.APPEND
|
||||||
else:
|
else:
|
||||||
return existing_layers[0], LoadStatus.KEEP
|
return None, LoadStatus.NONE
|
||||||
|
|
||||||
|
|
||||||
def _lade_flurstuecke_per_gemarkung(schluessel_liste: List[str]):
|
def lade_flurstuecke_per_gemarkung(schluessel_liste: List[str]):
|
||||||
"""Lädt Flurstücke für mehrere Gemarkungen, eine WFS-Anfrage pro Schlüssel.
|
"""Lädt Flurstücke für mehrere Gemarkungen, eine WFS-Anfrage pro Schlüssel.
|
||||||
|
|
||||||
Vermeidet das WFS-Feature-Limit einer einzelnen Abfrage mit mehreren
|
Vermeidet das WFS-Feature-Limit einer einzelnen Abfrage mit mehreren
|
||||||
@@ -179,6 +184,7 @@ def flurstueck_alkis(
|
|||||||
Bei Fehlern ist der Layer ``None`` und der Status :attr:`LoadStatus.NONE`.
|
Bei Fehlern ist der Layer ``None`` und der Status :attr:`LoadStatus.NONE`.
|
||||||
"""
|
"""
|
||||||
# --- Schritt 1: Vorhandenen Layer behandeln ----------------------------
|
# --- Schritt 1: Vorhandenen Layer behandeln ----------------------------
|
||||||
|
append_target = None
|
||||||
if ohne_dialog:
|
if ohne_dialog:
|
||||||
project = QgsProject.instance()
|
project = QgsProject.instance()
|
||||||
hatte_layer = bool(project.mapLayersByName(FLST_LAYER_NAME))
|
hatte_layer = bool(project.mapLayersByName(FLST_LAYER_NAME))
|
||||||
@@ -189,6 +195,10 @@ def flurstueck_alkis(
|
|||||||
existing, status = _check_existing_flurstueck_layer(tab_widget)
|
existing, status = _check_existing_flurstueck_layer(tab_widget)
|
||||||
if status == LoadStatus.KEEP:
|
if status == LoadStatus.KEEP:
|
||||||
return existing, status
|
return existing, status
|
||||||
|
if status == LoadStatus.NONE:
|
||||||
|
return None, LoadStatus.NONE
|
||||||
|
if status == LoadStatus.APPEND:
|
||||||
|
append_target = existing
|
||||||
|
|
||||||
# --- Schritt 2: Gemarkungsschlüssel bestimmen -------------------------
|
# --- Schritt 2: Gemarkungsschlüssel bestimmen -------------------------
|
||||||
if ohne_dialog:
|
if ohne_dialog:
|
||||||
@@ -226,7 +236,7 @@ def flurstueck_alkis(
|
|||||||
return None, LoadStatus.NONE
|
return None, LoadStatus.NONE
|
||||||
|
|
||||||
# --- Schritt 3: Flurstücke gemarkungsweise laden ----------------------
|
# --- Schritt 3: Flurstücke gemarkungsweise laden ----------------------
|
||||||
layer = _lade_flurstuecke_per_gemarkung(schluessel_liste)
|
layer = lade_flurstuecke_per_gemarkung(schluessel_liste)
|
||||||
|
|
||||||
if not layer or not layer.isValid() or layer.featureCount() == 0:
|
if not layer or not layer.isValid() or layer.featureCount() == 0:
|
||||||
if not ohne_dialog:
|
if not ohne_dialog:
|
||||||
@@ -238,4 +248,10 @@ def flurstueck_alkis(
|
|||||||
)
|
)
|
||||||
return None, LoadStatus.NONE
|
return None, LoadStatus.NONE
|
||||||
|
|
||||||
|
# --- Anhängen an vorhandenen Layer ------------------------------------
|
||||||
|
if status == LoadStatus.APPEND and append_target is not None:
|
||||||
|
append_target.dataProvider().addFeatures(list(layer.getFeatures()))
|
||||||
|
append_target.updateExtents()
|
||||||
|
return append_target, LoadStatus.APPEND
|
||||||
|
|
||||||
return layer, status
|
return layer, status
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ class LoadStatus(Enum):
|
|||||||
FIRST = "first" # erstmalig geladen
|
FIRST = "first" # erstmalig geladen
|
||||||
RELOAD = "reload" # neu geladen
|
RELOAD = "reload" # neu geladen
|
||||||
KEEP = "keep" # vorhandener Layer behalten
|
KEEP = "keep" # vorhandener Layer behalten
|
||||||
|
APPEND = "append" # Features an vorhandenen Layer angehängt
|
||||||
|
|
||||||
|
|
||||||
def _check_existing_layer(tab_widget):
|
def _check_existing_layer(tab_widget):
|
||||||
|
|||||||
+45
-1
@@ -14,7 +14,12 @@ from sn_basis.modules.pruef_ergebnis import pruef_ergebnis
|
|||||||
from qgis.utils import iface
|
from qgis.utils import iface
|
||||||
|
|
||||||
from sn_verfahrensgebiet.functions.verfahrensgebiet_alkis import LoadStatus
|
from sn_verfahrensgebiet.functions.verfahrensgebiet_alkis import LoadStatus
|
||||||
from sn_verfahrensgebiet.functions.flurstueck_alkis import flurstueck_alkis, ALKIS_SF_URL
|
from sn_verfahrensgebiet.functions.flurstueck_alkis import (
|
||||||
|
flurstueck_alkis,
|
||||||
|
lade_flurstuecke_per_gemarkung,
|
||||||
|
ALKIS_SF_URL,
|
||||||
|
FLST_LAYER_NAME,
|
||||||
|
)
|
||||||
from sn_verfahrensgebiet.functions.verfahrensgebiet_alkis_komplett import verfahrensgebiet_alkis_komplett
|
from sn_verfahrensgebiet.functions.verfahrensgebiet_alkis_komplett import verfahrensgebiet_alkis_komplett
|
||||||
from sn_verfahrensgebiet.functions.grenzpunkt_alkis import grenzpunkte_gemarkungsweise, JOINED_LAYER_NAME
|
from sn_verfahrensgebiet.functions.grenzpunkt_alkis import grenzpunkte_gemarkungsweise, JOINED_LAYER_NAME
|
||||||
from sn_verfahrensgebiet.functions.gemarkung_alkis import (
|
from sn_verfahrensgebiet.functions.gemarkung_alkis import (
|
||||||
@@ -293,6 +298,11 @@ class WorkingTab(QWidget):
|
|||||||
self.setze_haken(self.haken_flurst, True)
|
self.setze_haken(self.haken_flurst, True)
|
||||||
info("Flurstücke", "Vorhandener Layer wurde behalten.", duration=4)
|
info("Flurstücke", "Vorhandener Layer wurde behalten.", duration=4)
|
||||||
|
|
||||||
|
elif status == LoadStatus.APPEND:
|
||||||
|
self.setze_haken(self.haken_flurst, True)
|
||||||
|
iface.mapCanvas().refresh()
|
||||||
|
success("Flurstücke", "Features wurden an den vorhandenen Layer angehängt.", duration=5)
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
self._set_busy(self.btn_flurst_alkis, False, "Aus ALKIS laden")
|
self._set_busy(self.btn_flurst_alkis, False, "Aus ALKIS laden")
|
||||||
|
|
||||||
@@ -366,6 +376,40 @@ class WorkingTab(QWidget):
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Prüfen ob bereits ein Flurstücke-Layer vorhanden → 3-Knopf-Dialog
|
||||||
|
existing_flst = project.mapLayersByName(FLST_LAYER_NAME)
|
||||||
|
if existing_flst:
|
||||||
|
msg_box = QMessageBox(self)
|
||||||
|
msg_box.setWindowTitle("Layer bereits vorhanden")
|
||||||
|
msg_box.setText(
|
||||||
|
f"Der Layer '{FLST_LAYER_NAME}' existiert bereits.\nWas soll geschehen?"
|
||||||
|
)
|
||||||
|
btn_ueberschreiben = msg_box.addButton("Überschreiben", QMessageBox.ButtonRole.DestructiveRole)
|
||||||
|
btn_anhaengen = msg_box.addButton("Anhängen", QMessageBox.ButtonRole.AcceptRole)
|
||||||
|
btn_abbrechen = msg_box.addButton("Abbrechen", QMessageBox.ButtonRole.RejectRole)
|
||||||
|
msg_box.setDefaultButton(btn_abbrechen)
|
||||||
|
msg_box.exec()
|
||||||
|
clicked = msg_box.clickedButton()
|
||||||
|
if clicked is btn_abbrechen:
|
||||||
|
return
|
||||||
|
if clicked is btn_anhaengen:
|
||||||
|
temp_layer = lade_flurstuecke_per_gemarkung(vorgabe_schluessel)
|
||||||
|
if not temp_layer or not temp_layer.isValid() or temp_layer.featureCount() == 0:
|
||||||
|
error(
|
||||||
|
"Flurstücke",
|
||||||
|
f"Flurstücke konnten nicht geladen werden – WFS-Dienst ({ALKIS_SF_URL}) "
|
||||||
|
f"nicht erreichbar oder keine Features für die gewählten Gemarkungen.",
|
||||||
|
duration=0,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
existing_flst[0].dataProvider().addFeatures(list(temp_layer.getFeatures()))
|
||||||
|
existing_flst[0].updateExtents()
|
||||||
|
iface.mapCanvas().refresh()
|
||||||
|
self.setze_haken(self.haken_flurst, True)
|
||||||
|
success("Flurstücke", "Features wurden an den vorhandenen Layer angehängt.", duration=5)
|
||||||
|
return
|
||||||
|
# else: Überschreiben → fall-through zum flurstueck_alkis(ohne_dialog=True)-Aufruf
|
||||||
|
|
||||||
# Flurstücke direkt laden (kein Dialog)
|
# Flurstücke direkt laden (kein Dialog)
|
||||||
layer, status = flurstueck_alkis(
|
layer, status = flurstueck_alkis(
|
||||||
self,
|
self,
|
||||||
|
|||||||
Reference in New Issue
Block a user