从OSMnx图中移除的边在绘图或导出时仍显示,原因何在?
问题
使用OSMnx移除图中指定边后,G[u][v]触发KeyError确认边已删除,但绘图或导出GeoPackage时该边仍可见。已尝试以下操作:
- 移除前绘图高亮目标边,确认选中的是预期删除的边
- 将图转为GeoDataFrame删除对应行后转回图,问题依旧
相关代码:
import osmnx as ox import utm # 用于下载图的点 point = {'lat':48.1540155043, 'lon':11.5623458228} # 将点的经纬度转换为UTM米制坐标 point_utm = utm.from_latlon(point['lat'], point['lon']) # 下载以该点为起点的路网 G = ox.graph_from_point((point['lat'], point['lon']), dist = 1000, network_type = 'walk') # 将路网投影到UTM坐标系 G_projected = ox.project_graph(G) # 识别距离该点最近的边 nearest_edge = ox.nearest_edges(G_projected, point_utm[0], point_utm[1]) # 最近边的u和v值 u = nearest_edge[0] v = nearest_edge[1] # 根据u和v值移除最近边 G_projected.remove_edge(u, v)
解决方案
问题根源在于OSMnx的步行路网默认是无向结构,每条边会以u->v和v->u两个方向双向存储。你仅删除了其中一个方向的边,反向边仍存在,因此绘图或导出时该边会被继续渲染。
两种解决方式:
- 使用OSMnx内置的双向删除函数,一次性移除两个方向的边:
# 替换原有的remove_edge调用 ox.utils_graph.remove_edge_bidirectional(G_projected, u, v)
- 手动删除两个方向的边:
G_projected.remove_edge(u, v) G_projected.remove_edge(v, u)
验证方法:执行删除后,检查G_projected.has_edge(u, v)和G_projected.has_edge(v, u)均返回False,此时再绘图或导出,目标边就不会显示了。
内容的提问来源于stack exchange,提问作者Howdy Stargazer
相关产品推荐
相关产品推荐

