86 lines
3.1 KiB
Python
86 lines
3.1 KiB
Python
import os
|
|
from qgis.core import (
|
|
QgsVectorLayer, QgsProject, QgsFeature, QgsField,
|
|
QgsFeatureRequest, QgsGeometry
|
|
)
|
|
from qgis.PyQt.QtWidgets import QMessageBox
|
|
from qgis.PyQt.QtCore import QVariant
|
|
from sn_basis import get_variable
|
|
|
|
alkis_NAS_url = "https://geodienste.sachsen.de/aaa/public_alkis/nas/wfs"
|
|
typename = "adv:AX_BauRaumOderBodenordnungsrecht"
|
|
|
|
|
|
def alkis_verfahrensgebiet(tab_widget):
|
|
verfahrensnummer = get_variable("verfahrensnummer")
|
|
if not verfahrensnummer:
|
|
QMessageBox.critical(tab_widget, "Fehler",
|
|
"Die Projektvariable 'sn_verfahrensnummer' ist nicht gesetzt.")
|
|
tab_widget.setze_haken(tab_widget.haken1, False)
|
|
return None, False
|
|
|
|
project = QgsProject.instance()
|
|
existing_layers = project.mapLayersByName("Verfahrensgebiet")
|
|
if existing_layers:
|
|
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())
|
|
else:
|
|
# Vorhandenen Layer zurückgeben, kein Neu-Laden
|
|
return existing_layers[0], False
|
|
|
|
# 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, False
|
|
|
|
features = list(temp_layer.getFeatures())
|
|
if not features:
|
|
QMessageBox.critical(tab_widget, "Fehler",
|
|
f"Verfahrenskennzeichen {verfahrensnummer} nicht im WFS gefunden.")
|
|
return None, False
|
|
|
|
# Geometrie bestimmen
|
|
if len(features) == 1:
|
|
union_geom = features[0].geometry()
|
|
else:
|
|
geoms = [f.geometry() for f in features]
|
|
union_geom = QgsGeometry.unaryUnion(geoms)
|
|
|
|
if union_geom is None or union_geom.isEmpty():
|
|
QMessageBox.critical(tab_widget, "Fehler", "Keine Geometrien zum Verschmelzen gefunden.")
|
|
return None, False
|
|
|
|
# Memory-Layer mit festem Namen "Verfahrensgebiet"
|
|
crs = temp_layer.crs().authid()
|
|
memory_layer = QgsVectorLayer(f"Polygon?crs={crs}", "Verfahrensgebiet", "memory")
|
|
pr = memory_layer.dataProvider()
|
|
|
|
# Feld "VKZ" hinzufügen
|
|
pr.addAttributes([QgsField("VKZ", QVariant.String)])
|
|
memory_layer.updateFields()
|
|
|
|
# Feature mit Geometrie erstellen
|
|
feat_union = QgsFeature()
|
|
feat_union.setGeometry(union_geom)
|
|
feat_union.setAttributes([verfahrensnummer])
|
|
pr.addFeatures([feat_union])
|
|
memory_layer.updateExtents()
|
|
|
|
return memory_layer, True
|