使用腾讯地图批量转换地址为经纬度坐标

前言

两年前写过一篇使用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

文章中涉及到的完整代码已开源(码云)

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在进行日常的业务处理过程中简直不能好用更多了,轮子多,代码简洁. 上面的代码没有进行过多的注释解释,如有问题欢迎留言讨论.

  • 15
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DexterLien

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值