feat(extract): Kreuzungsflächen mit amerikanischem Eckradius
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
8870484233
commit
5ddcbbfc17
2 files changed
+82
No files matched your search
@@ -71,3 +71,41 @@ def ribbon(graph: Graph, k: int):
|
||||
return None
|
||||
return line.buffer(SECTION[graph.edges[k].klass].carriageway / 2,
|
||||
cap_style="flat", join_style="mitre", mitre_limit=1.5)
|
||||
|
||||
|
||||
# Amerikanischer Eckradius, 20 ft. Er entscheidet über den Charakter der Kreuzung: größer wirkt
|
||||
# großzügig und vorstädtisch, kleiner eng und städtisch.
|
||||
FILLET = 6.0
|
||||
|
||||
|
||||
def junction_area(graph: Graph, node: int):
|
||||
"""Die Fläche einer Kreuzung: die Stummel aller Arme, mit gerundeten einspringenden Ecken.
|
||||
|
||||
Gerundet wird durch Schließen (aufblasen, dann wieder schrumpfen) - und ausdrücklich nur
|
||||
innerhalb einer Scheibe um den Knoten. Auf das ganze Netz angewandt verklebte dieselbe
|
||||
Operation zwei parallele Straßen, deren Fahrbahnen weniger als 2 * FILLET auseinanderliegen.
|
||||
"""
|
||||
incident = graph.incident(node)
|
||||
if not incident:
|
||||
return None
|
||||
reach = setback(graph, node)
|
||||
arms = []
|
||||
for k in incident:
|
||||
edge = graph.edges[k]
|
||||
points = edge.points if edge.a == node else list(reversed(edge.points))
|
||||
line = LineString(points)
|
||||
stub = substring(line, 0.0, min(reach + 1.0, line.length))
|
||||
arms.append(stub.buffer(SECTION[edge.klass].carriageway / 2,
|
||||
cap_style="flat", join_style="mitre", mitre_limit=1.5))
|
||||
star = unary_union(arms)
|
||||
near = Point(graph.nodes[node].point).buffer(reach + FILLET + 2.0)
|
||||
rounded = star.buffer(FILLET, join_style="round").buffer(-FILLET, join_style="round")
|
||||
return star.union(rounded.intersection(near))
|
||||
|
||||
|
||||
def carriageway_area(graph: Graph):
|
||||
"""Alle Bänder und alle Kreuzungsflächen als eine Geometrie."""
|
||||
parts = [band for k in range(len(graph.edges)) if (band := ribbon(graph, k)) is not None]
|
||||
parts += [area for node in range(len(graph.nodes)) if graph.degree(node) >= 3
|
||||
and (area := junction_area(graph, node)) is not None]
|
||||
return unary_union(parts)
|
||||
Reference in new issue
Block a user