运用python与高德api接口获取地理信息数据-----以例昆明市为例

首先先来说说解决的问题吧:获任某市内所有县区的经纬度,以及各市区之间最佳的驾车距离

我们知道,通过高德地图我们可以解决我们出行规划的几乎所有问题。
直接在app中看不到这些信息,但说明高德地图内部肯定存在着这些数据,今天我们通过python结合高德地图提供的API接口来实现我们的需求!

Let’s Go!!!

首先我们进入高德开放平台的主页:https://lbs.amap.com/
在这里插入图片描述
点击注册:
在这里插入图片描述
注册完成后登录进去进入控制台,如下图(此处不做赘述,按要求点击即可)
在这里插入图片描述
然后先点左侧的引用管理,创建应用和秘钥
先创建应用,输入应用名即可
后点击添加新的key,创建一个适合于自己的密钥,点击提交即可获得自己专属的key

在这里插入图片描述
注:创建key时一定要正确选择服务平台,我以选择web服务为例
在这里插入图片描述
在个人中心→配额管理中,我们可以看到里面的每一项服务的每日免费配额目前数量如下图(如果想提额,就需要money了):

在这里插入图片描述

这块我们申请key的过程就演示到这,接下来我们看看如何使用:

先理一下思路:
首先我们目标是获取昆明市各区县之间最佳的行车距离和路线

第一步:我们需要获取数据:昆明市各区县的经纬度
第二步:通过经纬度的定位,利用高德地图提供的api以及其它功能获得到达其各区县的最佳驾驶距离和路线、
第三步:将数据保存到excle中

我们继续行动:
第一步:
通过开发者文档,查看每项服务的详细说明。我们选择web服务
在这里插入图片描述
进入到此页面:我们看一下使用说明:

产品介绍
路径规划API是一套以HTTP形式提供的步行、公交、驾车查询及行驶距离计算接口,返回JSON 或 XML格式的查询数据,用于实现路径规划功能的开发。

适用场景
无需展现地图的场景下,进行线路查询,如以线路结果页形式展现换乘方案;
根据返回线路数据,自行开发线路导航。

使用说明
第一步,申请”Web服务API”密钥(Key);
第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。
在这里插入图片描述
因为我们的需求,我们点击进入路径规划,我们看到高德地图为我们提供了非常强大的功能以满足我们的需求在这里插入图片描述
我们定位到驾车路径规划部分:
在这里插入图片描述
接下来我们根据需求拼接url:
我们请求链接如下:
http://restapi.amap.com/v3/place/text?keywords=区政府&city=昆明&output=json&key=<自己的key>
我们需要其中的adname,即区名
根据自己的需求进行添加替换即可在这里插入图片描述在这里插入图片描述由此,我们拿到了各区县的名称,接下来获取各县区政府的坐标位置
在这里插入图片描述
我们需要调用的库如下:

import urllib.request  # 发送请求
from urllib import parse  # URL编码
import json  # 解析json数据
from openpyxl import load_workbook  # 从Excel中读取镇街名称
from time import sleep
import openpyxl

我们通过调用openpyxl读取县区的名称:

nameList = []  # 创建一个列表用于接收数据
book = load_workbook('区域信息.xlsx')  # 打开文件
nameSheet = book["data"]  # 读取工作表
# 按行读取第一列,并存入列表:
for row in range(1, nameSheet.max_row + 1):
    nameList.append(str(nameSheet["A%d" % row].value))
    

然后接下来获取各区县的经纬度信息:

    for i in nameList:
        # 拼接请求
        url1 = 'http://restapi.amap.com/v3/place/text?keywords=' + i + '&city=昆明&output=json&offset=1&page=1&key=<自己的key>'
        # 将一些符号进行URL编码
        newUrl1 = parse.quote(url1, safe="/:=&?#+!$,;'@()*[]")
        # 发送请求
        response1 = urllib.request.urlopen(newUrl1)
        # 读取数据
        data1 = response1.read()
        # 解析json数据
        jsonData1 = json.loads(data1)
        # pois→0→location得到经纬度,写入字典
        dict[i] = jsonData1['pois'][0]['location']
        # 拆分字符串,逗号之前是经度,逗号之后是纬度
        locations = dict[i].split(",")

获得具体数据如下(因数据量较小,我列举出来供大家使用):

