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

news/2025/2/12 8:05:03/

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

我们知道,通过高德地图我们可以解决我们出行规划的几乎所有问题。
直接在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

http://www.ppmy.cn/news/558779.html

相关文章

计算机毕业设计springboot基于SpringBoot的自助旅游导航系统

最新计算机专业原创毕业设计参考选题都有源码数据库是近期作品ling取参考 你的选题刚好在下面有,有时间看到机会给您发 1ssm花卉网站2ssm智能推荐招聘网站3springboot在线视频教育平台4ssm超市收银系统5计算机专业教学网站6ssm商超零售送货到家购物系统7springboot网上书城网站…

说走就走——二次云南行(昆明大理丽江)

说走就走——二次云南行&#xff08;昆明大理丽江&#xff09; 凌晨买当天机票&#xff0c;说走就走&#xff01;总体行程&#xff1a;流水账&#xff1a;D1: 去程&#xff08;上海——昆明——大理&#xff09;D2: 环洱海&#xff08;租车&#xff09;双廊古镇&&南诏风…

网站左侧导航代码如何编写

<div class"leftIco"><img src"/mormhweb/images/kftel.gif" /></div> <div id"hycenter_right"> <dl> <dt class"rightTopBar"> <div> <span id"navLink_w">货运电子商务…

智慧“昆明”在路上 未来充满精彩

智慧城市是运用物联网、云计算、大数据、移动互联网、空间地理信息集成等新一代信息技术&#xff0c;促进城市规划、建设、管理和服务智慧化的新理念和新模式。近年来&#xff0c;昆明市全面加快智慧城市建设&#xff0c;力争通过三年的努力&#xff0c;打造区域信息辐射中心的…

jquery省市县三级导航栏

需要用到三张图片放入img文件中 back.png close.png link.png <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, initial-scale1, maximum-sca…

java web景点规划导航

需求&#xff1a;有起点&#xff0c;终点&#xff0c;可随意输入不同的地方名&#xff0c;根据百度地图计算&#xff0c;规划出由起点到终点的路径&#xff0c;且需经过输入的地方。输入的地方是普通文字&#xff0c;而不是经纬度。所以需要调用百度的地址转经纬度&#xff0c;…

农业网址导航

一、天气预报 天气在线 莒县天气 中央气象台莒县天气 山东气象台天气预报 二、鲜花网站 云南鲜花 斗南传情 云南花卉 斗南国际花卉 凌源鲜花批发 凌源鲜花批发2 昆明米贝花卉批发网 广州鲜花网 三、搜索查询 百度搜索 百度地图 谷歌搜索 谷歌地图 维普资 汉…