OSMNX使用graph_from_place下载墨西哥路网响应极慢的优化方案咨询
核心问题原因
你当前代码耗时极长的核心诱因是一次性拉取墨西哥全国级别的路网数据,且关闭了OSMNX默认的路网简化逻辑,同时在线请求OSM API容易受限流、网络波动、单次返回数据量过大的影响,导致任务卡住。
现有代码优化方案
- 把
graph_from_place的simplify=False参数改为默认的simplify=True,关闭简化会保留所有OSM原始冗余节点,会让路网数据量膨胀3-5倍,处理耗时翻数倍,无特殊需求的情况下开启简化可大幅降低计算耗时。 - 在
ox.config中添加timeout=1800参数,延长API请求超时阈值,避免拉取大区块数据时因默认超时时间过短反复重试,额外消耗时间。 - 给
graph_from_place添加which_result=1参数,避免地名匹配时因OSM返回多结果歧义导致的查询卡住。
优化后参考代码:
import osmnx as ox # 延长超时时间,开启缓存和日志 ox.config(use_cache=True, log_console=True, timeout=1800) # 开启简化,指定查询结果优先级 G = ox.graph_from_place('Mexico', network_type = 'drive', simplify=True, which_result=1) G = ox.add_edge_speeds(G) G = ox.add_edge_travel_times(G) ox.save_graphml(G, '/var/www/html/repmexico.graphml') print("Success!!!")
更高效的替代实现方案
- 拆分区域下载合并:将墨西哥按行政区划拆分为多个州级区域,分别调用
graph_from_place下载对应路网,再通过ox.compose_graphs接口合并为全国路网,单个小区域下载速度快,就算中途失败也无需从头重跑,稳定性远高于一次性拉取全国数据。 - 离线PBF文件构建:直接下载墨西哥区域的OSM PBF格式原始数据,本地调用
ox.graph_from_xml接口直接读取PBF文件构建路网,全程无需请求OSM在线API,不受网络、限流影响,构建速度仅取决于本地磁盘读写和CPU计算能力,比在线拉取效率高3倍以上。 - 按需过滤路网:构建路网时添加
custom_filter参数,过滤掉不需要的道路类型,进一步减少需要处理的数据量,例如仅保留高等级机动车道的话,可直接过滤掉低等级支路、内部道路等无关数据。
离线使用方法
只要你成功导出graphml格式的路网文件后,后续直接调用ox.load_graphml('/var/www/html/repmexico.graphml')即可加载路网,完全不需要再请求外部服务器,加载后的图可直接用于OSMNX、networkx的路由计算,和在线构建的路网完全一致。
内容的提问来源于stack exchange,提问作者Juan Martin Gonzalez Razo
相关产品推荐
相关产品推荐

