我正在尝试通过 python 使用 openstreetmap 数据创建行人图。该图是使用 OSMnx 库创建的。每条边代表每条路,但行人实际上可以走在道路的右侧或左侧。我需要有左侧和右侧来获取交叉节点并将它们相互连接。 我尝试将左右两侧的边缘分开,但没有成功。
你们中有人有任何经验或知道如何做到这一点吗?或者如果有一个图书馆或立交桥查询可以简化这个过程怎么办?
当然可以,以下是如何使用 OSMnx 和 NetworkX 在 Python 中为行人创建“左转”和“右转”图形表示的分步指南。
1. 安装必要的库:
pip install osmnx networkx geopandas
2. 导入库:
import osmnx as ox
import networkx as nx
3. 下载 OpenStreetMap 数据:
使用
osmnx
下载感兴趣区域的街道网络。使用
ox.graph_from_place
或
ox.graph_from_bbox
。请务必指定
network_type="walk"
以仅获取适合行人的道路。
# 通过地点名称下载
place_name = "埃菲尔铁塔,巴黎,法国"
graph = ox.graph_from_place(place_name, network_type='walk')
# 通过边界框下载(南、北、西、东)
# bounds = (48.855, 48.865, 2.285, 2.295)
# graph = ox.graph_from_bbox(*bounds, network_type='walk')
4. 创建左右图:
我们将创建原始图形的副本,并添加属性来区分左侧和右侧。
# 创建左右图的副本
graph_left = graph.copy()
graph_right = graph.copy()
# 为左右两侧添加属性
for u, v, data in graph.edges(data=True):
data['side'] = 'left' # 对于左图,所有边最初都在左侧
graph_left[u][v][0]['side'] = 'left'
data['side'] = 'right' # 对于右图,所有边最初都在右侧
graph_right[u][v][0]['side'] = 'right'
5. 确定路口节点:
路口是度数大于 2 的节点(意味着它们连接到 2 条以上的边)。
intersections = [node for node in graph.nodes() if graph.degree(node) > 2]
6. 连接交叉路口处的左右两侧:
对于每个交叉路口,我们会创建连接左右两侧边缘的新边缘。这代表了人行横道。
for intersection in intersections:
# 获取与该交叉路口相邻的所有边
edges = list(graph.edges(intersection, keys=True))
# 为每条边的组合创建连接边
for i in range(len(edges)):
for j in range(i + 1, len(edges)):
u1, v1, k1 = edges[i]
u2, v2, k2 = edges[j]
# 确保我们连接的是不同的边
if k1 != k2:
# 添加一条从左侧到右侧的边
graph_left.add_edge(v1 if u1 == intersection else u1,
v2 if u2 == intersection else u2,
key=(k1, k2),
side='crossing',
length=1) # 假设人行横道的长度为 1
# 添加一条从右侧到左侧的边
graph_right.add_edge(v2 if u2 == intersection else u2,
v1 if u1 == intersection else u1,
key=(k2, k1),
side='crossing',
length=1)
现在有了两个图形:
graph_left
和
graph_right
,它们分别表示人行道的左侧和右侧。
side
属性指示边是在道路的左侧、右侧还是人行横道(“交叉路口”)。
7. 使用左右图:
可以将这些图形用于各种行人路径分析任务,例如:
-
查找最短路径:
使用
networkx
的shortest_path
函数,并指定weight
参数(例如,weight='length'
)。 -
计算距离矩阵:
使用
networkx
中的all_pairs_shortest_path_length
等函数。 -
可视化:
使用
osmnx
的plot_graph
函数可视化图形,可以使用edge_color
等参数突出显示左右两侧。
其他注意事项:
- 此方法假设所有道路都有两侧可供步行。对于单行道或没有明确人行道的道路,可能需要调整逻辑。
- 人行横道的长度设置为 1。可以根据人行横道的实际宽度或其他因素来调整此值。
-
可以使用
osmnx
和networkx
中的其他属性和函数来增强图形并执行更高级的分析。
通过这种方法,可以更真实地表示人行道网络,并将此信息用于各种基于行人的应用程序。
标签:python,python-3.x,graph,openstreetmap,osmnx From: 78773504