test(extract): festgehaltene Zahlen auf den Fixwelle-Stand gebracht, Markierung-auf-Fahrbahn abgesichert
Befund 9: Nach dem Pipeline-Lauf mit den Befunden 3-8 geänderte Zahlen in test_committed_roads.py eingetragen (Restflächen 169 statt 171, Markierungsstücke haltelinie 1.555/zebra 14.846 statt 1.553/14.832, Flächen Gehweg 0,2987/Restflächen 0,0967 statt 0,2982/0,0972 km² - Bordstein, Fahrbahn und Kantenstücke je Klasse bleiben unverändert, weil keiner der Befunde am Graphen oder an carriageway/curb rührt) sowie den Messwerte-Absatz „Gemessen nach der Fixwelle" im Entwurf ergänzt. Beide Abnahmen erneut bestanden: zweiter Lauf ändert keine Datei, beide Suiten grün. Befund 10: Neuer Test test_markierung_liegt_nicht_wesentlich_ausserhalb_ der_fahrbahn haelt fest, wie viel Markierungsflaeche ausserhalb der Fahrbahn liegt. Rechnerisch gegen die Daten vor der Fixwelle nachgewiesen, dass er vor Befund 3 mit 452,65 m² weit über jeder sinnvollen Schranke rot gewesen waere. Die Schranke (130 m²) ist kein reiner Rundungswert: Befund 3 senkt den echten Wert auf 110,06 m² (0,25 % von 43.906 m²), behebt das Problem aber nicht vollständig - ein Bogen kann zwischen reach und reach + STOP_SETBACK + STOP_DEPTH noch einmal abknicken, was die umgesetzte Korrektur nicht auffängt. Das ist im Test-Docstring und im Fixwelle-Bericht offengelegt, nicht stillschweigend toleriert.
This commit is contained in:
1 parent
37f9381934
commit
349212fedf
2 files changed
+36
-5
No files matched your search
@@ -305,6 +305,7 @@ Vier Blicke im Browser: eine Kreuzung von oben, eine Straße auf Augenhöhe, ein
|
|||||||
- **Der Kit-Ordner fehlt.** Die Texturen sind nach dem ersten Lauf versioniert; das Importskript muss ohne den Ordner durchlaufen und das sagen, statt abzubrechen.
|
- **Der Kit-Ordner fehlt.** Die Texturen sind nach dem ersten Lauf versioniert; das Importskript muss ohne den Ordner durchlaufen und das sagen, statt abzubrechen.
|
||||||
- **Z-Fighting auf der Fahrbahn.** Markierungen liegen 1 cm über der Fahrbahn und bekommen zusätzlich die vorderste Versatzstufe.
|
- **Z-Fighting auf der Fahrbahn.** Markierungen liegen 1 cm über der Fahrbahn und bekommen zusätzlich die vorderste Versatzstufe.
|
||||||
- **Gemessen im Spiel** (Task 16, `run.py` auf der ganzen Karte, Ausgabe wörtlich): „Straßennetz: 1.537 Knoten, 1.790 Kanten"; „Straßen: 830 Bordsteinstücke, 171 Restflächen, 22.394 Markierungen {gelb_doppelt 974, gelb_gestrichelt 2.341, haltelinie 1.496, weiss_gestrichelt 2.040, weiss_rand 974, zebra 14.569}, 56 Palmen an der Fahrbahn entfernt"; „Flamingo Park: 2 Wegflächen, 14 Flächen, 11 Gebäude, Jefferson Avenue 12 m breit"; genau eine Warnung, „Zufahrt schneidet die Sperrfläche tribuene". Nachgemessen mit dem Skript aus Task 12: Fahrbahn 0,9076 km² (Erwartung 0,9084, Abweichung 0,088 %), Gehweg 0,2982 km² (0,2983, 0,034 %), Restflächen 0,0972 km² (0,0973, 0,103 %), Bordstein 120,28 km (120,61, 0,274 %) — alle vier unter der 1-%-Toleranz. Je Chunk gezählt: 479 Fahrbahn-, 1.322 Gehweg-, 282 Restflächen-, 1.415 Bordstein-, 2.218 Kantenstücke, 23.256 Markierungsstücke; Kantenstücke je Klasse boulevard 270, wohnstrasse 537, gasse 1.010, hauptstrasse 401 (alle vier Klassen besetzt); Markierungsstücke je Art gelb_doppelt 1.216, gelb_gestrichelt 2.370, haltelinie 1.553, weiss_gestrichelt 2.066, weiss_rand 1.219, zebra 14.832 (alle sechs über der „Straßen:"-Zeile des Laufs, keine 0); 0 Palmen auf der Fahrbahn. Beide Abnahmen bestanden: ein zweiter, unveränderter Lauf ändert keine einzige Datei unter `public/data/vice-a` (Risiko „Alle Chunks ändern sich" oben), und mit den neu erzeugten Chunks laufen sowohl der bis dahin übersprungene Minimap-Abgleich (`test_committed_map_files_match_the_committed_chunks`) als auch `tests/placesSite.test.js` grün — beide prüfen jetzt zum ersten Mal echt gegen Fahrbahn, Gehweg, Restflächen und `chunkLampPoints`. Das Risiko „gelöcherte Bodenplatte" (oben, Task 1) blieb entschärft: 100 Löcher in 3,98–4,52 ms trianguliert, weit unter der 50-ms-Grenze. `tests/parkData.test.js` prüfte die vier Fahrzeug-Startpunkte anfangs noch gegen den alten Schlüssel `c.roads`; in diesem Branch mit Commit `05e2914` auf `carriageway` umgestellt und grün.
|
- **Gemessen im Spiel** (Task 16, `run.py` auf der ganzen Karte, Ausgabe wörtlich): „Straßennetz: 1.537 Knoten, 1.790 Kanten"; „Straßen: 830 Bordsteinstücke, 171 Restflächen, 22.394 Markierungen {gelb_doppelt 974, gelb_gestrichelt 2.341, haltelinie 1.496, weiss_gestrichelt 2.040, weiss_rand 974, zebra 14.569}, 56 Palmen an der Fahrbahn entfernt"; „Flamingo Park: 2 Wegflächen, 14 Flächen, 11 Gebäude, Jefferson Avenue 12 m breit"; genau eine Warnung, „Zufahrt schneidet die Sperrfläche tribuene". Nachgemessen mit dem Skript aus Task 12: Fahrbahn 0,9076 km² (Erwartung 0,9084, Abweichung 0,088 %), Gehweg 0,2982 km² (0,2983, 0,034 %), Restflächen 0,0972 km² (0,0973, 0,103 %), Bordstein 120,28 km (120,61, 0,274 %) — alle vier unter der 1-%-Toleranz. Je Chunk gezählt: 479 Fahrbahn-, 1.322 Gehweg-, 282 Restflächen-, 1.415 Bordstein-, 2.218 Kantenstücke, 23.256 Markierungsstücke; Kantenstücke je Klasse boulevard 270, wohnstrasse 537, gasse 1.010, hauptstrasse 401 (alle vier Klassen besetzt); Markierungsstücke je Art gelb_doppelt 1.216, gelb_gestrichelt 2.370, haltelinie 1.553, weiss_gestrichelt 2.066, weiss_rand 1.219, zebra 14.832 (alle sechs über der „Straßen:"-Zeile des Laufs, keine 0); 0 Palmen auf der Fahrbahn. Beide Abnahmen bestanden: ein zweiter, unveränderter Lauf ändert keine einzige Datei unter `public/data/vice-a` (Risiko „Alle Chunks ändern sich" oben), und mit den neu erzeugten Chunks laufen sowohl der bis dahin übersprungene Minimap-Abgleich (`test_committed_map_files_match_the_committed_chunks`) als auch `tests/placesSite.test.js` grün — beide prüfen jetzt zum ersten Mal echt gegen Fahrbahn, Gehweg, Restflächen und `chunkLampPoints`. Das Risiko „gelöcherte Bodenplatte" (oben, Task 1) blieb entschärft: 100 Löcher in 3,98–4,52 ms trianguliert, weit unter der 50-ms-Grenze. `tests/parkData.test.js` prüfte die vier Fahrzeug-Startpunkte anfangs noch gegen den alten Schlüssel `c.roads`; in diesem Branch mit Commit `05e2914` auf `carriageway` umgestellt und grün.
|
||||||
|
- **Gemessen nach der Fixwelle** (2026-09-18, `run.py` erneut auf der ganzen Karte, nach den Befunden 3–8 der Abschlussprüfung): „Straßennetz: 1.537 Knoten, 1.790 Kanten" (unverändert — keiner der Befunde rührt am Graphen); „Straßen: 830 Bordsteinstücke, 169 Restflächen, 22.393 Markierungen {gelb_doppelt 974, gelb_gestrichelt 2.341, haltelinie 1.496, weiss_gestrichelt 2.040, weiss_rand 973, zebra 14.569}, 56 Palmen an der Fahrbahn entfernt"; dieselbe eine Warnung wie oben. Nachgemessen mit demselben Skript: Fahrbahn 0,9076 km² (unverändert) und Bordstein 120,28 km (unverändert) — beide Befunde (5, 6) ändern hier nichts Messbares. Gehweg 0,2987 km² (statt 0,2982, +0,17 %) und Restflächen 0,0967 km² (statt 0,0972, −0,51 %): Befund 7 schließt die Gehweglücke an gewöhnlichen Kreuzungsecken, der Gehweg wächst entsprechend, die Restfläche schrumpft — beide weiterhin unter der 1-%-Toleranz gegen die ursprüngliche Erwartung. Je Chunk gezählt: 479 Fahrbahn-, 1.322 Gehweg-, 279 Restflächen- (statt 282), 1.415 Bordstein-, 2.218 Kantenstücke (alle vier unverändert bis auf Restflächen), 23.272 Markierungsstücke (statt 23.256 — die neue Position der Markierungen aus den Befunden 3 und 8 schneidet an den Chunkgrenzen geringfügig anders zu); Kantenstücke je Klasse unverändert; Markierungsstücke je Art gelb_doppelt 1.216, gelb_gestrichelt 2.370, haltelinie 1.555, weiss_gestrichelt 2.066, weiss_rand 1.219, zebra 14.846 (nur haltelinie und zebra ändern sich, um 2 bzw. 14 Stücke); 0 Palmen auf der Fahrbahn (unverändert). Beide Abnahmen erneut bestanden: ein zweiter Lauf nach dem Commit der Daten ändert keine einzige Datei unter `public/data/vice-a`, und `test_committed_map_files_match_the_committed_chunks` sowie `tests/placesSite.test.js` bleiben grün. Zusätzlich zu Befund 3 gemessen (Fläche von `markings` außerhalb von `carriageway`, über alle Chunks summiert): 452,65 m² vor der Korrektur (1,03 % von 43.906 m² Markierungsfläche, rechnerisch gegen die vor der Fixwelle ausgelieferten Daten nachgewiesen), 110,06 m² danach (0,25 %) — eine Verbesserung um 75,7 %, aber keine vollständige Behebung; der Rest sind Bögen, die zwischen der Streckenlänge `reach` und `reach + STOP_SETBACK + STOP_DEPTH` noch einmal abknicken, was ein einzelner Richtungsstrahl nicht mehr auffängt (die vom Befund selbst genannte größere Alternative, „die Markierung entlang der tatsächlichen Kante aufbauen", setzt diese Fixwelle nicht um). Einzelheiten im Fixwelle-Bericht (`.superpowers/sdd/2026-09-16-strassen/fixwelle-report.md`).
|
||||||
|
|
||||||
## Nicht Teil dieser Arbeit
|
## Nicht Teil dieser Arbeit
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ from collections import Counter
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from shapely.geometry import LineString, Point, Polygon
|
from shapely.geometry import LineString, Point, Polygon
|
||||||
|
from shapely.ops import unary_union
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parents[3] / "public" / "data" / "vice-a"
|
ROOT = Path(__file__).resolve().parents[3] / "public" / "data" / "vice-a"
|
||||||
|
|
||||||
@@ -32,22 +33,22 @@ def test_kantenstuecke_je_klasse():
|
|||||||
|
|
||||||
def test_markierungsstuecke_je_art():
|
def test_markierungsstuecke_je_art():
|
||||||
assert dict(Counter(m["art"] for c in _chunks() for m in c["markings"])) == {
|
assert dict(Counter(m["art"] for c in _chunks() for m in c["markings"])) == {
|
||||||
"gelb_doppelt": 1216, "gelb_gestrichelt": 2370, "haltelinie": 1553,
|
"gelb_doppelt": 1216, "gelb_gestrichelt": 2370, "haltelinie": 1555,
|
||||||
"weiss_gestrichelt": 2066, "weiss_rand": 1219, "zebra": 14832,
|
"weiss_gestrichelt": 2066, "weiss_rand": 1219, "zebra": 14846,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def test_restflaechen_und_bordsteinstuecke():
|
def test_restflaechen_und_bordsteinstuecke():
|
||||||
chunks = _chunks()
|
chunks = _chunks()
|
||||||
assert sum(len(c["lots"]) for c in chunks) == 282 # „lots" aus „Stücke, je Chunk gezählt"
|
assert sum(len(c["lots"]) for c in chunks) == 279 # „lots" aus „Stücke, je Chunk gezählt"
|
||||||
assert sum(len(c["curb"]) for c in chunks) == 1415 # „curb" aus „Stücke, je Chunk gezählt"
|
assert sum(len(c["curb"]) for c in chunks) == 1415 # „curb" aus „Stücke, je Chunk gezählt"
|
||||||
|
|
||||||
|
|
||||||
def test_flaechen_und_bordsteinlaenge():
|
def test_flaechen_und_bordsteinlaenge():
|
||||||
chunks = _chunks()
|
chunks = _chunks()
|
||||||
assert round(_flaeche(chunks, "carriageway") / 1e6, 4) == 0.9076 # aus „Flächen km²"
|
assert round(_flaeche(chunks, "carriageway") / 1e6, 4) == 0.9076 # aus „Flächen km²"
|
||||||
assert round(_flaeche(chunks, "sidewalk") / 1e6, 4) == 0.2982
|
assert round(_flaeche(chunks, "sidewalk") / 1e6, 4) == 0.2987
|
||||||
assert round(_flaeche(chunks, "lots") / 1e6, 4) == 0.0972
|
assert round(_flaeche(chunks, "lots") / 1e6, 4) == 0.0967
|
||||||
laenge = sum(LineString(line).length for c in chunks for line in c["curb"])
|
laenge = sum(LineString(line).length for c in chunks for line in c["curb"])
|
||||||
assert round(laenge / 1e3, 2) == 120.28 # aus „Bordstein km"
|
assert round(laenge / 1e3, 2) == 120.28 # aus „Bordstein km"
|
||||||
|
|
||||||
@@ -57,3 +58,32 @@ def test_keine_palme_auf_der_fahrbahn():
|
|||||||
fahrbahn = [Polygon(i["poly"][0], i["poly"][1:]) for i in c["carriageway"]]
|
fahrbahn = [Polygon(i["poly"][0], i["poly"][1:]) for i in c["carriageway"]]
|
||||||
auf = [p for p in c["palms"] if any(f.contains(Point(p)) for f in fahrbahn)]
|
auf = [p for p in c["palms"] if any(f.contains(Point(p)) for f in fahrbahn)]
|
||||||
assert auf == [], f"Chunk {c['chunk']}"
|
assert auf == [], f"Chunk {c['chunk']}"
|
||||||
|
|
||||||
|
|
||||||
|
def test_markierung_liegt_nicht_wesentlich_ausserhalb_der_fahrbahn():
|
||||||
|
"""Befund 10 der Fixwelle: Vor Befund 3 lagen 452,65 m² Markierungsfläche (1,03 % von
|
||||||
|
43.906 m²) außerhalb der Fahrbahn, weil "along" in junction_marks() nur aus dem ersten
|
||||||
|
Segment einer Zufahrt kam. Rechnerisch nachgewiesen gegen die damals ausgelieferten Daten
|
||||||
|
(Commit 0ad6eee, vor dieser Fixwelle) - mit dem hier verwendeten Maß (Fläche von markings
|
||||||
|
minus der Vereinigung von carriageway, je Chunk summiert) maß dieser Befund dort 452,65 m²
|
||||||
|
und wäre an jeder Schranke unter diesem Wert rot gewesen.
|
||||||
|
|
||||||
|
Befund 3 behebt den Hauptteil davon (auf 110,06 m² = 0,25 %, siehe Fixwelle-Bericht), aber
|
||||||
|
nicht den ganzen Rest: Ein Bogen kann zwischen Streckenlänge reach und
|
||||||
|
reach + STOP_SETBACK + STOP_DEPTH noch einmal abknicken, was ein einzelner Richtungsstrahl
|
||||||
|
nicht mehr auffängt - das verlangte die vom Befund selbst genannte, größere Alternative ("die
|
||||||
|
Markierung entlang der tatsächlichen Kante aufbauen"), die diese Fixwelle nicht umsetzt. Die
|
||||||
|
Schranke hier ist deshalb *kein* reiner Rundungswert, sondern hält den mit Befund 3
|
||||||
|
erreichten, im Fixwelle-Bericht offengelegten Stand fest (mit etwas Luft nach oben) und
|
||||||
|
schlägt bei einer echten Verschlechterung an.
|
||||||
|
"""
|
||||||
|
gesamt_ausserhalb = 0.0
|
||||||
|
for c in _chunks():
|
||||||
|
fahrbahn = unary_union([Polygon(i["poly"][0], i["poly"][1:]) for i in c.get("carriageway", [])])
|
||||||
|
for m in c.get("markings", []):
|
||||||
|
poly = Polygon(m["poly"][0], m["poly"][1:])
|
||||||
|
gesamt_ausserhalb += poly.difference(fahrbahn).area if not fahrbahn.is_empty else poly.area
|
||||||
|
assert gesamt_ausserhalb < 130.0, (
|
||||||
|
f"{gesamt_ausserhalb:.2f} m² Markierungsfläche liegen außerhalb der Fahrbahn "
|
||||||
|
"(Fixwelle-Stand: 110,06 m²) - das ist mehr als der dokumentierte Rest, nicht nur Rundung"
|
||||||
|
)
|
||||||
Reference in new issue
Block a user