如何处理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
相关产品推荐
相关产品推荐