dict = {'五华区': '102.707262,25.043635', '盘龙区': '102.751643,25.116512', '官渡区': '102.748888,24.950285',
        '西山区': '102.664426,25.038039', '东川区': '103.187825,26.082997', '呈贡区': '102.822104,24.885738',
        '晋宁区': '102.595325,24.669077', '富民县': '102.497722,25.221924', '宜良县': '103.141674,24.919830',
        '石林彝族自治县': '103.290536,24.771761', '嵩明县': '103.043384,25.327273', '禄劝彝族苗族自治县': '102.471993,25.551768',
        '寻甸回族彝族自治县': '103.256559,25.558163', '安宁市': '102.478650,24.919831'}

下一步,就该获取距离数据了,这一部分用的是路径规划API

服务示例

https://restapi.amap.com/v3/direction/driving?origin=116.481028,39.989643&destination=116.465302,40.004717&extensions=all&output=xml&key=<用户的key>

我需要提交的请求:

key:秘钥

origin:起点的经纬度

destination:终点的经纬度

strategy:行驶策略,我选择距离最短,代码是2

output:返回数据类型,默认json

https://restapi.amap.com/v3/direction/driving?origin=起始点经纬度&destination=目的地经纬度&extensions=all&output=json&key=<用户的key>

以下是返回的全部信息,我们暂时只需要distance距离信息
在这里插入图片描述
构建完成后我们继续发送请求获取我们想要的信息
代码如下:

distanceList = []  # 创建一个列表用于接收数据
k = len(nameList)  # nameList列表中元素个数
# 遍历nameList列表
for m in range(k):
    subList = []  # 创建一个子列表用于接收每一条数据,主要是为了后面方便创建数组
    for n in range(k):
        # 从nameList中得到镇街的名称,作为键,获得dict中的经纬度
        origin = dict[nameList[m]]
        destination = dict[nameList[n]]
        # 拼接请求
        url2 = 'https://restapi.amap.com/v3/direction/driving?origin=' + origin + '&destination=' + destination + '&extensions=all&strategy=5&output=json&key=ea3c56f36bbb3494da33839917a5ddbf'
        print(url2)
        # 编码
        newUrl2 = parse.quote(url2, safe="/:=&?#+!$,;'@()*[]")
        # 发送请求
        response2 = urllib.request.urlopen(newUrl2)
        # 接收数据strategy
        data2 = response2.read()
        # 解析json文件
        jsonData2 = json.loads(data2)
        # 从json文件中提取距离
        distance = jsonData2['route']['paths'][0]['distance']
        # 将距离写入子列表
        distanceList.append(int(distance))
        # 看一下得到的数据,这一行有没有无所谓
        print(nameList[m], nameList[n], distance)
    sleep(0.2)

print(distanceList)

我们将获取的数据存入表格(我首先把所有区县名称录入表格,然后直接把字典中的数据全部按顺序填入表格)

# 先打开我们的目标表格,再打开我们的目标表单
wb = openpyxl.load_workbook(r'C:\Users\asus\PycharmProjects\pythonProject\GaodeAPI\各区之间详细距离.xlsx')
ws = wb['Sheet1']
# 取出distance_list列表中的每一个元素,openpyxl的行列号是从1开始取得,所以我这里i从1开始取
for i in range(1, len(distanceList) + 1):
    distance = distanceList[i-1]
    # 写入位置的行列号可以任意改变,这里我是从第2行开始按行依次插入第11列
    ws.cell(row=i, column=3).value = distance
#     print("操作成功")
#  保存操作
wb.save(r'C:\Users\asus\PycharmProjects\pythonProject\GaodeAPI\各区之间详细距离.xlsx')

这是我通过手动+自动方式整出来的,不喜勿喷哈…
在这里插入图片描述
最终,我们的目标得以实现!

写在最后:

不得不说,地图的里面提供的信息量与提供的功能真的特别强,惊着了!!!大家如有其他功能需求,都可以参考开发者文档得以实现,我这举了个小小的栗子,相信大家一定能实现自己所需。
感谢zh载舟博主的文档借鉴,让我更好的实现了我的需求,感谢!!!
下附链接:
https://zhuanlan.zhihu.com/p/42219436?utm_source=wechat_session&utm_medium=social&utm_oi=1137391110547820544&utm_campaign=shareopn
  • 19
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值