如何将简化合并后的OSMnx图中恢复的路径还原至原始OSMnx图?
如何将简化合并后的OSMnx图中恢复的路径还原至原始OSMnx图?
嘿,刚好你提到在简化图的时候用了track_merged=True,这步操作其实已经帮我们把还原路径需要的关键信息存下来啦!我来一步步给你讲清楚怎么把简化图里的路径转回到原始图:
首先得明白核心原理:当你调用ox.simplify_graph(road_graph_ox, track_merged=True)时,OSMnx会给每一条简化后的边添加一个merged_nodes属性——这个属性里就存着这条简化边对应的原始图里的完整节点序列,这就是我们还原路径的关键依据。
假设你已经在简化后的图里找到了一条路径(比如用最短路径算法得到的),现在要把它还原成原始图的路径,可以这么做:
步骤1:先拿到简化图里的路径
比如用最短路径函数获取简化路径:
# 假设简化后的图是road_graph_ox_simplified,起点s_start、终点s_end simplified_path = ox.shortest_path(road_graph_ox_simplified, s_start, s_end)
步骤2:写个小函数来还原路径
我给你写个实用的函数,专门处理路径还原:
def restore_original_path(simplified_path, simplified_graph): original_path = [] # 遍历简化路径里的每一对相邻节点 for i in range(len(simplified_path)-1): u = simplified_path[i] v = simplified_path[i+1] # 获取u到v之间的边数据(如果有多条平行边,这里取第一条,你也可以按需选择) edges = simplified_graph.get_edge_data(u, v) edge_data = next(iter(edges.values())) # 取出这条边对应的原始节点序列,默认如果没合并就是[u, v] merged_nodes = edge_data.get('merged_nodes', [u, v]) # 拼接原始路径,避免重复节点 if not original_path: original_path.extend(merged_nodes) else: # 跳过重复的第一个节点(因为前一段的最后一个节点就是u) original_path.extend(merged_nodes[1:]) return original_path
步骤3:调用函数得到原始路径
直接把简化路径和简化图传进去就行:
original_path = restore_original_path(simplified_path, road_graph_ox_simplified)
几个要注意的小细节:
- 一定要确保你简化图时用了
track_merged=True,不然merged_nodes属性不会存在,就没法还原啦! - 如果简化后的两个节点之间有多条边(比如双向道路或者平行的不同道路),你可能需要根据边的长度、属性等选择对应的那条,确保还原的路径是正确的。
- 还原后的路径可以直接在原始图里使用,比如计算路径长度、可视化展示都没问题。
备注:内容来源于stack exchange,提问作者user13319433
相关产品推荐
相关产品推荐

