在 OSmnx 中将图形投影到 espg:4326 的最快方法

Fastest way to project a graph onto espg:4326 in OSmnx

我使用 OSmnx 的 osmnx.graph_project 首先将我的图形投影到 UTM 坐标系上,以便使用 consolidate_intersections 函数,然后 ox.project_graph(G_proj_ConsolidateIntersection, to_crs='epsg:4326') 将它投影到纬度-经度坐标系上为了利用ox.get_nearest_nodes。最后一个投影需要很长时间(5 分钟),而第一个投影在几秒钟内完成。有没有更好更快的投影到 epsg:4326 的方法?我有 但当我执行此行 gdf = gpd.GeoDataFrame(geometry=intersections) 时,出现以下错误:

ValueError: Unknown column

这是一个极端的例子(我正在处理的图表较小,但我希望它能说明我的观点):

import osmnx as ox
G = ox.graph_from_place('Edmonton, Canada', network_type='drive', simplify=False)
# 39.1 s

G_proj = ox.project_graph(G)
# 15.9 s

G_proj_ConsolidateIntersection = ox.consolidate_intersections(G_proj)
# 14 min 45 s

G_proj_ConsolidateIntersection_LatLon = ox.project_graph(G_proj_ConsolidateIntersection, to_crs='epsg:4326')
# 44 min 35 s

同时 gpd.GeoDataFrame(geometry=G_proj_ConsolidateIntersection) 引发 Unknown column 错误。

两件事。首先,确保您使用的是最新版本的 OSMnx,因为在之前的版本中有显着的性能增强。其次,如果您先简化图形,这一切都会快得多。

但更重要的是,除非您已经简化了图形,否则合并交叉点并没有真正意义,因为现实世界的概念"intersections"是在未简化(扩展)图中毫无意义。只有当图形被简化时,模型的节点才会映射到真实世界的交叉点和死胡同概念。有关详细信息,请参阅文档和相关文献。

这是一个代码片段,比较了您的原始时间(左)与我的简化时间(右):

import osmnx as ox
ox.config(use_cache=True, log_console=True)

G = ox.graph_from_place('Edmonton, Canada', network_type='drive', simplify=True)
# 39.1 s vs 18.2 s

G_proj = ox.project_graph(G)
# 15.9 s vs 8.9 s

G_proj_con = ox.consolidate_intersections(G_proj)
# 14 m 45 s vs 24.2 s

G_con = ox.project_graph(G_proj_con, to_crs='epsg:4326')
# 44 m 35 s vs 6.4 s

编辑:我只是重新 运行 我上面分享的代码片段但更改了 simplify=False,我使用最新版本的时间仍然比你看到的要快得多。例如,上面最后两行代码分别以 6 米 20 秒和 12 秒完成(与您的 14 米 45 秒和 44 米 35 秒时间相比)。