首先先来说说解决的问题吧:获任某市内所有县区的经纬度,以及各市区之间最佳的驾车距离
我们知道,通过高德地图我们可以解决我们出行规划的几乎所有问题。
直接在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)# 接收数据strategydata2 = 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