from enum import Enum from qgis.core import ( QgsVectorLayer, QgsProject, QgsFeature, QgsField, 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" class LoadStatus(Enum): NONE = "none" # nichts geladen FIRST = "first" # erstmalig geladen RELOAD = "reload" # neu geladen KEEP = "keep" # vorhandener Layer behalten def _check_existing_layer(tab_widget): 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): 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