Geopy根据经纬度提取国家名称相关报错问题咨询
问题修复方案
报错原因梳理
'NoneType' object has no attribute 'raw':空值、(0,0)坐标查询不到对应地理位置,地理编码接口返回None,直接访问.raw属性触发报错KeyError: 'country':要么是经纬度顺序传反导致坐标非法,要么是查询到的位置(如公海、特殊属地)的返回结果中不存在country字段,直接按键取值触发报错
修复步骤
1. 前置数据清洗
先过滤无效数据,减少无效请求:
- 剔除纬度或经度为空的行,直接标记为未知
- 校验经纬度合法范围:纬度取值范围为[-90, 90],经度取值范围为[-180, 180],超出范围的标记为未知
- (0,0)坐标位于几内亚湾公海,无对应国家,直接标记为公海/未知
2. 优化查询函数的容错逻辑
修改后的函数增加多层判断,避免异常中断批量处理:
from geopy.geocoders import Nominatim import time # 自定义user_agent,避免使用默认值被接口封禁 geolocator = Nominatim(user_agent="custom_geo_query_app") def get_country(lat, lon): # 空值直接返回 if not lat or not lon: return "未知" # 经纬度范围校验 if not (-90 <= lat <= 90) or not (-180 <= lon <= 180): return "未知" # 0,0坐标特殊处理 if lat == 0 and lon == 0: return "公海/未知" try: # 注意参数顺序是(纬度, 经度),不要传反 location = geolocator.reverse((lat, lon), exactly_one=True) if not location: return "公海/未知" address = location.raw.get("address", {}) # 用get方法取值,避免KeyError,无对应字段返回未知 return address.get("country", "未知") except: # 捕获所有请求异常 return "查询失败/未知" finally: # 公开接口限速,每秒最多1次请求 time.sleep(1)
3. 批量处理优化建议
- 45000条数据用公开Nominatim接口查询大概需要12小时左右,如果对速度有要求,可替换为商用逆地理编码服务,查询效率提升百倍以上
- 可先对数据集的经纬度去重,重复坐标只查询一次,减少请求次数
内容的提问来源于stack exchange,提问作者Basel Hany
相关产品推荐
相关产品推荐

