前言
两年前写过一篇使用R+百度地图批量获取经纬度坐标的文章https://blog.csdn.net/lpwmm/article/details/79202592,后来挺多人反馈按照文档操作后无法获拿到坐标数据,貌似是百度地图API的AK码中间经历过升级,而且github上badbye作者写的那个baidumap库也好久没有更新过了,于是决定换用腾讯地图的开放平台再做一篇攻略,相比较之下,腾讯地图对个人开发者提供的免费调用次数更优惠哈:每天可以调用1w次,并发量上限是5次/秒,日常使用已经够用了的,如果需要更多调用需求,可以关联企业信息,具体对比:https://lbs.qq.com/webservice_v1/guide-quota.html, 由于这两年一直在用Python,R已经忘得差不多了…囧…所以下面将只使用Python作为开发语言来实现批量转换地址为经纬度坐标,啰嗦结束,开始正文!
2020.6.25更新视频教程
https://www.bilibili.com/video/bv1jg4y1v7wN
文章中涉及到的完整代码已开源(码云)
申请腾讯地图key
打开腾讯位置服务:
https://lbs.qq.com/dev/
使用微信或QQ登录后进入控制台,首次使用需要绑定手机号和邮箱,按照提示完善信息即可,这里不再赘述.
点击左侧菜单中的key与配额
-key管理
-创建新密钥
给这个key起个名字
创建成功后复制保存一下这个key并进入key设置
这里需要勾选WebServiceAPI
,并设置授权IP
这个授权IP需要填写当前电脑在互联网上的IP地址,如果不清楚的话,可以通过访问http://ifconfig.io/查看到
至此,腾讯地图key即设置完毕,下面开始使用Python来实现批量获取
使用Python获取单个位置的经纬度
下面的开发环境介绍:
- Python 3.7.6(建议3.6以上版本就都行)
- PyCharm(年前咬了咬牙买了一年订阅的专业版,真香! 普通开发用社区版的PyCharm或者VSCode也够)
先附上官方的WebService API文档:
https://lbs.qq.com/webservice_v1/index.html
API使用的方式其实就是发送带有参数的GET请求,根据文档中地址解析(地址转坐标)
的介绍(https://lbs.qq.com/webservice_v1/guide-geocoder.html),我们只需要在发送的GET请求中加上address
和key
参数,然后解析返回的json数据结果就行了.用Python中的requests
库就可以很方便的实现这样的需求,先来个简单的单个位置试试:
"""
@Description : 单独调用演示
@File : demo.py
@Project : txmap
@Time : 2020/4/4 17:37
@Author : Dexter
@Software : PyCharm
"""
import os
from pprint import pprint
import requests as req
from dotenv import load_dotenv
load_dotenv()
KEY = os.getenv('KEY')
ret = req.get(
url='https://apis.map.qq.com/ws/geocoder/v1/',
params={
'region': '安阳市',
'address': '中国文字博物馆',
'key': KEY
}
).json()
pprint(ret)
运行结果:
H:\gitee\txmap\venv\Scripts\python.exe H:/gitee/txmap/demo.py
{'message': 'query ok',
'result': {'ad_info': {'adcode': '410502'},
'address_components': {'city': '安阳市',
'district': '文峰区',
'province': '河南省',
'street': '',
'street_number': ''},
'deviation': 1000,
'level': 11,
'location': {'lat': 36.112438, 'lng': 114.393631},
'reliability': 7,
'similarity': 0.8,
'title': '中国文字博物馆'},
'status': 0}
Process finished with exit code 0
可以看到,返回的结果还是很详细的,单个位置解析经纬度实验成功了,下面撸个批量版的
批量转换实现
实现目标
读取位置数据xlsx文件,然后将经纬度坐标追加到xlsx后面的经纬度列中,xlsx文件长这个样:
实现代码
"""
@Description : 批量获取xlsx中的位置经纬度
@File : main.py
@Project : txmap
@Time : 2020/4/4 17:55
@Author : Dexter
@Software : PyCharm
"""
import os
import openpyxl
import requests as req
from dotenv import load_dotenv
load_dotenv()
KEY = os.getenv('KEY')
XLSX_PATH = os.path.join(os.getcwd(), '位置.xlsx')
CITY = '安阳市'
def get_cor(address):
"""
获取单个地址对应坐标
:param address: 地址名称
:return: 字典类型的经纬度坐标,格式:{'lat': 36.112438, 'lng': 114.393631}
"""
ret = req.get(
url='https://apis.map.qq.com/ws/geocoder/v1/',
params={
'region': CITY,
'address': address,
'key': KEY
}
).json()
if ret.get('status') == 0:
return ret.get('result').get('location')
else:
return None
if __name__ == '__main__':
wb = openpyxl.load_workbook(XLSX_PATH)
ws = wb['Sheet1']
for cell in ws['A']:
# 第一行是列标题,需要排除掉
if cell.row > 1:
addr = cell.value
cor = get_cor(addr)
if cor:
# 经度
ws[f'B{cell.row}'] = cor.get('lng')
# 维度
ws[f'C{cell.row}'] = cor.get('lat')
wb.save(XLSX_PATH)
处理完成后的xlsx文件:
结束语
不得不再夸一夸Python在进行日常的业务处理过程中简直不能好用更多了,轮子多,代码简洁. 上面的代码没有进行过多的注释解释,如有问题欢迎留言讨论.