You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:21:30