test(extract): toothless Gassen-Gehweg-Probe entfernt, Flaechenvaliditaet abgesichert

Nachpruefung der Fixwelle, drei Punkte:

test_gehweg_waechst_auch_bei_engem_winkel_nicht_in_die_gasse
(test_street.py) besteht identisch (0,0000 m²) unter dem aktuellen Code,
unter der verworfenen Fassung aus Fixrunde 4 und sogar unter einem
komplett ungefilterten walk_source = carriageway_area(graph) - nachgerechnet
mit einer Wegwerf-Kopie aller drei Varianten. Ursache: SECTION["gasse"].corridor
== SECTION["gasse"].carriageway, weshalb .difference(carriage) am Ende von
_sidewalk() den geprueften Streifen (die eigene Gassen-Fahrbahn) immer
loescht, unabhaengig davon, was _walk_source() liefert. Die Eigenschaft
selbst bleibt durch die drei benachbarten Tests
(test_gasse_bekommt_weder_gehweg_noch_bordstein,
test_gehweg_waechst_nicht_ueber_den_gassenstummel_an_geteilter_kreuzung,
test_gehwegrest_an_kreuzung_mit_mehreren_gassen_bleibt_aus) abgesichert,
die gegen dieselbe verworfene Fassung mit 53,11 bzw. 53,30 m² hart
durchfallen. Ein Test, der nicht fehlschlagen kann, taeuscht Deckung vor,
die es nicht gibt - entfernt statt umdimensioniert, weil eine Geometrie
mit nur einem Gassenarm die eigentliche Fixrunde-4-Nische (zwischen ZWEI
benachbarten Gassenstummeln) strukturell nie nachstellen kann.

test_schleife_die_auf_sich_selbst_zurueckfuehrt_bekommt_keine_markierung_daneben
(test_marking_junction.py) galt in der Nachpruefung ebenfalls als
unterscheidungslos (100% Fahrbahnanteil auch mit altem Code). Mit den
byte-genauen historischen Fassungen von junction_marks() (git show
4bf670e / ca01141) direkt in die bestehende Testfunktion eingesetzt
(Monkeypatch) zeigt sich das Gegenteil: Beide Vorstufen schlagen rot an
(schlechtester Anteil 64,9% bzw. 85,3%, an Haltelinie und aeusserstem
Zebrabalken), nur der aktuelle Code besteht. Der Test bleibt unveraendert,
mit einem Kommentar zur Gegenpruefung.

Neu: test_alle_flaechenschichten_sind_gueltige_polygone
(test_committed_roads.py) - Waechter aus Befund 5 (die alte
Koordinatenrundung erzeugte acht Selbstschnitte, ohne dass ein Test es
merkte). Prueft ueber alle 144 Chunks und alle sieben Flaechenschichten
(carriageway, land, sidewalk, surfaces, lots, bridges, paths), dass jeder
Ring ein gueltiges Polygon ergibt. Heute gruen (4.190 Flaechen, 0
ungueltige); rot nachgewiesen gegen den Datenstand vor Commit a397892
(9 ungueltige Polygone in 6 Chunks, per git show ohne Codeaenderung
nachgestellt).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Sonnet 5 committed 2026-09-18 09:07:27 +02:00
1 parent 5dcd188423
commit 35d69c3e6c
3 files changed
+52 -28

No files matched your search

-28
View File
@@ -1,8 +1,6 @@
"""Die Mulde: Löcher in der Bodenplatte, Bordsteinlinien, Gehwegflächen, Restflächen."""
from __future__ import annotations
import math
from shapely.geometry import LineString, Point, box
from shapely.ops import unary_union
@@ -260,29 +258,3 @@ def test_gehweg_schliesst_die_luecke_an_gewoehnlicher_kreuzungsecke():
luecke = sum(g.area for g in getattr(roh_rest, "geoms", [roh_rest])
if not g.is_empty and g.intersects(ecken) and g.area < LOT_MIN)
assert luecke < 0.05, f"{luecke:.4f} m² Lücke an den Kreuzungsecken, sollte geschlossen sein"
def test_gehweg_waechst_auch_bei_engem_winkel_nicht_in_die_gasse():
"""Gegenprobe zu obigem Befund-7-Fix, am schärfsten denkbaren Fall: Die Rundung des
Kreuzungsanteils darf nicht wieder (wie in Fixrunde 4) über eine benachbarte Gasse
hinwegreichen, auch wenn die Gasse in einem enges Winkel zwischen zwei Armen mit Bordstein
liegt - der Fall, in dem eine Schließung am ehesten eine Nische neben der Gasse mitfüllen
könnte. Zwei Wohnstraßen-Arme bei 0° und 40°, eine Gasse dazwischen, bei 10° bis 30° in 5°-
Schritten durchprobiert: In jedem Fall bleibt der Gehweg außerhalb des Gassenkorridors, weil
die Gasse selbst nie einen Arm in die zu schließende Fläche liefert (kerb_only=True).
"""
for grad in (10.0, 15.0, 20.0, 25.0, 30.0):
rad = math.radians(grad)
a = (60.0, 0.0)
b = (60.0 * math.cos(math.radians(40.0)), 60.0 * math.sin(math.radians(40.0)))
g = (60.0 * math.cos(rad), 60.0 * math.sin(rad))
graph = Graph(
nodes=[Node((0.0, 0.0)), Node(a), Node(b), Node(g)],
edges=[Edge(0, 1, [(0.0, 0.0), a], SECTION["wohnstrasse"].corridor, "wohnstrasse"),
Edge(0, 2, [(0.0, 0.0), b], SECTION["wohnstrasse"].corridor, "wohnstrasse"),
Edge(0, 3, [(0.0, 0.0), g], SECTION["gasse"].corridor, "gasse")])
corridor = carriageway_area(graph).buffer(3.0, join_style="round")
street = build_street(graph, corridor, bridges=[])
gassen_korridor = LineString([(0.0, 0.0), g]).buffer(SECTION["gasse"].corridor / 2, cap_style="flat")
leck = street.sidewalk.intersection(gassen_korridor).area
assert leck < 0.01, f"{leck:.4f} m² Gehweg im Gassenkorridor bei {grad}° Gassenwinkel"