Compare commits

...
1 Commits
Author SHA1 Message Date
Daniel 0c5e6df736 fix: innere Ringe bleiben unberücksichtigt
Release Plugin / release (push) Successful in 4s
2026-07-10 09:29:25 +02:00
+24 -21
View File
@@ -277,21 +277,20 @@ def _fehlende_knickpunkte_via_verbindungslinien(
return 0, [] return 0, []
# ------------------------------------------------------------------ # ------------------------------------------------------------------
# Außenringe extrahieren # Alle Ringe extrahieren (Außen- und Innenringe)
# ------------------------------------------------------------------ # ------------------------------------------------------------------
exterior_rings: List[List[object]] = [] all_rings: List[List[object]] = []
if bror_union.isMultipart(): if bror_union.isMultipart():
for poly in bror_union.asMultiPolygon(): for poly in bror_union.asMultiPolygon():
if poly: for ring in poly:
exterior_rings.append([QgsPointXY(x, y) for x, y in poly[0]]) all_rings.append([QgsPointXY(x, y) for x, y in ring])
else: else:
poly = bror_union.asPolygon() for ring in bror_union.asPolygon():
if poly: all_rings.append([QgsPointXY(x, y) for x, y in ring])
exterior_rings.append([QgsPointXY(x, y) for x, y in poly[0]])
# Schlusspunkt (= Startpunkt, Ring geschlossen) entfernen # Schlusspunkt (= Startpunkt, Ring geschlossen) entfernen
cleaned_rings: List[List[object]] = [] cleaned_rings: List[List[object]] = []
for ring in exterior_rings: for ring in all_rings:
if len(ring) >= 2: if len(ring) >= 2:
if ( if (
abs(ring[-1].x() - ring[0].x()) < 1e-9 abs(ring[-1].x() - ring[0].x()) < 1e-9
@@ -661,7 +660,7 @@ def erstelle_korrigiertes_polygon(
return None, None return None, None
# ------------------------------------------------------------------ # ------------------------------------------------------------------
# Alle BROR-Außenringe extrahieren (Multipolygon-sicher) # Alle Polygon-Teile mit allen Ringen (Außen- und Innenringe)
# ------------------------------------------------------------------ # ------------------------------------------------------------------
try: try:
bror_feats = [ bror_feats = [
@@ -673,25 +672,26 @@ def erstelle_korrigiertes_polygon(
return None, None return None, None
if bror_union.isMultipart(): if bror_union.isMultipart():
all_raw_rings = [ all_poly_parts = [poly for poly in bror_union.asMultiPolygon() if poly]
poly[0] for poly in bror_union.asMultiPolygon() if poly
]
else: else:
poly = bror_union.asPolygon() poly = bror_union.asPolygon()
all_raw_rings = [poly[0]] if poly else [] all_poly_parts = [poly] if poly else []
except Exception: except Exception:
return None, None return None, None
if not all_raw_rings: if not all_poly_parts:
return None, None return None, None
all_line_segments: List[Tuple[object, object]] = [] all_line_segments: List[Tuple[object, object]] = []
all_polygon_feats: List[object] = [] all_polygon_feats: List[object] = []
# ------------------------------------------------------------------ # ------------------------------------------------------------------
# Pro Polygon-Teil: Identisch-Punkte verorten, Verlauf aufbauen # Pro Polygon-Teil: alle Ringe (Außen + Innen) verarbeiten
# ------------------------------------------------------------------ # ------------------------------------------------------------------
for raw_ring in all_raw_rings: for poly_rings in all_poly_parts:
corrected_qgs_rings: List[List[object]] = []
for raw_ring in poly_rings:
ring_pts = [QgsPointXY(x, y) for x, y in raw_ring] ring_pts = [QgsPointXY(x, y) for x, y in raw_ring]
if len(ring_pts) >= 2 and ( if len(ring_pts) >= 2 and (
abs(ring_pts[-1].x() - ring_pts[0].x()) < 1e-9 abs(ring_pts[-1].x() - ring_pts[0].x()) < 1e-9
@@ -714,14 +714,14 @@ def erstelle_korrigiertes_polygon(
on_ring.sort(key=lambda t: t[0]) on_ring.sort(key=lambda t: t[0])
if len(on_ring) < 3: if len(on_ring) < 3:
# Fallback: Original-Ring dieses Teilgebiets verwenden # Fallback: Original-Ring verwenden
ordered_pts: List[object] = ring_pts ordered_pts: List[object] = ring_pts
for j in range(len(ring_pts)): for j in range(len(ring_pts)):
all_line_segments.append( all_line_segments.append(
(ring_pts[j], ring_pts[(j + 1) % len(ring_pts)]) (ring_pts[j], ring_pts[(j + 1) % len(ring_pts)])
) )
else: else:
# Korrigierten Verlauf für diesen Teil aufbauen # Korrigierten Verlauf für diesen Ring aufbauen
ordered_pts = [] ordered_pts = []
n_part = len(on_ring) n_part = len(on_ring)
@@ -759,11 +759,14 @@ def erstelle_korrigiertes_polygon(
(all_pts_in_seg[j], all_pts_in_seg[j + 1]) (all_pts_in_seg[j], all_pts_in_seg[j + 1])
) )
if len(ordered_pts) < 3: if len(ordered_pts) >= 3:
corrected_qgs_rings.append(ordered_pts + [ordered_pts[0]])
if not corrected_qgs_rings:
continue continue
polygon_ring = ordered_pts + [ordered_pts[0]] # Erstes Element = Außenring, weitere = Innenringe (Löcher)
polygon_geom = QgsGeometry.fromPolygonXY([polygon_ring]) polygon_geom = QgsGeometry.fromPolygonXY(corrected_qgs_rings)
if polygon_geom and not polygon_geom.isEmpty(): if polygon_geom and not polygon_geom.isEmpty():
pf = QgsFeature() pf = QgsFeature()
pf.setGeometry(polygon_geom) pf.setGeometry(polygon_geom)