test(extract): ausgelieferte Straßen festhalten, Messwerte in den Entwurf
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e640f551a4
commit
8bc688561c
2 files changed
+60
No files matched your search
@@ -0,0 +1,59 @@
|
||||
"""Die ausgelieferten Straßen, festgehalten (Entwurf, Abschnitt Tests: Integrationslauf).
|
||||
|
||||
Der Test liest die committeten Chunks, nicht den Lauf — die Kacheln liegen nicht im Repository.
|
||||
Die Zahlen sind beim Neuerzeugen gemessen. Ändert sich die Extraktion absichtlich, gehören die neuen
|
||||
Zahlen hierher, mit einem Satz im Commit, warum. Die Kreuzungszahl fehlt, weil die Chunks keine
|
||||
Knoten tragen; sie steht in den Messwerten des Entwurfs.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from collections import Counter
|
||||
from pathlib import Path
|
||||
|
||||
from shapely.geometry import LineString, Point, Polygon
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[3] / "public" / "data" / "vice-a"
|
||||
|
||||
|
||||
def _chunks() -> list[dict]:
|
||||
return [json.loads(p.read_text(encoding="utf-8")) for p in sorted(ROOT.glob("chunk_*.json"))]
|
||||
|
||||
|
||||
def _flaeche(chunks, key) -> float:
|
||||
return sum(Polygon(i["poly"][0], i["poly"][1:]).area for c in chunks for i in c.get(key, []))
|
||||
|
||||
|
||||
def test_kantenstuecke_je_klasse():
|
||||
assert dict(Counter(e["klasse"] for c in _chunks() for e in c["edges"])) == {
|
||||
"boulevard": 270, "wohnstrasse": 537, "gasse": 1010, "hauptstrasse": 401,
|
||||
}
|
||||
|
||||
|
||||
def test_markierungsstuecke_je_art():
|
||||
assert dict(Counter(m["art"] for c in _chunks() for m in c["markings"])) == {
|
||||
"gelb_doppelt": 1216, "gelb_gestrichelt": 2370, "haltelinie": 1553,
|
||||
"weiss_gestrichelt": 2066, "weiss_rand": 1219, "zebra": 14832,
|
||||
}
|
||||
|
||||
|
||||
def test_restflaechen_und_bordsteinstuecke():
|
||||
chunks = _chunks()
|
||||
assert sum(len(c["lots"]) for c in chunks) == 282 # „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"
|
||||
|
||||
|
||||
def test_flaechen_und_bordsteinlaenge():
|
||||
chunks = _chunks()
|
||||
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, "lots") / 1e6, 4) == 0.0972
|
||||
laenge = sum(LineString(line).length for c in chunks for line in c["curb"])
|
||||
assert round(laenge / 1e3, 2) == 120.28 # aus „Bordstein km"
|
||||
|
||||
|
||||
def test_keine_palme_auf_der_fahrbahn():
|
||||
for c in _chunks():
|
||||
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)]
|
||||
assert auf == [], f"Chunk {c['chunk']}"
|
||||
Reference in new issue
Block a user