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

如何处理geopy.exc.GeocoderTimedOut: Service timed out超时错误

解决Nominatim地理编码超时问题

针对你遇到的geopy.exc.GeocoderTimedOut错误,结合Nominatim API的特性和网络不稳定的情况,可以通过以下几种方式处理:

  • 添加重试机制
    超时往往是临时网络波动或API服务负载过高导致的,捕获超时异常后自动重试几次能有效解决间歇性问题。可以设置重试次数(比如3次),每次重试前短暂等待,避免频繁请求触发限制。

  • 严格遵守Nominatim的请求规则
    Nominatim官方要求请求间隔至少1秒,频繁请求会被临时限制,这也是导致超时的常见原因。每次请求后添加延迟,同时设置更长的超时时间(比如10秒),给API足够的响应时间。

  • 优化User-Agent标识
    虽然你已经设置了user_agent,但建议使用更具辨识度的标识(比如包含你的邮箱),这样Nominatim服务器会更友好地处理你的请求,减少被限制的概率。

  • 缓存地理编码结果
    如果需要多次处理相同地址,把已获取的经纬度缓存到本地(比如字典或文件),避免重复请求API,既节省资源又避免超时。

下面是修改后的代码示例,整合了重试、延迟、超时设置和异常处理:

from geopy.geocoders import Nominatim as NT
import folium
import time
from geopy.exc import GeocoderTimedOut

# 初始化地理编码器,设置合理的User-Agent和超时时间
geo_locator = NT(user_agent="your-email@example.com", timeout=10)
place_1 = "Yemen"
location_1 = None
max_retries = 3
retry_delay = 2  # 重试间隔秒数

# 带重试的地理编码请求
for attempt in range(max_retries):
    try:
        location_1 = geo_locator.geocode(place_1)
        time.sleep(1)  # 遵守Nominatim请求间隔要求
        break
    except GeocoderTimedOut:
        if attempt < max_retries - 1:
            time.sleep(retry_delay)
            continue
        else:
            print(f"经过{max_retries}次重试后仍然超时,请检查网络或稍后再试")

# 成功获取位置后生成地图
if location_1:
    user_map1 = folium.Map(location=[location_1.latitude, location_1.longitude], zoom_start=6)  # 也门范围大,zoom_start设为6更合适
    user_map1.save("map.html")
    print("地图已成功生成")
else:
    print("无法获取位置信息,无法生成地图")

另外,注意像也门这类范围较大的地区,zoom_start=15会导致地图显示空白,建议调整为6左右,这样能完整显示区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:42:12