前言
兩年前寫過一篇使用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作爲開發語言來實現批量轉換地址爲經緯度座標,囉嗦結束,開始正文!
文章中涉及到的完整代碼已開源(碼雲)
申請騰訊地圖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在進行日常的業務處理過程中簡直不能好用更多了,輪子多,代碼簡潔. 上面的代碼沒有進行過多的註釋解釋,如有問題歡迎留言討論.