OSMnx小坐标差计算路径报Graph Contains No edges错误咨询
问题现象
当起止经纬度坐标整数位差值至少为1时,下述代码可正常生成对应路径与地图;但当坐标仅小数位存在差异(如跨城镇近距离寻路场景)时,程序抛出Graph Contains No edges错误。初步推测为尺度因素导致起点终点被识别为同一点,原始实现代码如下:
import osmnx as ox import networkx as nx import folium ox.settings.log_console=True ox.settings.use_cache=True # define the start and end locations in latlng start_lat = float(80.87399) start_long = float(-117.92435) end_lat = float(80.91732) end_long = float(-117.93312) # location where you want to find your route place = 'city, state, United States' # find shortest route based on the mode of travel mode = 'walk' # 'drive', 'bike', 'walk' # find shortest path based on distance or time optimizer = 'length' # 'length','time' # create graph from OSM within the boundaries of some geocodable place(s) graph = ox.graph_from_place(place, network_type = mode, simplify=True, retain_all=False ) orig_node = ox.nearest_nodes(graph, start_lat,start_long) dest_node = ox.nearest_nodes(graph, end_lat,end_long) shortest_route = nx.shortest_path(graph, orig_node, dest_node, weight=optimizer) route_map = ox.plot_route_folium(graph, shortest_route) route_map.save('route5.html')
问题根因
- 经纬度传参顺序错误:
ox.nearest_nodes接口的参数顺序为(G, X, Y),对应传入经度(东西向坐标)、纬度(南北向坐标),原始代码将纬度作为第一个坐标参数、经度作为第二个参数传入,坐标完全错位。当起止点经纬度差1度以上时,错位匹配的节点可能仍落在同一张连通路网内,程序偶然能正常运行;当坐标仅小数位有差异时,错位后的坐标会匹配到路网外的孤立点,或两个分属不连通子图的节点,直接触发无连通边的报错。 - 路网拉取范围不可靠:原始代码使用
graph_from_place搭配占位符格式的地名city, state, United States拉取路网,没有明确指定真实行政边界,拉取的路网范围很容易漏覆盖起终点间的连通路径,近距离寻路时边界裁剪很容易把连通边切掉。 - 路网连通性过滤影响:原始代码设置
retain_all=False时,会自动删除所有和最大连通子图不相连的孤立路段,若错位匹配的两个节点有一个落在孤立路段上,会直接被过滤,导致图中找不到两点间的连通边。
修复方案
- 修正
nearest_nodes的传参顺序,严格按照「先经度、后纬度」传入坐标。 - 替换模糊的地名拉取方式,改为以起终点的中心坐标为基准,拉取足够覆盖路径长度的圆形范围路网,避免边界裁剪导致的连通性问题,半径可根据实际寻路距离调整(跨镇场景设置3000-10000米即可)。
- 调试阶段可临时设置
retain_all=True确认节点连通性,确认路径计算正常后再开启过滤精简路网。
修复后可正常运行的代码如下:
import osmnx as ox import networkx as nx import folium ox.settings.log_console=True ox.settings.use_cache=True # 起止点经纬度 start_lat = 80.87399 start_long = -117.92435 end_lat = 80.91732 end_long = -117.93312 # 出行模式与路径优化规则 mode = 'walk' optimizer = 'length' # 以起终点中点为圆心,拉取5km半径范围的步行路网,可根据实际距离调整dist参数 center_lat = (start_lat + end_lat) / 2 center_lng = (start_long + end_long) / 2 graph = ox.graph_from_point( (center_lat, center_lng), dist=5000, network_type=mode, simplify=True, retain_all=False ) # 修正传参顺序:先传经度,再传纬度 orig_node = ox.nearest_nodes(graph, start_long, start_lat) dest_node = ox.nearest_nodes(graph, end_long, end_lat) # 计算最短路径 shortest_route = nx.shortest_path( graph, orig_node, dest_node, weight=optimizer ) # 生成并保存路径地图 route_map = ox.plot_route_folium(graph, shortest_route) route_map.save('route_fixed.html')
内容的提问来源于stack exchange,提问作者GioM
相关产品推荐
相关产品推荐

