Python利用百度地图获取两地距离(附demo)

作者:Gavin_Sunny 时间:2022-10-18 23:21:33 

百度地图开放平台

进入百度地图开放平台后,登陆用户,点击上方的控制台,按照提示进行激活后创建服务端类型的应用,应用名任意设置,其中白名单校验不做任何限制可以填写0.0.0.0/0。创建成功后画面应如下图所示,其中访问应用AK)即途中红色方框圈起来的部分一定要注意不要随意泄漏,后面需要使用到,这是后面访问需要用到的一串口令。

Python利用百度地图获取两地距离(附demo)

介绍需要用到的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={}&region=全国&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.进行简单的功能测试

运行代码输出北京成都之间的距离,其单位为米。

Python利用百度地图获取两地距离(附demo)

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文件的内容为:

Python利用百度地图获取两地距离(附demo)

对应的输出result.xlsx文件内容如下:

Python利用百度地图获取两地距离(附demo)

附录


# 本次整体的源代码
AK = "修改为你自己的AK码即可使用"

import pandas as pd
import requests
import json

def getPosition(address):
   url = r"http://api.map.baidu.com/place/v2/search?query={}&region=全国&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,百度地图,两地距离
0
投稿

猜你喜欢

  • numpy工程实践之np.savetxt()存储数据

    2023-06-19 07:33:11
  • Python3中.whl文件创建及使用

    2022-11-05 00:17:50
  • windows下python 3.9 Numpy scipy和matlabplot的安装教程详解

    2021-12-20 13:20:47
  • Python实现求解括号匹配问题的方法

    2023-08-02 08:05:47
  • django创建css文件夹的具体方法

    2021-08-29 06:04:08
  • Python迭代和迭代器详解

    2023-11-20 08:52:28
  • python+numpy+matplotalib实现梯度下降法

    2023-07-26 04:07:35
  • .NET之生成数据库全流程实现

    2024-01-16 05:08:48
  • python学生信息管理系统

    2022-10-16 11:43:04
  • yolov5模型配置yaml文件详细讲解

    2022-02-04 07:21:30
  • windows安装TensorFlow和Keras遇到的问题及其解决方法

    2022-04-04 02:14:23
  • 一篇文章带你入门python之推导式

    2022-02-05 08:29:35
  • CSS属性behavior的语法及介绍

    2010-01-13 12:40:00
  • Go WaitGroup及Cond底层实现原理

    2024-02-18 23:05:03
  • macOS Sierra安装Apache2.4+PHP7.0+MySQL5.7.16

    2023-11-15 13:05:39
  • 安装SQL Server 2005时出现计数器错误

    2008-11-28 14:19:00
  • SQL Server配置管理器无法连接到WMI提供程序

    2024-01-23 23:49:30
  • MySQL误操作后快速恢复数据的方法

    2024-01-28 00:16:11
  • 如何使用 Vuex的入门教程

    2024-05-28 16:00:48
  • Pytest fixture及conftest相关详解

    2021-06-23 11:37:31
  • asp之家 网络编程 m.aspxhome.com