使用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)
问题原因分析
- 请求负载差异:
Beijing是当前通用的标准名称,搜索请求量远高于旧称Peking。Nominatim服务器处理高请求量关键词时,容易出现队列拥堵,导致你的请求超出默认1秒的超时时间;而Peking查询量小,服务器能更快响应。 - 缓存机制影响:Nominatim会对查询结果做缓存,不常用的
Peking结果可能已存在缓存中,无需实时计算地理编码,因此返回速度更快,不会触发超时。 - 默认超时过短:
geocode方法默认的timeout参数是1秒,这个时间在服务器负载较高时很容易不够用。
解决办法
- 增加超时时间:调用
geocode时显式设置更长的超时,比如:location = geolocator.geocode(city, timeout=10) - 添加重试逻辑:针对超时异常手动实现重试,但要注意遵守Nominatim的使用规则(避免短时间内频繁请求,防止被限流)。
- 统一查询词并优化配置:尽量使用标准城市名称,同时配合合理的超时设置和请求间隔,确保请求稳定。
内容的提问来源于stack exchange,提问作者noobie
相关产品推荐
相关产品推荐

