Vergleich BROR-VG
This commit is contained in:
@@ -444,7 +444,7 @@ def verfahrensgebiet_alkis_komplett(
|
|||||||
"Abweichung erkannt",
|
"Abweichung erkannt",
|
||||||
f"Abweichung zwischen BauRaumOderBodenordnungsrecht-Objekt und abgeleitetem "
|
f"Abweichung zwischen BauRaumOderBodenordnungsrecht-Objekt und abgeleitetem "
|
||||||
f"Verfahrensgebiet erkannt.\n\n"
|
f"Verfahrensgebiet erkannt.\n\n"
|
||||||
f"BauRaumOderBodenordnungsrecht: {bror_flaeche:.2f} m²\n"
|
f"As: {bror_flaeche:.2f} m²\n"
|
||||||
f"Verfahrensgebiet: {vg_flaeche:.2f} m²\n"
|
f"Verfahrensgebiet: {vg_flaeche:.2f} m²\n"
|
||||||
f"Differenz: {diff:.2f} m²\n\n"
|
f"Differenz: {diff:.2f} m²\n\n"
|
||||||
f"Wie möchten Sie fortfahren?",
|
f"Wie möchten Sie fortfahren?",
|
||||||
|
|||||||
@@ -43,11 +43,11 @@ import os
|
|||||||
import zipfile
|
import zipfile
|
||||||
from typing import Optional, Tuple
|
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 import QMessageBox
|
||||||
from sn_basis.functions.message_wrapper import warning
|
from sn_basis.functions.message_wrapper import warning
|
||||||
from sn_basis.functions.variable_wrapper import get_variable
|
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.qgiscore_wrapper import QgsGeometry
|
||||||
from sn_basis.functions.dialog_wrapper import (
|
from sn_basis.functions.dialog_wrapper import (
|
||||||
create_progress_dialog,
|
create_progress_dialog,
|
||||||
@@ -84,6 +84,117 @@ from sn_verfahrensgebiet.functions.verfahrensgebiet_alkis_komplett import (
|
|||||||
# Interne Hilfsfunktionen
|
# 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]:
|
def _finde_shp(verzeichnis: str) -> Optional[str]:
|
||||||
"""Sucht rekursiv nach der ersten ``.shp``-Datei im Verzeichnis.
|
"""Sucht rekursiv nach der ersten ``.shp``-Datei im Verzeichnis.
|
||||||
|
|
||||||
@@ -443,6 +554,11 @@ def verfahrensgebiet_shape_komplett(
|
|||||||
dialog_ref_label = "BauRaumOderBodenordnungsrecht"
|
dialog_ref_label = "BauRaumOderBodenordnungsrecht"
|
||||||
dialog_vg_label = "Shape-Verfahrensgebiet "
|
dialog_vg_label = "Shape-Verfahrensgebiet "
|
||||||
pruef_layer = bror_layer
|
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:
|
else:
|
||||||
# Kein BROR → temp. enriched Layer aus Flurstücken erzeugen
|
# Kein BROR → temp. enriched Layer aus Flurstücken erzeugen
|
||||||
temp_enriched, _, _ = erstelle_verfahrensgebiet_aus_auswahl(flst_layer)
|
temp_enriched, _, _ = erstelle_verfahrensgebiet_aus_auswahl(flst_layer)
|
||||||
|
|||||||
Reference in New Issue
Block a user