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

 更新时间:2021年07月09日 16:47:41   作者:Gavin_Sunny  
本文主要介绍了Python利用百度地图获取两地距离,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

百度地图开放平台

进入百度地图开放平台后,登陆用户,点击上方的控制台,按照提示进行激活后创建服务端类型的应用,应用名任意设置,其中白名单校验不做任何限制可以填写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={}&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.进行简单的功能测试

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

在这里插入图片描述

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={}&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"
    )

到此这篇关于Python利用百度地图获取两地距离的文章就介绍到这了,更多相关Python 百度地图获取两地距离 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python实战小游戏飞机大战详解

    Python实战小游戏飞机大战详解

    飞机大战想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,下面这篇文章主要给大家介绍了关于如何利用python写一个简单的飞机大战小游戏的相关资料,需要的朋友可以参考下
    2021-11-11
  • Python实现自定义异常堆栈信息的示例代码

    Python实现自定义异常堆栈信息的示例代码

    当我们的程序报错时,解释器会将整个异常的堆栈信息全部输出出来。解释器会将异常产生的整个调用链都给打印出来,那么问题来了,我们能不能自定义这些报错信息呢?本文就来为大家详细讲讲
    2022-07-07
  • Python利用Seaborn绘制多标签的混淆矩阵

    Python利用Seaborn绘制多标签的混淆矩阵

    混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。本文将利用Seaborn绘制多标签的混淆矩阵,感兴趣的可以学习一下
    2022-07-07
  • 讲解Python中for循环下的索引变量的作用域

    讲解Python中for循环下的索引变量的作用域

    这篇文章主要介绍了讲解Python中for循环下的索引变量的作用域,是Python学习当中的基础知识,本文给出了Python3的示例帮助读者理解,需要的朋友可以参考下
    2015-04-04
  • 基于Python制作一个汇率换算程序

    基于Python制作一个汇率换算程序

    这篇文章主要为大家详细介绍了如何利用Python语言制作一个汇率换算程序,文中的示例代码讲解详细,对我们学习Python有一定帮助,需要的可以参考一下
    2022-09-09
  • python集合能干吗

    python集合能干吗

    在本篇内容中小编给各位分享了关于python集合的作用以及相关实例内容,需要的朋友们可以学习参考下。
    2020-07-07
  • Opencv中cv2.floodFill算法的使用

    Opencv中cv2.floodFill算法的使用

    本文结合实例,详细的介绍了泛洪填充算法的具体使用,具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Python函数中的不定长参数相关知识总结

    Python函数中的不定长参数相关知识总结

    今天给大家带来的是关于Python函数的相关知识,文章围绕着Python不定长参数展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Python数据结构链表操作从基础到高级实例深究

    Python数据结构链表操作从基础到高级实例深究

    链表是一种基础的数据结构,它由一系列节点组成,每个节点都包含数据和指向下一个节点的引用,在Python中,可以使用类来实现链表,本文将介绍如何实现链表,并提供一些丰富的示例代码来帮助你更好地理解其原理和应用
    2023-12-12
  • opencv python 图片读取与显示图片窗口未响应问题的解决

    opencv python 图片读取与显示图片窗口未响应问题的解决

    这篇文章主要介绍了opencv python 图片读取与显示图片窗口未响应问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04

最新评论