Vergleich BROR-VG
This commit is contained in:
@@ -43,11 +43,11 @@ import os
|
||||
import zipfile
|
||||
from typing import Optional, Tuple
|
||||
|
||||
from sn_basis.functions import QgsProject, QgsVectorLayer, QgsFeature
|
||||
from sn_basis.functions import QgsProject, QgsVectorLayer, QgsFeature, QgsField
|
||||
from sn_basis.functions import QMessageBox
|
||||
from sn_basis.functions.message_wrapper import warning
|
||||
from sn_basis.functions.variable_wrapper import get_variable
|
||||
from sn_basis.functions.qt_wrapper import QFileDialog
|
||||
from sn_basis.functions.qt_wrapper import QFileDialog, QVariant
|
||||
from sn_basis.functions.qgiscore_wrapper import QgsGeometry
|
||||
from sn_basis.functions.dialog_wrapper import (
|
||||
create_progress_dialog,
|
||||
@@ -84,6 +84,117 @@ from sn_verfahrensgebiet.functions.verfahrensgebiet_alkis_komplett import (
|
||||
# Interne Hilfsfunktionen
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def _wende_vergleich_stil_an(layer) -> None:
|
||||
"""Wendet einen kategorisierten Renderer auf den Vergleich-Layer an.
|
||||
|
||||
Farben:
|
||||
- ``identisch`` (Schnittmenge): Gr\u00fcn
|
||||
- ``nur_bror`` (nur im BROR): Gelb
|
||||
- ``nur_vg`` (nur im Verfahrensgebiet): Blau
|
||||
|
||||
Schl\u00e4gt der Import der QGIS-Rendering-Klassen fehl (z.\u00a0B. im
|
||||
Test-Modus), wird der Fehler still ignoriert.
|
||||
"""
|
||||
try:
|
||||
from qgis.core import ( # type: ignore[import]
|
||||
QgsCategorizedSymbolRenderer,
|
||||
QgsRendererCategory,
|
||||
QgsFillSymbol,
|
||||
)
|
||||
|
||||
_FARBEN = [
|
||||
("identisch", "#00aa00", 0.5), # gr\u00fcn
|
||||
("nur_bror", "#ffcc00", 0.5), # gelb
|
||||
("nur_vg", "#3366ff", 0.5), # blau
|
||||
]
|
||||
|
||||
kategorien = []
|
||||
for wert, farbe, opazitaet in _FARBEN:
|
||||
symbol = QgsFillSymbol.createSimple({
|
||||
"color": farbe,
|
||||
"outline_color": "#555555",
|
||||
"outline_width": "0.26",
|
||||
})
|
||||
symbol.setOpacity(opazitaet)
|
||||
kategorien.append(QgsRendererCategory(wert, symbol, wert))
|
||||
|
||||
renderer = QgsCategorizedSymbolRenderer("typ", kategorien)
|
||||
layer.setRenderer(renderer)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def _erstelle_vergleich_layer(vg_layer, bror_layer) -> Optional[object]:
|
||||
"""Erzeugt einen Vergleich-Layer aus geometrischen Differenzoperationen.
|
||||
|
||||
F\u00fcr jeden Fl\u00e4chentyp wird ein Feature angelegt:
|
||||
|
||||
- ``identisch``: Schnittmenge aus VG und BROR (gr\u00fcn).
|
||||
- ``nur_bror``: Fl\u00e4che, die nur im BROR-Objekt liegt (gelb).
|
||||
- ``nur_vg``: Fl\u00e4che, die nur im Verfahrensgebiet liegt (blau).
|
||||
|
||||
Parameters
|
||||
----------
|
||||
vg_layer :
|
||||
Verfahrensgebiet-Layer (Shape).
|
||||
bror_layer :
|
||||
BauRaumOderBodenordnungsrecht-Layer (ALKIS).
|
||||
|
||||
Returns
|
||||
-------
|
||||
Optional[QgsVectorLayer]
|
||||
Memory-Layer ``Vergleich`` mit Stil oder ``None`` bei Fehler.
|
||||
"""
|
||||
try:
|
||||
vg_geom = None
|
||||
for feat in vg_layer.getFeatures():
|
||||
g = feat.geometry()
|
||||
if g and not g.isEmpty():
|
||||
vg_geom = g
|
||||
break
|
||||
|
||||
bror_geom = None
|
||||
for feat in bror_layer.getFeatures():
|
||||
g = feat.geometry()
|
||||
if g and not g.isEmpty():
|
||||
bror_geom = g
|
||||
break
|
||||
|
||||
if not vg_geom or not bror_geom:
|
||||
return None
|
||||
|
||||
geom_identisch = vg_geom.intersection(bror_geom)
|
||||
geom_nur_bror = bror_geom.difference(vg_geom)
|
||||
geom_nur_vg = vg_geom.difference(bror_geom)
|
||||
|
||||
crs = vg_layer.crs().authid()
|
||||
mem_layer = QgsVectorLayer(
|
||||
f"MultiPolygon?crs={crs}", "Vergleich", "memory"
|
||||
)
|
||||
pr = mem_layer.dataProvider()
|
||||
pr.addAttributes([QgsField("typ", QVariant.String)])
|
||||
mem_layer.updateFields()
|
||||
|
||||
feats = []
|
||||
for geom, typ in [
|
||||
(geom_identisch, "identisch"),
|
||||
(geom_nur_bror, "nur_bror"),
|
||||
(geom_nur_vg, "nur_vg"),
|
||||
]:
|
||||
if geom and not geom.isEmpty():
|
||||
f = QgsFeature()
|
||||
f.setGeometry(geom)
|
||||
f.setAttributes([typ])
|
||||
feats.append(f)
|
||||
|
||||
pr.addFeatures(feats)
|
||||
mem_layer.updateExtents()
|
||||
_wende_vergleich_stil_an(mem_layer)
|
||||
|
||||
return mem_layer if mem_layer.isValid() else None
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def _finde_shp(verzeichnis: str) -> Optional[str]:
|
||||
"""Sucht rekursiv nach der ersten ``.shp``-Datei im Verzeichnis.
|
||||
|
||||
@@ -443,6 +554,11 @@ def verfahrensgebiet_shape_komplett(
|
||||
dialog_ref_label = "BauRaumOderBodenordnungsrecht"
|
||||
dialog_vg_label = "Shape-Verfahrensgebiet "
|
||||
pruef_layer = bror_layer
|
||||
|
||||
# Vergleich-Layer (grün/gelb/blau) ins Projekt einfügen
|
||||
vergleich_layer = _erstelle_vergleich_layer(shape_vg_layer, bror_layer)
|
||||
if vergleich_layer:
|
||||
project.addMapLayer(vergleich_layer)
|
||||
else:
|
||||
# Kein BROR → temp. enriched Layer aus Flurstücken erzeugen
|
||||
temp_enriched, _, _ = erstelle_verfahrensgebiet_aus_auswahl(flst_layer)
|
||||
|
||||
Reference in New Issue
Block a user