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



我使用 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,因为在以前的版本中有显著的性能增强。其次,如果你先简化你的图形,这一切都会快得多。

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

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

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,并且使用最新版本的时间仍然比您看到的要快得多。例如,上面的最后 2 行代码分别以 6 分 20 秒和 12 秒完成(与 14 分 45 秒和 44 分 35 秒的时间相比(。

相关内容

最新更新