Python利用百度地图获取两地距离(附demo)
作者:Gavin_Sunny 发布时间:2022-10-18 23:21:33
百度地图开放平台
进入百度地图开放平台后,登陆用户,点击上方的控制台,按照提示进行激活后创建服务端类型的应用,应用名任意设置,其中白名单校验不做任何限制可以填写0.0.0.0/0
。创建成功后画面应如下图所示,其中访问应用(AK)即途中红色方框圈起来的部分一定要注意不要随意泄漏,后面需要使用到,这是后面访问需要用到的一串口令。
介绍需要用到的API
本项目中所有使用的API均为Web服务API,官方开发文档。
1.地点检索服务
地点检索服务(又名Place API)是一类Web API接口服务;
服务提供多种场景的地点(POI)检索功能,包括城市检索、圆形区域检索、矩形区域检索。开发者可通过接口获取地点(POI)基础或详细地理信息。
我们利用这个API来获取指定地点的经纬度(lat, lng)两个参数。
2.批量算路服务
批量算路服务(又名RouteMatrix API)是一套以HTTP/HTTPS形式提供的轻量级批量算路接口,用户可通过该服务,根据起点和终点坐标计算路线规划距离和行驶时间,RouteMatrix API V2.0支持中国大陆地区。
我们利用这个API来获取两个地点(用经纬度来给出)之间的路线规划距离。
编写Python程序
0.需要用到的模块
requests
json
1.获取对应地点的经纬度
将传入的address
通过地点检索服务得到其经纬度,返回值为经纬度对应的字符串值,中间以逗号隔开,之后跟一个查询返回状态,如果查询失败,状态值不为0。
注意将代码中的AK换成一开始截图中的AK码。
def getPosition(address):
url = r"http://api.map.baidu.com/place/v2/search?query={}®ion=全国&output=json&ak={}".format(
address,
AK # 这里是一开始截图用红色圈起来的部分
)
res = requests.get(url)
json_data = json.loads(res.text)
if json_data['status'] == 0:
lat = json_data["results"][0]["location"]["lat"] # 纬度
lng = json_data["results"][0]["location"]["lng"] # 经度
else:
print("[ERROR] Can not find {}.".format(address))
return "0,0", json_data["status"]
return str(lat) + "," + str(lng), json_data["status"]
2.获取两地之间的距离
将传入的两个地点(以经纬度描述)通过批量算路服务得到之间的路线规划距离。本范例是以驾车行驶(对应参数为'driving')的方式来进行计算的。
同样注意将代码中的AK换成一开始截图中的AK码。
def getDistance(start, end):
url = "http://api.map.baidu.com/routematrix/v2/driving?output=json&origins={}&destinations={}&ak={}".format(
start,
end,
AK # 这里是一开始截图用红色圈起来的部分
)
res = requests.get(url)
content = res.content
jsonv = json.loads(str(content, "utf-8"))
dist = jsonv["result"][0]["distance"]["value"]
return dist
3.合并函数调用
传入两个地点名,返回两地点距离,当某个地点查询不到时,返回结果设置为-1。
def calcDistance(startName, endName):
start, status1 = getPosition(startName)
end, status2 = getPosition(endName)
if status1 == 0 and status2 == 0:
return getDistance(start, end)
else:
return -1
4.进行简单的功能测试
运行代码输出北京和成都之间的距离,其单位为米。
5.对Excel中的批量地点计算距离
将data.xlsx
文件中的地点全部读取并计算出距离,将结果保存到本地的result.xlsx
文件中,其中我们将距离的单位设置为千米。主模块代码如下:
if __name__ == "__main__":
data = pd.read_excel("data.xlsx")
res = []
for i in range(0, len(data)):
startName = data.iloc[i, 0]
endName = data.iloc[i, 1]
dist = calcDistance(startName, endName)
res.append([startName, endName, dist / 1000])
pd.DataFrame(res).to_excel(
"result.xlsx",
header=["起点", "终点", "距离"],
index=None,
encoding="utf-8"
)
其中data.xlsx
文件的内容为:
对应的输出result.xlsx
文件内容如下:
附录
# 本次整体的源代码
AK = "修改为你自己的AK码即可使用"
import pandas as pd
import requests
import json
def getPosition(address):
url = r"http://api.map.baidu.com/place/v2/search?query={}®ion=全国&output=json&ak={}".format(
address,
AK # 这里是一开始截图用红色圈起来的部分
)
res = requests.get(url)
json_data = json.loads(res.text)
if json_data['status'] == 0:
lat = json_data["results"][0]["location"]["lat"] # 纬度
lng = json_data["results"][0]["location"]["lng"] # 经度
else:
print("[ERROR] Can not find {}.".format(address))
return "0,0", json_data["status"]
return str(lat) + "," + str(lng), json_data["status"]
def getDistance(start, end):
url = "http://api.map.baidu.com/routematrix/v2/driving?output=json&origins={}&destinations={}&ak={}".format(
start,
end,
AK # 这里是一开始截图用红色圈起来的部分
)
res = requests.get(url)
content = res.content
jsonv = json.loads(str(content, "utf-8"))
dist = jsonv["result"][0]["distance"]["value"]
return dist
def calcDistance(startName, endName):
start, status1 = getPosition(startName)
end, status2 = getPosition(endName)
if status1 == 0 and status2 == 0:
return getDistance(start, end)
else:
return -1
if __name__ == "__main__":
data = pd.read_excel("data.xlsx")
res = []
for i in range(0, len(data)):
startName = data.iloc[i, 0]
endName = data.iloc[i, 1]
dist = calcDistance(startName, endName)
res.append([startName, endName, dist / 1000])
pd.DataFrame(res).to_excel(
"result.xlsx",
header=["起点", "终点", "距离"],
index=None,
encoding="utf-8"
)
来源:https://blog.csdn.net/Gavin_Nicholas/article/details/118581961


