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

