OSMNX间歇性无法获取路网问题求助
OSMNX间歇性无法获取路网的故障分析与解决建议
问题背景
使用OSMNX已有两年,近期间歇性出现无法获取路网的错误,运行环境为Windows虚拟机,配置的Overpass端点为https://overpass-api.de/api/interpreter。
示例代码
import osmnx as ox from shapely.geometry import Polygon polygon_coords = [ (-74.0358, 40.7499), (-74.0358, 40.7351), (-74.0238, 40.7351), (-74.0238, 40.7499), (-74.0358, 40.7499) ] polygon = Polygon(polygon_coords) G= ox.graph_from_polygon(polygon, network_type='drive',simplify=False)
错误信息
ConnectionResetError: [WinError 10054] 远程主机强制关闭了现有连接 ProtocolError: ('Connection aborted.', ConnectionResetError(10054, '远程主机强制关闭了现有连接', None, 10054, None)) ConnectionError: ('Connection aborted.', ConnectionResetError(10054, '远程主机强制关闭了现有连接', None, 10054, None))
故障原因分析
- Overpass公共服务器限流/负载过高:
overpass-api.de是免费公共服务,高峰期服务器负载大时会主动断开部分连接,导致间歇性失败。 - 网络环境不稳定:Windows虚拟机的防火墙/安全软件可能间歇性拦截出站请求;组织网络的流量管控策略(如超时设置、带宽限制)也可能导致连接被强制中断;虚拟机本身的网络链路存在丢包、波动问题。
- 请求配置不合理:OSMNX默认的超时时间过短,或请求频率过高触发服务器的防御机制,引发连接重置。
解决建议
- 更换Overpass端点:尝试使用其他公共Overpass端点,通过
ox.config(overpass_endpoint="新端点URL")配置;若组织有条件,搭建私有Overpass实例可彻底避免公共服务的限流问题。 - 添加重试机制:在代码中实现自动重试逻辑,捕获连接错误后重试,示例如下:
import osmnx as ox from shapely.geometry import Polygon from tenacity import retry, stop_after_attempt, wait_exponential polygon_coords = [ (-74.0358, 40.7499), (-74.0358, 40.7351), (-74.0238, 40.7351), (-74.0238, 40.7499), (-74.0358, 40.7499) ] polygon = Polygon(polygon_coords) @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def fetch_road_network(): return ox.graph_from_polygon(polygon, network_type='drive', simplify=False) try: G = fetch_road_network() except Exception as e: print(f"3次重试后仍失败: {str(e)}")
- 调整请求参数:延长请求超时时间,执行
ox.config(timeout=60)将超时设置为60秒;批量请求时增加间隔时间,避免短时间内发送过多请求。 - 排查网络配置:检查Windows虚拟机的防火墙规则,确保允许访问Overpass端点;联系组织IT确认是否需要将Overpass服务器加入网络白名单;通过
ping overpass-api.de或curl命令持续测试虚拟机的网络连通性。 - 启用本地缓存:开启OSMNX的缓存功能,执行
ox.config(use_cache=True),重复请求相同区域时直接读取本地缓存,减少对服务器的依赖,同时提升请求效率。
内容的提问来源于stack exchange,提问作者nchantu
相关产品推荐
相关产品推荐

