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

