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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:00