feat(extract): Bordstein an jeder Straße, auch an der Gasse
Der Bordstein ist keine Ausstattung wie ein Gehweg, sondern die Kante, an der der Asphalt endet — und die hat auch eine Hinterhofgasse. _kerb_lines() schneidet darum nur noch die Brücken aus dem Fahrbahnrand: Dort steckt die Fahrbahn im Deck, eine Kante stünde in der Luft. Gehweg und Markierung bleiben der Gasse weiterhin fern. Das Feld kerb im Querschnitt entfällt. Es steuerte zuletzt nur noch Gehweg und Markierung und war aus walk > 0 ableitbar; kerb_only heißt deshalb jetzt walk_only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
897eb8a1f6
commit
322693c892
5 files changed
+50
-50
No files matched your search
@@ -38,7 +38,7 @@ def build_street(graph: Graph, corridor, bridges) -> Street:
|
||||
sidewalk = _sidewalk(_walk_source(graph), carriage, corridor)
|
||||
return Street(
|
||||
carriageway=carriage,
|
||||
kerb=_kerb_lines(carriage, _kerbless_zone(graph, 0.2), bridges),
|
||||
kerb=_kerb_lines(carriage, bridges),
|
||||
sidewalk=sidewalk,
|
||||
lots=_lots(carriage, corridor, sidewalk),
|
||||
)
|
||||
@@ -53,44 +53,24 @@ def _walk_source(graph: Graph):
|
||||
in Fixrunde 4 zu viel Gasse mit, weil sie die einspringende Ecke zwischen zwei benachbarten
|
||||
Gassenstummeln zu einer Nische auffüllte. Der eigentliche Fehler war aber, Gassenarme
|
||||
überhaupt in die zu rundende Fläche aufzunehmen - nicht die Rundung selbst. Ohne sie blieb
|
||||
stattdessen an jeder gewöhnlichen Kreuzung (mehrere Arme mit Bordstein, keine Gasse
|
||||
stattdessen an jeder gewöhnlichen Kreuzung (mehrere Arme mit Gehweg, keine Gasse
|
||||
beteiligt) eine Lücke zwischen der ungerundeten Gehwegquelle und der gerundeten Fahrbahn:
|
||||
0,26-2,2 m² je Ecke bei 690 Kreuzungen, weil `carriage` (carriageway_area(), gerundet mit
|
||||
FILLET=6) und `walk_source` (ungerundet) an der Kreuzungsecke verschieden geformt waren und
|
||||
eine reine Dilatation um WALK_MAX=3 eine Reflexecke nicht nachzeichnet.
|
||||
|
||||
junction_area(kerb_only=True) rundet jetzt nur den Kreuzungsanteil der bordsteintragenden
|
||||
junction_area(walk_only=True) rundet jetzt nur den Kreuzungsanteil der bordsteintragenden
|
||||
Arme: Eine Gasse liefert dabei keinen Arm in die zu schließende Fläche und kann deshalb auch
|
||||
keine Nische mit einem Nachbararm bilden, gewöhnliche Kreuzungsecken bekommen aber dieselbe
|
||||
Rundung wie die Fahrbahn und schließen die Lücke.
|
||||
"""
|
||||
teile = [band for k, edge in enumerate(graph.edges)
|
||||
if SECTION[edge.klass].kerb and (band := ribbon(graph, k)) is not None]
|
||||
if SECTION[edge.klass].walk and (band := ribbon(graph, k)) is not None]
|
||||
teile += [area for node in range(len(graph.nodes)) if graph.degree(node) >= 3
|
||||
and (area := junction_area(graph, node, kerb_only=True)) is not None and not area.is_empty]
|
||||
and (area := junction_area(graph, node, walk_only=True)) is not None and not area.is_empty]
|
||||
return unary_union(teile) if teile else None
|
||||
|
||||
|
||||
def _kerbless_zone(graph: Graph, extra: float):
|
||||
"""Der Korridor aller Klassen ohne Bordstein, aus den vollen Mittellinien, um `extra` über die
|
||||
halbe Fahrbahnbreite hinaus gepuffert.
|
||||
|
||||
Nur noch einmal gebraucht: Der Bordstein hört hier auf (_kerb_lines()) - eine Gasse hat laut
|
||||
SECTION weder Bordstein noch Gehweg, und die Fuge dafür ist 0,2 m über die eigene
|
||||
Fahrbahnbreite hinaus.
|
||||
|
||||
Bis Fixrunde 4 schnitt dieselbe Zone auch den Kreuzungsanteil der Gehwegquelle zu; seit
|
||||
Fixrunde 5 nimmt _walk_source() stattdessen von vornherein nur die Arme mit Bordstein
|
||||
(junction_area(kerb_only=True), Befund 7 der Fixwelle) und braucht deshalb keinen
|
||||
nachträglichen Abzug mehr.
|
||||
"""
|
||||
zonen = [LineString(edge.points).buffer(SECTION[edge.klass].carriageway / 2 + extra,
|
||||
cap_style="flat", join_style="mitre", mitre_limit=1.5)
|
||||
for edge in graph.edges
|
||||
if not SECTION[edge.klass].kerb and len(edge.points) >= 2]
|
||||
return unary_union(zonen) if zonen else None
|
||||
|
||||
|
||||
def _sidewalk(walk_source, carriage, corridor):
|
||||
"""Der Streifen zwischen Fahrbahnkante und Korridorrand.
|
||||
|
||||
@@ -114,10 +94,17 @@ def _sidewalk(walk_source, carriage, corridor):
|
||||
return to_multipolygon(result)
|
||||
|
||||
|
||||
def _kerb_lines(carriage, kerbless, bridges) -> list[LineString]:
|
||||
"""Die Fahrbahnkante, ohne die Stücke an Gassen und auf Brücken."""
|
||||
ohne = [] if kerbless is None else [kerbless]
|
||||
ohne += [b.buffer(0.2) for b in bridges]
|
||||
def _kerb_lines(carriage, bridges) -> list[LineString]:
|
||||
"""Die ganze Fahrbahnkante, nur ohne die Stücke auf Brücken.
|
||||
|
||||
Bis zur Nutzerentscheidung vom 18.09.2026 blieben auch die Gassen frei: Der Entwurf sah für sie
|
||||
weder Bordstein noch Gehweg noch Markierung vor (Hinterhofgassen in Miami Beach). Der Bordstein
|
||||
gehört jetzt an jede Straße - wo Asphalt an Land grenzt, endet er mit einer Kante. Gehweg und
|
||||
Markierung bleiben der Gasse weiterhin fern, das ändert die Entscheidung nicht.
|
||||
|
||||
Brücken bleiben ausgenommen: Dort steckt die Fahrbahn im Deck, eine Kante stünde in der Luft.
|
||||
"""
|
||||
ohne = [b.buffer(0.2) for b in bridges]
|
||||
rand = carriage.boundary
|
||||
if ohne:
|
||||
rand = rand.difference(unary_union(ohne))
|
||||
|
||||
Reference in new issue
Block a user