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

批量调用Google Geocode API获取经纬度时重复返回结果的问题排查

问题根源分析

你的问题既不是pandas apply的锅,也不是API本身的问题——核心错误是你只调用了一次Geocode API,而且你的get_long_lat函数根本没用到传入的地址参数,全程在复用最开始那一次的API响应结果,所以不管处理哪个地址,返回的都是第一次请求得到的经纬度。

来拆解一下代码里的具体问题:

  • 你在代码开头就执行了api_response = requests.get(...),这里把整个address1 DataFrame(而不是单个地址)传给了API的address参数,API实际是在解析整个DataFrame的字符串形式,碰巧返回了第一个地址的匹配结果;
  • 你的get_long_lat函数完全忽略了传入的address参数,直接使用全局的api_response_dict——这意味着不管你传什么地址,它都会返回第一次API调用的固定结果。
修正后的代码

我们需要把API调用逻辑放到get_long_lat函数内部,让每个地址都单独发起请求,同时加上异常处理(避免某个地址解析失败导致整个流程崩溃):

import requests
import pandas as pd

# 地址列表转DataFrame
address_list = ['100 20th St. Seattle WA','300 Main St. Washington DC','100 Main St Richmond VA 23220']
df = pd.DataFrame(address_list, columns=['Address'])

# 你的API密钥
api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXX"

def get_long_lat(address):
    # 对每个单独的地址发起API请求
    url = f'https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={api_key}'
    api_response = requests.get(url)
    api_response_dict = api_response.json()
    
    # 处理API响应
    if api_response_dict['status'] == 'OK':
        latitude = api_response_dict['results'][0]['geometry']['location']['lat']
        longitude = api_response_dict['results'][0]['geometry']['location']['lng']
        return (latitude, longitude)
    else:
        # 地址解析失败时返回None或自定义标记
        print(f"无法解析地址: {address},状态码: {api_response_dict['status']}")
        return (None, None)

# 使用apply处理每个地址
df['Coordinates'] = df['Address'].apply(get_long_lat)
# 拆分出单独的纬度和经度列
df[['Latitude', 'Longitude']] = pd.DataFrame(df['Coordinates'].tolist(), index=df.index)

print(df)
额外注意事项
  • API配额与费用:Google Geocode API按请求次数收费,批量处理地址前请确认你的配额和预算,避免意外扣费;
  • 请求速率限制:不要短时间内发起大量请求,遵守Google的API调用速率限制,必要时可以加入time.sleep()控制请求间隔;
  • 地址格式化:尽量保证地址格式规范,能有效提高API解析的准确率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:26:31