Verfahrensgebietsprüfung auf Knickpunkte umgestellt

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
2026-05-05 19:46:08 +02:00
co-authored by Copilot
parent 8730e1bf96
commit e344a5ad4a
6 changed files with 1104 additions and 61 deletions
+82 -28
View File
@@ -12,13 +12,18 @@ optionaler Umringsprüfung:
6. Flächenvergleich zwischen BROR-Objekt und abgeleitetem Verfahrensgebiet.
- **Übereinstimmung** (≤ Toleranz): modale OK-Meldung, Ablauf beendet.
- **Abweichung**: Ja/Nein-Abfrage für Detailprüfung.
- **Abweichung**: 3-Optionen-Dialog (Detailprüfung / Als VG laden / Abbrechen).
7. Optionale Umringsprüfung (Variante 1):
7. Bei Wahl „Als VG laden":
- BROR-Umring gegen Flurstücksgrenzen vergleichen.
- Ergebnislayer (grün/rot) ins Projekt einfügen.
- Abschlussmeldung mit Konfliktanzahl.
- BROR-Objekt direkt mit VG-Namen ins Projekt übernehmen.
8. Bei Wahl „Detailprüfung" (knickpunktbasiert):
- Grenzpunkte (AX_PunktortTA) per BBox laden.
- Knickpunkte des BROR mit PunktortTA vergleichen (grün/rot/orange).
- Ergebnislayer (Punkte) ins Projekt einfügen.
- Abschlussmeldung mit Zählung.
Das BROR-Objekt (``AX_BauRaumOderBodenordnungsrecht``) bleibt bei Erfolg als
temporärer Layer ``BauRaumOrdnungsrecht (ALKIS)`` im Projekt erhalten.
@@ -42,7 +47,7 @@ from sn_basis.functions.variable_wrapper import get_variable
from sn_basis.functions.dialog_wrapper import (
create_progress_dialog,
show_info_dialog,
ask_yes_no,
ask_detailpruefung_oder_vg_laden,
)
from sn_verfahrensgebiet.functions.verfahrensgebiet_alkis import (
@@ -57,7 +62,11 @@ from sn_verfahrensgebiet.functions.verfahrensgebiet_edit_service import (
erstelle_verfahrensgebiet_aus_auswahl,
VERF_LAYER_NAME,
)
from sn_verfahrensgebiet.functions.umringspruefung import umringspruefung
from sn_verfahrensgebiet.functions.grenzpunkt_alkis import lade_punktort_ta
from sn_verfahrensgebiet.functions.knickpunkt_pruefung import (
knickpunkt_pruefung,
_extrahiere_knickpunkte,
)
# Feldname für das Verfahrenskennzeichen im enriched Layer
FELD_VKZ = "verfahrensnummer"
@@ -417,51 +426,96 @@ def verfahrensgebiet_alkis_komplett(
return enriched_layer, flst_layer, alkis_vg_layer, vg_status
# ------------------------------------------------------------------
# Flächenabweichung → Nutzerabfrage für Detailprüfung
# Flächenabweichung → 3-Optionen-Dialog
# ------------------------------------------------------------------
progress.close()
diff = abs(bror_flaeche - vg_flaeche)
starten = ask_yes_no(
entscheidung = ask_detailpruefung_oder_vg_laden(
tab_widget,
"Abweichung erkannt",
f"Abweichung zwischen BauRaumOrdnungsrecht-Objekt und abgeleitetem "
f"Verfahrensgebiet erkannt. Detailprüfung starten?\n\n"
f"Verfahrensgebiet erkannt.\n\n"
f"BauRaumOrdnungsrecht: {bror_flaeche:.2f} m²\n"
f"Verfahrensgebiet: {vg_flaeche:.2f} m²\n"
f"Differenz: {diff:.2f} m²",
default=True,
parent=tab_widget,
f"Differenz: {diff:.2f} m²\n\n"
f"Wie möchten Sie fortfahren?",
)
if not starten:
if entscheidung == "abbrechen":
abgeschlossen = True
return enriched_layer, flst_layer, alkis_vg_layer, vg_status
# ------------------------------------------------------------------
# Umringsprüfung (Variante 1: linienbasierter Umringvergleich)
# Option: Bodenordnungsobjekt direkt als Verfahrensgebiet laden
# ------------------------------------------------------------------
umring_progress = create_progress_dialog(
3, "Detailprüfung (Umringe)", "Starte Umringsprüfung …"
if entscheidung == "als_vg_laden":
# Layer bleibt im Projekt – nur umbenennen. working_tab überspringt
# addMapLayer wenn der Layer bereits registriert ist.
alkis_vg_layer.setName(VERF_LAYER_NAME)
bror_was_added_by_us = False
abgeschlossen = True
return alkis_vg_layer, None, None, vg_status
# ------------------------------------------------------------------
# Option: Detailprüfung (knickpunktbasiert)
# ------------------------------------------------------------------
# Knickpunkte vorab extrahieren, um Schrittanzahl zu bestimmen
knickpunkte = _extrahiere_knickpunkte(alkis_vg_layer)
n_knick = len(knickpunkte)
# Gesamtschritte: 0=Start, 1=PTA-Index, 2…n+1=Knickpunkte, n+2=Orange, n+3=Fertig
# + 1 Schritt vorab für Grenzpunkte laden
gesamt_schritte = n_knick + 5
detail_progress = create_progress_dialog(
gesamt_schritte,
"Detailprüfung (Knickpunkte)",
"Schritt 1: Grenzpunkte laden …",
)
detail_progress.set_value(0)
# Schritt 1: PunktortTA gemarkungsweise laden (Hits + 5000er-Batches)
punktort_layer = lade_punktort_ta(
vorgabe_schluessel, vg_geom, progress=detail_progress
)
ergebnis_layer, konflikt_anzahl = umringspruefung(
alkis_vg_layer, flst_layer, progress=umring_progress
)
if umring_progress.is_canceled():
umring_progress.close()
if detail_progress.is_canceled():
detail_progress.close()
abgeschlossen = True
return enriched_layer, flst_layer, alkis_vg_layer, vg_status
umring_progress.set_value(3)
umring_progress.close()
detail_progress.set_value(1)
if punktort_layer is None:
detail_progress.close()
abgeschlossen = True
return enriched_layer, flst_layer, alkis_vg_layer, vg_status
# Schritte 2…Ende: Knickpunktprüfung
ergebnis_layer, identisch, kein_pta, fehlender_knick = knickpunkt_pruefung(
alkis_vg_layer,
punktort_layer,
flst_layer,
progress=detail_progress,
knickpunkte=knickpunkte,
)
if detail_progress.is_canceled():
detail_progress.close()
abgeschlossen = True
return enriched_layer, flst_layer, alkis_vg_layer, vg_status
detail_progress.set_value(gesamt_schritte)
detail_progress.close()
if ergebnis_layer and ergebnis_layer.isValid():
project.addMapLayer(ergebnis_layer)
show_info_dialog(
"Detailprüfung",
f"Detailprüfung abgeschlossen. "
f"Es wurden {konflikt_anzahl} Konfliktstellen identifiziert.",
"Detailprüfung abgeschlossen",
f"Knickpunkte geprüft: {n_knick}\n"
f" Identisch (grün): {identisch}\n"
f" Kein PunktortTA (rot): {kein_pta}\n"
f" Fehlende Knickpunkte (orange): {fehlender_knick}",
parent=tab_widget,
)