fix(extract): Gehweg waechst nur aus Fahrbahn mit Bordstein, nicht mehr aus allem
Die Reichweitenzone aus der letzten Runde (Gehweg aus der ganzen Fahrbahn wachsen lassen, dann eine Zone um jede bordsteinlose Klasse wieder abziehen) fragte die falsche Richtung: "liegt dieser Punkt nahe einer Gasse?" statt "gehoert die naechste Fahrbahn zu einer Klasse mit Bordstein?". Die Zone kennt ihre Nachbarschaft nicht und frass dabei echten Wohnstrassen-Gehweg mit, sobald der zufaellig nah an einer Gasse lag - 250 von 500 m2 bei einer parallelen Gasse mit nur 0,5 m Korridorabstand, 7,58 m2 systematisch an jeder Gasse-Wohnstrasse- Einmuendung, unabhaengig von der Gassenlaenge. _walk_source(graph) baut die Fahrbahnquelle jetzt nur aus Kanten und Kreuzungen mit mindestens einem bordsteintragenden Arm (ribbon()/junction_area(), gefiltert auf SECTION[...].kerb). _sidewalk() waechst aus dieser Quelle statt aus der ganzen Fahrbahn und braucht keinen nachtraeglichen Abzug mehr. _kerbless_zone() bleibt nur noch fuer den Bordstein-Ausschluss in _kerb_lines(), mit dem urspruenglichen festen Zuschlag von 0,2 m. Rechenzeit am echten Netz gemessen: _walk_source() kostet zusaetzlich 1,8 s (carriageway_area() braucht 2,45 s), build_street() insgesamt rund 5,1-5,2 s - weit unter der 30-s-Schranke, kein Anlass, die Kreuzungsflaechen nur einmal statt zweimal zu berechnen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ea72cb934a
commit
ca5710730e
2 files changed
+84
-24
No files matched your search
@@ -130,3 +130,48 @@ def test_fahrbahn_gehweg_und_rest_ergeben_wieder_den_korridor():
|
||||
assert street.sidewalk.intersection(roh).area < 1e-6
|
||||
bilanz = street.carriageway.area + street.sidewalk.area + roh.area
|
||||
assert abs(bilanz - weit.area) < 1e-6
|
||||
|
||||
|
||||
def test_aufteilung_geht_fuer_jede_klasse_auf():
|
||||
# Fixrunde 3, Punkt 4: keine Klasse ausgenommen, auch nicht die Gasse (dort ist der Gehweg
|
||||
# leer, aber die Bilanz muss trotzdem exakt aufgehen: Fahrbahn plus roher Rest ergibt dann
|
||||
# den ganzen Korridor).
|
||||
for klass in SECTION:
|
||||
street = build_street(strasse(klass), korridor(klass), bridges=[])
|
||||
roh = korridor(klass).difference(street.carriageway).difference(street.sidewalk)
|
||||
bilanz = street.carriageway.area + street.sidewalk.area + roh.area
|
||||
assert abs(bilanz - korridor(klass).area) < 1e-6, klass
|
||||
|
||||
|
||||
def test_wohnstrasse_behaelt_ihren_gehweg_trotz_naher_paralleler_gasse():
|
||||
# Fixrunde 3: Der alte Ansatz ließ den Gehweg aus der *ganzen* Fahrbahn wachsen und zog
|
||||
# danach eine Reichweitenzone um jede bordsteinlose Klasse wieder ab. Diese Zone kennt ihre
|
||||
# Nachbarschaft nicht - jeder Punkt näher als WALK_MAX=3 m an einer Gassen-Mittellinie fiel
|
||||
# weg, auch wenn dort tatsächlich eine Wohnstraße liegt. Wohnstraße bei y=0 (Korridor bis
|
||||
# y=6), Gasse parallel bei y=9,5 (Korridor ab y=6,5) - 0,5 m Lücke zwischen den Korridoren,
|
||||
# die Gassen-Mittellinie liegt trotzdem nur 9,5 m entfernt, deutlich innerhalb der alten,
|
||||
# 6 m weiten Reichweitenzone (carriageway/2 + WALK_MAX = 3+3).
|
||||
graph = Graph(nodes=[Node((0.0, 0.0)), Node((100.0, 0.0)), Node((0.0, 9.5)), Node((100.0, 9.5))],
|
||||
edges=[Edge(0, 1, [(0.0, 0.0), (100.0, 0.0)], SECTION["wohnstrasse"].corridor, "wohnstrasse"),
|
||||
Edge(2, 3, [(0.0, 9.5), (100.0, 9.5)], SECTION["gasse"].corridor, "gasse")])
|
||||
corridor = unary_union([box(0, -6, 100, 6), box(0, 6.5, 100, 12.5)])
|
||||
street = build_street(graph, corridor, bridges=[])
|
||||
assert round(street.sidewalk.area) == 500, "die volle Gehwegfläche der Wohnstraße bleibt"
|
||||
|
||||
|
||||
def test_wohnstrassen_gehweg_bleibt_vollstaendig_an_gasseneinmuendung():
|
||||
# Fixrunde 3: an der T-Einmündung reichte dieselbe Reichweitenzone der Gasse (jetzt um ihre
|
||||
# volle Mittellinie, wegen Fixrunde 1) symmetrisch in beide Wohnstraßen-Gehwege an der Ecke
|
||||
# hinein - unabhängig von der Gassenlänge, solange die Gasse nicht selbst in der Nähe endet
|
||||
# (deshalb hier 10 m lang, nicht die 5 m aus dem Bordstein-Test oben). Zwei Punkte, die genau
|
||||
# in den vorher fehlenden, je 3,79 m² großen Flächen an den gerundeten Kreuzungsecken liegen.
|
||||
graph = Graph(nodes=[Node((0.0, 0.0)), Node((50.0, 0.0)), Node((100.0, 0.0)), Node((50.0, -10.0))],
|
||||
edges=[Edge(0, 1, [(0.0, 0.0), (50.0, 0.0)], SECTION["wohnstrasse"].corridor, "wohnstrasse"),
|
||||
Edge(1, 2, [(50.0, 0.0), (100.0, 0.0)], SECTION["wohnstrasse"].corridor, "wohnstrasse"),
|
||||
Edge(1, 3, [(50.0, 0.0), (50.0, -10.0)], SECTION["gasse"].corridor, "gasse")])
|
||||
wohn_korridor = box(0, -6, 100, 6)
|
||||
gassen_korridor = LineString([(50.0, 0.0), (50.0, -10.0)]).buffer(SECTION["gasse"].corridor / 2,
|
||||
cap_style="flat")
|
||||
street = build_street(graph, unary_union([wohn_korridor, gassen_korridor]), bridges=[])
|
||||
assert street.sidewalk.contains(Point(45.0, -5.0)), "Wohnstraßen-Gehweg links der Einmündung"
|
||||
assert street.sidewalk.contains(Point(55.0, -5.0)), "Wohnstraßen-Gehweg rechts der Einmündung"
|
||||
Reference in new issue
Block a user