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

如何在Google Colab/Jupyter Notebook中将地址批量转换为经纬度?

Pandas批量地址转经纬度实现方案

原代码失效原因

  • 接口传参错误:Nominatim.geocode() 仅支持传入单个字符串地址,无法直接接收Pandas Series类型的整列地址做批量解析
  • 赋值语法错误:使用df2.loc['lat']是操作行索引为lat的行数据,并非新增列,新增列需使用df2['lat']或df2.loc[:, 'lat']语法
  • 逻辑顺序错误:无论坐标是否获取成功,最后都会将lat、long字段强制赋值为空字符串,已获取的结果会被直接覆盖
  • 缺少容错与限流机制:地址匹配失败时直接读取.latitude属性会触发空指针报错,且高频调用公开Nominatim服务会被限流拦截

可直接运行的批量处理代码

若环境未安装geopy,可先执行安装命令:!pip install geopy(Colab环境自带pandas,无需额外安装)

# 导入依赖
import pandas as pd
import time
from geopy.geocoders import Nominatim

# 初始化地理编码器,timeout设置超时时间避免长时间卡顿
geolocator = Nominatim(user_agent="batch_geocode_tool", timeout=15)

def geocode_single_address(address):
    # 过滤空地址
    if not isinstance(address, str) or address.strip() == "":
        return (None, None)
    try:
        loc = geolocator.geocode(address)
        # 遵守Nominatim免费服务调用规则,请求间隔1秒
        time.sleep(1)
        return (loc.latitude, loc.longitude) if loc else (None, None)
    except Exception as err:
        print(f"地址解析失败:{address},错误:{str(err)}")
        return (None, None)

# 逐行解析地址,结果拆分存入lat、long两列
df2[["lat", "long"]] = df2["address"].apply(lambda x: pd.Series(geocode_single_address(x)))

# 输出前5行验证结果
df2.head()

使用说明

  • 代码中time.sleep(1)是为了符合Nominatim免费服务的调用频率限制(普通用户最高1次/秒),如果数据量较大可以适当延长间隔时间,避免IP被临时封禁
  • 如果地址匹配准确率较低,可以在传入geocode前给地址统一拼接所属城市、行政区后缀,减少重名地址导致的匹配错误
  • 数据量超过1万条时不建议使用免费Nominatim服务,可替换为商用地图API提升解析速度和准确率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:27:14