使用騰訊地圖批量轉換地址爲經緯度座標

前言

兩年前寫過一篇使用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作爲開發語言來實現批量轉換地址爲經緯度座標,囉嗦結束,開始正文!

文章中涉及到的完整代碼已開源(碼雲)

https://gitee.com/lpwm/txmap

申請騰訊地圖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請求中加上addresskey參數,然後解析返回的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在進行日常的業務處理過程中簡直不能好用更多了,輪子多,代碼簡潔. 上面的代碼沒有進行過多的註釋解釋,如有問題歡迎留言討論.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章