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

使用Geopy逆地理编码:CSV坐标转地址代码求助

代码问题排查与修正

原代码存在的关键问题

  • 未初始化地理编码实例:直接调用geolocator.geocode,但从未创建geolocator对象。Nominatim要求必须指定user_agent标识请求来源,否则会触发请求错误。
  • 错误批量处理整列数据:x和y是pandas Series(整列数据),直接拼接成字符串传入geocode会生成无效的坐标格式,地理编码服务无法解析。必须逐行处理单条坐标对。
  • 未定义file_exists变量:代码中用if not file_exists判断是否写入表头,但该变量从未声明,会触发NameError。
  • 语法错误:最后一行writer.writerow的字典缺少闭合的},导致代码无法通过语法检查。
  • 未处理解析失败场景:若坐标无法解析为地址,location会返回None,此时调用location.raw会触发AttributeError,导致程序崩溃。

修正后的代码

from geopy.geocoders import Nominatim
import pandas as pd
import time

# 初始化地理编码实例,自定义user_agent标识请求来源
geolocator = Nominatim(user_agent="geo_address_converter")

# 读取原始CSV数据
df = pd.read_csv('punkty_xy.csv')

# 定义坐标转地址的函数
def convert_to_address(row):
    try:
        # 传入单条坐标对进行解析
        location = geolocator.geocode(f"{row['ax']}, {row['ay']}", timeout=10)
        # 处理解析成功/失败的情况
        return location.address if location else "地址解析失败"
    except Exception as e:
        print(f"坐标({row['ax']}, {row['ay']})解析出错: {str(e)}")
        return "解析异常"
    # 延迟1秒,避免触发Nominatim的请求速率限制
    time.sleep(1)

# 批量生成地址列
df['Adresses'] = df.apply(convert_to_address, axis=1)

# 重命名列并导出到新CSV
output_df = df.rename(columns={'id': 'ID', 'ax': 'cordX', 'ay': 'cordY'})
output_df[['ID', 'cordX', 'cordY', 'Adresses']].to_csv('output.csv', index=False)

修正说明

  1. 初始化geolocator时指定user_agent,符合Nominatim的使用规范。
  2. 使用df.apply逐行处理坐标,确保每个请求都是有效的单条坐标对。
  3. 增加异常捕获和空结果判断,避免程序因解析失败崩溃。
  4. 添加time.sleep(1)控制请求频率,防止被地理编码服务临时封禁。
  5. 直接用pandas的to_csv方法导出结果,无需手动处理文件写入逻辑,更简洁可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:25:35