当前位置 博文首页 > Python利用百度地图获取两地距离(附demo)

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

    作者:Gavin_Sunny 时间:2021-08-04 18:04

    目录
    • 百度地图开放平台
    • 介绍需要用到的API
    • 编写Python程序
    • 1.获取对应地点的经纬度
    • 2.获取两地之间的距离
    • 3.合并函数调用
    • 4.进行简单的功能测试
    • 5.对Excel中的批量地点计算距离

    百度地图开放平台

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