猜你喜欢
- 本文实例为大家分享了Python时间戳使用和相互转换的具体代码,供大家参考,具体内容如下1.将字符串的时间转换为时间戳方法: &n
- 一、INSERT语句中有反斜杠(\)1. 实际测试咱们用下面这些SQL来测试一下反斜杠(\)在INSERT语句中会是啥样?INSERT IN
- 使用Django的时候,我发现一个很神奇的装饰器: @login_required, 这是控制一个view的权限的,比如一个视图必须登录才可
- 一、线程基础以及守护进程线程是CPU调度的最小单位全局解释器锁全局解释器锁GIL(global interpreter lock)全局解释器
- 以下的文章主要介绍的是SQL Serve数据库到DB2连接服务器的实现过程,我们大家都知道不同数据库平台的互连,一般对其称之为数据库的异构服
- mysql服务启动,但是连接不上,如何解决?登陆报错: root@localhost:~# mysql -u root -p &
- 有时候需要制造一些测试的数据,以mysql官方给的测试库为基础,插入十万,百万或者千万条数据。利用一些函数和存储过程来完成。官方给的测试库地
- #include <string>#include <iostream>using namespace std; v
- 处理数据的时候,偶然遇到要把一个Dataframe中的某些行添加至一个空白的Dataframe中的问题。最先想到的方法是创建Datafram
- TensorFlow训练网络有两种方式,一种是基于tensor(array),另外一种是迭代器两种方式区别是:第一种是要加载全部数据形成一个
- 效果图:代码如下:<!DOCTYPE html><html lang="en"><head
- 一、ConfigParser简介ConfigParser 是用来读取配置文件的包。配置文件的格式如下:中括号“[ ]”内包含的为sectio
- 1.过滤器的使用1.过滤器和测试器在Python中,如果需要对某个变量进行处理,我们可以通过函数来实现。在模板中,我们则是通过过滤器来实现的
- cookie :是用户保存在用户浏览器端的一对键值对,是为了解决http的无状态连接。服务端是可以把 cookie写到用户浏览器上,用户每次
- 拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等拖拽的流程动作1、鼠标按下 会触发onmousedown事件2、
- 需求背景公司前端使用 Highcharts 构建图表,图表的图例支持点击显示或隐藏相应的指标。现在有需求后端需要存储用户在前端点击后显示图表
- 本文实例为大家分享了vue+Element实现登录随机验证码的具体代码,供大家参考,具体内容如下验证码验证只是前端,无需后台交互首先,创建一
- 安装pygal,可参阅:pip和pygal的安装实例教程基本XY线:import pygalfrom math import cos&quo
- 任务队列主线程:正在执行的代码,会生成函数调用栈。macro-task(宏任务,新名:task)包括:script(整体代码), setTi
- 我们在flask的学习中,会难免遇到多对多表的查询,今天我也遇到了这个问题。那么我想了好久。也没有想到一个解决的办法,试了几种方法,可能是思