You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Nominatim地理编码时北京名称请求超时问题排查

为何用Nominatim查询'Beijing'超时,'Peking'却能成功返回坐标?

我在编写获取城市坐标并计算距离的代码时,遇到了一个奇怪的问题:使用Beijing作为查询词时请求超时,但用旧称Peking却能正常返回北京的坐标。

我的代码

def get_coordinates(city):
    geolocator = Nominatim(user_agent="distance_visualizer")
    location = geolocator.geocode(city)
    return location.latitude, location.longitude

查询Beijing时的错误日志

WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Read timed out. (read timeout=1)")': /search?q=Beijing&format=json&limit=1
WARNING:urllib3.connectionpool:Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Read timed out. (read timeout=1)")': /search?q=Beijing&format=json&limit=1

查询Peking时的成功返回结果

(39.9057136, 116.3912972)

问题原因分析

  1. 请求负载差异:Beijing是当前通用的标准名称,搜索请求量远高于旧称Peking。Nominatim服务器处理高请求量关键词时,容易出现队列拥堵,导致你的请求超出默认1秒的超时时间;而Peking查询量小,服务器能更快响应。
  2. 缓存机制影响:Nominatim会对查询结果做缓存,不常用的Peking结果可能已存在缓存中,无需实时计算地理编码,因此返回速度更快,不会触发超时。
  3. 默认超时过短:geocode方法默认的timeout参数是1秒,这个时间在服务器负载较高时很容易不够用。

解决办法

  • 增加超时时间:调用geocode时显式设置更长的超时,比如:
    location = geolocator.geocode(city, timeout=10)
    
  • 添加重试逻辑:针对超时异常手动实现重试,但要注意遵守Nominatim的使用规则(避免短时间内频繁请求,防止被限流)。
  • 统一查询词并优化配置:尽量使用标准城市名称,同时配合合理的超时设置和请求间隔,确保请求稳定。

内容的提问来源于stack exchange,提问作者noobie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:51:16