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

Google Geocode API是否支持批量处理?五万条地址高效编码需求咨询

针对Google Geocoding API批量处理5万条地址的解决方案

Google Geocoding API本身不支持单次请求提交多个地址的批量调用,官方文档中也未提供这类接口。但针对5万条Pandas DataFrame记录的场景,可以通过以下优化方案提升处理效率:

1. 并发请求+严格速率控制

API限制每秒最多50次请求(客户端+服务端请求总和),可以用多线程/异步请求并行处理,但必须严格控制请求速率,避免触发限流或账号封禁。

示例代码(基于concurrent.futures和requests实现):

import pandas as pd
import requests
from concurrent.futures import ThreadPoolExecutor
import time

API_KEY = "your_api_key"
BASE_URL = "https://maps.googleapis.com/maps/api/geocode/json"

def geocode_address(address):
    params = {"address": address, "key": API_KEY}
    try:
        response = requests.get(BASE_URL, params=params)
        response.raise_for_status()
        result = response.json()
        if result["status"] == "OK":
            loc = result["results"][0]["geometry"]["location"]
            return {"address": address, "lat": loc["lat"], "lng": loc["lng"]}
        else:
            return {"address": address, "lat": None, "lng": None, "error": result["status"]}
    except Exception as e:
        return {"address": address, "lat": None, "lng": None, "error": str(e)}

# 读取地址数据并去重
df = pd.read_csv("your_address_data.csv")
unique_addresses = df["address"].drop_duplicates().tolist()

# 并发处理+速率控制(每秒50次请求,间隔20ms)
results = []
with ThreadPoolExecutor(max_workers=10) as executor:
    start_time = time.time()
    for idx, addr in enumerate(unique_addresses):
        # 速率校准
        elapsed = time.time() - start_time
        expected_delay = idx * 0.02
        if elapsed < expected_delay:
            time.sleep(expected_delay - elapsed)
        results.append(executor.submit(geocode_address, addr).result())

# 将结果合并回原DataFrame
result_df = pd.DataFrame(results)
final_df = df.merge(result_df, on="address", how="left")
final_df.to_csv("geocoded_results.csv", index=False)

2. 官方批量地理编码服务(大规模数据首选)

如果需要持续处理大量地址,推荐使用Google Cloud的Batch Geocoding服务——这是官方针对批量场景提供的异步处理方案,支持一次性提交数万条地址,后台完成处理后返回结果,稳定性远高于自行实现的并发逻辑,仅需按使用量付费。

3. 地址去重与本地缓存

先对DataFrame中的地址去重,重复地址仅请求一次,能大幅减少请求量(比如5万条记录若有20%重复,可少发1万次请求)。处理完成后,通过merge将结果映射回原数据集即可。

4. 错误重试与指数退避

请求过程中可能遇到临时错误(如OVER_QUERY_LIMIT、SERVER_ERROR),建议添加指数退避重试机制,可借助tenacity库简化实现:

from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def geocode_address(address):
    # 原地理编码函数内容
    pass

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:01:26