119 lines
4.1 KiB
Python
119 lines
4.1 KiB
Python
"""sn_verfahrensgebiet/functions/verfahrensgebiet_alkis.py – ALKIS-Integration.
|
||
Lädt Verfahrensgebiete aus dem ALKIS-WFS-Dienst.
|
||
"""
|
||
|
||
from enum import Enum
|
||
from sn_basis.functions import (
|
||
QgsVectorLayer, QgsProject, QgsFeature, QgsField, QgsGeometry
|
||
)
|
||
from sn_basis.functions import QMessageBox
|
||
from sn_basis.functions.qt_wrapper import QVariant
|
||
from sn_basis.functions.variable_wrapper import get_variable
|
||
|
||
alkis_NAS_url = "https://geodienste.sachsen.de/aaa/public_alkis/nas/wfs"
|
||
typename = "adv:AX_BauRaumOderBodenordnungsrecht"
|
||
|
||
class LoadStatus(Enum):
|
||
"""Status eines Layer-Ladevorgangs.
|
||
|
||
Attributes:
|
||
NONE: Nichts geladen
|
||
FIRST: Erstmalig geladen
|
||
RELOAD: Neu geladen
|
||
KEEP: Vorhandener Layer behalten
|
||
"""
|
||
NONE = "none" # nichts geladen
|
||
FIRST = "first" # erstmalig geladen
|
||
RELOAD = "reload" # neu geladen
|
||
KEEP = "keep" # vorhandener Layer behalten
|
||
|
||
|
||
def _check_existing_layer(tab_widget):
|
||
"""Prüft, ob ein Verfahrensgebiet-Layer bereits existiert.
|
||
|
||
Args:
|
||
tab_widget: Parent-Widget für Dialoge
|
||
|
||
Returns:
|
||
Tuple[Optional[QgsVectorLayer], LoadStatus]: Layer und Status
|
||
"""
|
||
project = QgsProject.instance()
|
||
existing_layers = project.mapLayersByName("Verfahrensgebiet")
|
||
if not existing_layers:
|
||
return None, LoadStatus.FIRST
|
||
|
||
reply = QMessageBox.question(
|
||
tab_widget,
|
||
"Layer bereits vorhanden",
|
||
"Der Layer 'Verfahrensgebiet' 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 verfahrensgebiet_alkis(tab_widget):
|
||
"""Lädt Verfahrensgebiet aus ALKIS-WFS basierend auf Verfahrensnummer.
|
||
|
||
Args:
|
||
tab_widget: Parent-Widget für Dialoge und Meldungen
|
||
|
||
Returns:
|
||
Tuple[Optional[QgsVectorLayer], LoadStatus]: Geladener Layer und Status
|
||
"""
|
||
verfahrensnummer = get_variable("verfahrensnummer")
|
||
if not verfahrensnummer:
|
||
QMessageBox.critical(tab_widget, "Fehler",
|
||
"In den Projekteigenschaften ist noch keine Verfahrensnummer eingetragen!")
|
||
return None, LoadStatus.NONE
|
||
|
||
# Vorhandenen Layer prüfen
|
||
existing, status = _check_existing_layer(tab_widget)
|
||
if status == LoadStatus.KEEP:
|
||
return existing, status
|
||
|
||
# WFS mit Filter laden
|
||
wfs_uri_find = (
|
||
f"url='{alkis_NAS_url}' typename='{typename}' srsname='EPSG:25833' "
|
||
f"sql=SELECT * FROM AX_BauRaumOderBodenordnungsrecht "
|
||
f"WHERE bezeichnung LIKE '{verfahrensnummer}%'"
|
||
)
|
||
temp_layer = QgsVectorLayer(wfs_uri_find, "TempVerfahrensgebiet", "WFS")
|
||
|
||
if not temp_layer.isValid():
|
||
QMessageBox.critical(tab_widget, "Fehler", "Layer konnte nicht geladen werden.")
|
||
return None, LoadStatus.NONE
|
||
|
||
features = list(temp_layer.getFeatures())
|
||
if not features:
|
||
QMessageBox.critical(tab_widget, "Fehler",
|
||
f"Verfahrenskennzeichen {verfahrensnummer} nicht im WFS gefunden.")
|
||
return None, LoadStatus.NONE
|
||
|
||
union_geom = QgsGeometry.unaryUnion([f.geometry() for f in features])
|
||
if union_geom is None or union_geom.isEmpty():
|
||
QMessageBox.critical(tab_widget, "Fehler", "Keine Geometrien zum Verschmelzen gefunden.")
|
||
return None, LoadStatus.NONE
|
||
|
||
# Memory-Layer erzeugen
|
||
crs = temp_layer.crs().authid()
|
||
memory_layer = QgsVectorLayer(f"Polygon?crs={crs}", "Verfahrensgebiet", "memory")
|
||
pr = memory_layer.dataProvider()
|
||
pr.addAttributes([QgsField("VKZ", QVariant.String)])
|
||
memory_layer.updateFields()
|
||
|
||
feat_union = QgsFeature()
|
||
feat_union.setGeometry(union_geom)
|
||
feat_union.setAttributes([verfahrensnummer])
|
||
pr.addFeatures([feat_union])
|
||
memory_layer.updateExtents()
|
||
|
||
# Status: FIRST oder RELOAD
|
||
return memory_layer, status
|