在进行地理数据分析或地图服务开发及搞地理科研学术时,地址与经纬度的互转是一个常见的需求。本文将介绍如何利用免费资源和工具,实现地址到经纬度的批量互相转换,零成本彻底解决这个问题!
目录
1、小量级转换开源工具
首先推荐这个开源的网站:Map location:https://maplocation.sjfkai.com/
作者集成了api,可以进行地址和经纬度的互相转换
优点
- 支持百度、谷歌、高德三家平台的服务。
- 可以选择不同的坐标系。
- 完全免费。
缺点
- 只能通过网页版使用。
- 每次处理的数据条数有限。
- 需要手动复制粘贴数据。
一般的处理已经足够使用!
2、较大量级的转换方法
如果要处理大量的数据,就要借助api来进行处理。
经过多方比对,建议使用腾讯位置服务:https://lbs.qq.com/dev/console/quota/account
首先访问腾讯位置服务控制台,进去之后修改账户额度,将可分配额度全都给你需要的功能上(注意不要超了),处理完后大概就是下图这个样子:
在图中可以看到前面对应的有接口地址,我们设置完得到key之后我写个调用代码,通过在本地运行脚本进行批量的转换,代码无毒可放心食用:
import pandas as pd
import requests as req
from urllib.parse import quote
from tqdm import tqdm
import time
# 腾讯地图API的Key
# KEY = '' #可以申请多个key交替使用
KEY = '5xxBZ-xxxxL-6SxxPF-EYxxV-QxxRH-AxxxC'
# CSV文件路径
CSV_PATH= r"C:\Users\xx2\Desktop\111.xlsx"
# 每日配额成功处理上限
SUCCESS_LIMIT = 10000
# 连续失败上限
FAILURE_LIMIT = 20
# 请求URL前缀
URL_PREFIX = 'https://apis.map.qq.com/ws/geocoder/v1/?address='
def get_cor(address, key):
"""
获取单个地址对应坐标
:param address: 地址名称
:param key: 腾讯地图API的Key
:return: 字典类型的经纬度坐标,格式:{'lat': 36.112438, 'lng': 114.393631}
"""
# 对地址进行URL编码
address_encoded = quote(address)
url = f'{URL_PREFIX}{address_encoded}&key={key}'
response = req.get(url)
data = response.json()
if data.get('status') == 0:
return data.get('result').get('location')
else:
return None
if __name__ == '__main__':
# 读取CSV文件
df = pd.read_excel(CSV_PATH,engine='openpyxl')
# 如果不存在,则添加新列用于存储经纬度
if 'longitude' not in df.columns:
df['longitude'] = None
if 'latitude' not in df.columns:
df['latitude'] = None
success_count = 0
failure_count = 0
# 遍历每一行,获取地址信息并调用API获取经纬度
for index, row in tqdm(df.iterrows(), total=df.shape[0], desc="Processing"):
if pd.isnull(row['longitude']) or pd.isnull(row['latitude']):
address = row['地点']
if pd.notnull(address):
full_address = '北京市' + address # 在地址前加上“北京市”
cor = get_cor(full_address, KEY)
if cor:
# 写入经纬度
df.at[index, 'longitude'] = cor.get('lng')
df.at[index, 'latitude'] = cor.get('lat')
success_count += 1
failure_count = 0 # 成功后重置失败计数
print(f"处理成功: {full_address} -> (lng: {cor.get('lng')}, lat: {cor.get('lat')})")
else:
df.at[index, 'longitude'] = 0
df.at[index, 'latitude'] = 0
failure_count += 1
print(f"处理失败: {full_address}")
else:
df.at[index, 'longitude'] = 0
df.at[index, 'latitude'] = 0
# 每处理完5条记录,暂停1秒
if success_count % 5 == 4:
time.sleep(1)
# 保存并中断条件
if success_count >= SUCCESS_LIMIT or failure_count >= FAILURE_LIMIT:
temp_save_path = CSV_PATH.replace('.csv', f'_temp_{index}.csv')
df.to_csv(temp_save_path, index=False)
print(f"由于达到限制,在记录 {index} 处保存到 {temp_save_path}")
break
# 保存最终更新后的CSV文件
df.to_excel(CSV_PATH, index=False)
print(f"最终保存到 {CSV_PATH}")
以上代码需要注意几点:
1、每次使用一个key
2、脚本是通过读取本地的csv或者excel文件来进行处理,读取其中的“地点”列来调用api进行处理,读取本地文件地址为csv_path,例子中用的是excel的文件类型,如果是csv的话在read函数那改改就行,小白的话建议直接让chatgpt或者kimi给你改。
3、改功能就改URL前缀。
4、此代码中处理的都为北京的数据,所以为了减少误差,在处理之前都加上了“北京市”前缀,如果你要处理全国的就把此前缀删了,处理确定的某地可以对其进行修改。
5、最终处理完是在文档中加上了对应的经纬度列,为了避免出错请先另存原文件。
最终可以完美实现将文件中每一条地点都批量转换成经纬度,经过测试,很快很好用(最麻烦的部分就是写代码了但是已经调试好了)!!!
如果你的需求还是比较大的话,可以多注册几个账号,得到多个key,交替使用,基本上几十万的数据一天就能全都转换完。
注意:腾讯位置服务转换出来的坐标系为GCJ02坐标系,需要其他坐标系的话可以借助坐标系转换工具进行转换,我也尝试了许多方法,最终选择以下工具。
3、坐标系转换
坐标系转换,推荐开源免费的工具,原创作者——地学大数据,需要安装包的直接搜也可以私聊。
结语
通过上述方法,您可以高效地实现地址到经纬度的批量转换,无论是小规模的数据处理还是大规模的数据转换需求,都有相应的解决方案。希望这篇文章能帮助到有需要的朋友。啊哒哒哒哒大!如果有想学习arcgis和arcgis pro的使用教程和地理分析方法的盆友们点点赞之后更新哦~