批量地址转经纬度,手动一个个转太慢了?Python代码一键搞定
电商有几千个仓库地址要标注地图?物流平台要处理百万级客户地址?
手动一个个转?不存在的不存在的。分享一套完整的Python批量处理方案,10分钟处理上万条地址,含完整代码和免费额度说明。
一、你是不是也遇到过这些问题?
场景1:电商仓储管理
"我们有2000多个仓库地址,老板要求全部标到地图上。手动一个个查坐标,要输到什么时候?"
场景2:物流企业地址入库
"客户的收货地址五花八门,有的写'南山区XX小区',有的写'粤海街道XX号',怎么批量转成坐标入库?"
场景3:门店数据分析
"全国500家门店要做热力图,需要把门店地址转成经纬度,人工一个个查太费劲了"
如果你也有以上困扰,今天的方案可能适合你。
二、批量地址转经纬度的方法对比
|
方式 |
效率 |
成本 |
精度 |
适合场景 |
|---|---|---|---|---|
|
手动查 |
极低 |
0 |
看耐心 |
几条 |
|
Excel公式 |
低 |
0 |
一般 |
几十条 |
|
API调用 |
高 |
低 |
高 |
大量地址 |
|
爬虫采集 |
中 |
高 |
风险大 |
不推荐 |
综合以上对比,可以得出结论:大批量处理用API调用是正解。这里推荐一个地图开放平台的方案
• 末端精度高:整合4亿条标准地址,覆盖80%以上末端场景
• 并发能力强:标准QPS 20次/秒,通过多线程并发即可实现批量处理(20并发≈1200条/分钟),中小企业批量场景够用
• 灵活购买:单接口购买,不用打包
• 新用户免费:首月1000次免费额度
三、Python批量调用实战
import requests
import csv
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
class BatchGeocoder:
"""丰图批量地址转经纬度工具"""
BASE_URL = "https://gis-apis.sf-express.com/all/api/geocode/geo"
def __init__(self, api_key: str):
self.api_key = api_key
self.headers = {"ak": api_key}
def geocode(self, address: str, city: str = None) -> dict:
"""单地址转经纬度"""
params = {"address": address, "cc": 1} # cc=1 高德坐标系
if city:
params["city"] = city
try:
resp = requests.get(self.BASE_URL, params=params,
headers=self.headers, timeout=10)
data = resp.json()
if data.get("status") == 0 and "result" in data:
result = data["result"]
return {
"lng": result["xcoord"],
"lat": result["ycoord"],
"confidence": result.get("confidence", 0),
"standardization": result.get("standardization", "")
}
except Exception as e:
print(f"解析失败: {address} - {e}")
return {"lng": None, "lat": None, "confidence": 0, "standardization": ""}
def batch_process(self, addresses: list, city: str = None,
max_workers: int = 10) -> list:
"""批量处理地址列表"""
results = []
total = len(addresses)
print(f"开始处理 {total} 条地址...")
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = {
executor.submit(self.geocode, addr, city): addr
for addr in addresses
}
done = 0
for future in as_completed(futures):
addr = futures[future]
result = future.result()
result["address"] = addr
results.append(result)
done += 1
if done % 100 == 0:
print(f"进度: {done}/{total} ({done/total*100:.1f}%)")
return results
# 使用示例
if __name__ == "__main__":
# ⚠️ 替换为你的API Key
API_KEY = "你的丰图API Key"
# 准备地址数据
addresses = [
"深圳市南山区科技园A3栋",
"广州市天河区太古汇",
"北京市朝阳区国贸",
"上海市浦东新区陆家嘴",
"杭州市西湖区龙井路",
# 更多地址...
]
# 批量处理
batch = BatchGeocoder(API_KEY)
results = batch.batch_process(addresses, max_workers=10)
# 保存结果
with open("results.csv", "w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["address", "lng", "lat", "confidence"])
writer.writeheader()
writer.writerows(results)
print(f"完成!已处理 {len(results)} 条地址")
输出结果示例
|
address |
lng |
lat |
confidence |
|---|---|---|---|
|
深圳市南山区科技园A3栋 |
113.942097 |
22.523484 |
94 |
|
广州市天河区太古汇 |
113.326215 |
23.137394 |
91 |
|
北京市朝阳区国贸 |
116.456789 |
39.908012 |
96 |
四、进阶功能
支持不同坐标系
// python
# 高德坐标系 (cc=1)
result = geocoder.geocode("地址", coord_type=1)
# 百度坐标系 (cc=2)
result = geocoder.geocode("地址", coord_type=2)
支持指定城市
// python
# 明确城市可提高精度
result = geocoder.geocode("科技园A3栋", city="深圳市")
错误重试机制
// python
def geocode_with_retry(self, address, max_retries=3):
for i in range(max_retries):
result = self.geocode(address)
if result["lng"]:
return result
time.sleep(1) # 等待后重试
return {"lng": None, "lat": None}
五、免费额度说明
|
平台 |
免费额度 |
超出费用 |
|---|---|---|
|
高德 |
5000次/日 |
~0.015元/次 |
|
百度 |
5万次/日 |
~0.02元/次 |
|
腾讯 |
1万次/日 |
配额制 |
|
丰图 |
首月1000次 |
单接口定价 |
以上数据基于2026年各平台公开信息,建议以官方最新定价为准。
其实推荐丰图的服务,是试用下来,发现有几个特点,对于业务本身属于物流场景的确实蛮适配:
• 不用购买整套SDK,按需购买单个接口
• 标准QPS 20次/秒,并发即可批量处理
• 新用户首月免费1000次
• 物流末端地址精度高
六、常见问题
Q: 批量处理有什么限制?
A: 主要看API的QPS限制,建议并发数控制在10以内。
Q: 地址写得不规范能解析吗?
A: 丰图的地理编码支持模糊匹配,但完整地址精度更高。
Q: 如何处理解析失败的地址?
A: 可以对失败地址记录日志,人工补充或使用更完整的地址文本重试。
Q: 处理后的数据怎么用?
A: 可以直接导入地图可视化工具做标注,或者用于物流路径规划。
更多推荐

所有评论(0)