fix(extract): Sperrflächen auch aus Zufahrtsflächen ausschneiden und davor warnen

Zufahrtsflächen (highway=service) wurden bisher ungeschnitten ausgegeben und nicht auf
Überschneidung mit Sperrflächen geprüft. Am echten Stand überlappte eine Zufahrt die
Sperrfläche "tribuene" um 42,17 m² ohne Schnitt und ohne Warnung. build_layout wendet
difference(blocked) jetzt auch auf Zufahrten an, die Warnschleife prüft Wege und
Zufahrten getrennt ("Parkweg schneidet ..." / "Zufahrt schneidet ...").

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Sonnet 5 committed 2026-09-16 07:20:41 +02:00
1 parent 26aafbbbd5
commit d756eccd77
2 files changed
+22 -4

No files matched your search

+13 -4
View File
@@ -338,23 +338,32 @@ def build_layout(elements: list[dict], config, fit: ParkFit) -> ParkLayout:
if kind is not None:
surfaces[kind].extend(_polygons(game_poly.difference(blocked)))
warnings, paths = [], []
warnings, paths, service_polys = [], [], []
if footways:
union = unary_union(footways)
warnings = [f"Parkweg schneidet die Sperrfläche {k.name}"
for k, polygon in zip(config.keepouts, keepouts) if union.intersects(polygon)]
warnings += _keepout_warnings(union, config.keepouts, keepouts, "Parkweg")
paths = _polygons(union.difference(blocked))
if service:
service_union = unary_union(service)
warnings += _keepout_warnings(service_union, config.keepouts, keepouts, "Zufahrt")
service_polys = _polygons(service_union.difference(blocked))
return ParkLayout(
lawn=fit.game_quad,
surfaces=[(poly, kind) for kind in SURFACE_ORDER for poly in surfaces[kind]],
paths=paths,
service=_polygons(unary_union(service)) if service else [],
service=service_polys,
buildings=buildings,
keepouts=keepouts,
warnings=warnings,
)
def _keepout_warnings(union, config_keepouts, keepout_polys, label: str) -> list[str]:
"""Warnungstexte für alle Sperrflächen, die `union` (Parkwege oder Zufahrten) schneiden."""
return [f"{label} schneidet die Sperrfläche {k.name}"
for k, polygon in zip(config_keepouts, keepout_polys) if union.intersects(polygon)]
def _surface_kind(tags: dict) -> str | None:
sports = set(tags.get("sport", "").split(";"))
leisure = tags.get("leisure")