Python调用百度地图api获取起点终点路线规划距离和预估时长

现有起点和终点坐标值(经纬度lng、lat),目的是通过百度地图开发者平台的路线规划功能获取起点终点路线规划距离和预估时长,百度地图开发者平台路线规划使用说明网址为:http://lbsyun.baidu.com/index.php?title=webapi/direction-api-abroad

工具:Python3

实现过程并不难,但是爬取过程可能会由于服务器或者参数不满足要求导致爬虫中断,注意处理这个问题即可。

最终结果是写入了txt文件,所以需要在循环遇到错误的时候写入对应的可识别的值(就是说我看到这个值就知道这个结果是错误的,可以写对应数量的NA或者0值),方便后续分析。

如果手上只有起点和终点的结构化地址数据(如:北京市海淀区上地十街十号),可以使用百度地图开发者平台的地理编码服务,可以参考这篇文章:https://mp.csdn.net/postedit/81610131

以下爬虫要改的地方:一是注意源文件的数据格式要转utf-8;二是修改文件路径;三是AK需要自行去开发者平台申请。

# -*- coding: utf-8 -*-
import pandas
import csv
import re
import time
import json
from urllib.request import urlopen
import urllib

# 原数据文件格式: 序号 + 起点纬度 + 起点经度 + 终点纬度 + 终点经度
origin_path = 'E://data/起点终点坐标.xlsx'   # 原始坐标文件路径
result_path = 'E://data/result122901.txt'   # 爬取数据文件保存路径

"""# 百度地图提供的api服务网址
"http://api.map.baidu.com/routematrix/v2/driving?output=json"  # 驾车(routematrix 批量算路)
'http://api.map.baidu.com/routematrix/v2/riding?output=json'  # 骑行
'http://api.map.baidu.com/routematrix/v2/walking?output=json'  # 步行
'http://api.map.baidu.com/direction/v2/transit?output=json'  # bus(direction路线规划)
"""

# 声明坐标格式,bd09ll(百度经纬度坐标);bd09mc(百度摩卡托坐标);gcj02(国测局加密坐标),wgs84(gps设备获取的坐标)
cod = r"&coord_type=bd09ll"

# AK为从百度地图网站申请的秘钥
AK = ['4KQuylnCQEIWYG65tEMQ9spP4FFBvNoI',]

dfBase = pandas.read_excel(origin_path, names=['序号','起点纬度','起点经度','终点纬度','终点经度'])
dfBase.head()

dataList = []  # 储存获取的路线数据
akn = 0  # 使用第几个ak
for i in range(len(dfBase)):
    print(i)
    ak = AK[akn]
    out_lat = dfBase.at[i,'起点纬度']
    out_lng = dfBase.at[i,'起点经度']
    des_lat = dfBase.at[i,'终点纬度']
    des_lng = dfBase.at[i,'终点经度']
    """
    # 获取驾车路径:常规路线规划(不考虑路况) 
    以下是可选参数
    #  tactics =10不走高速;=11常规路线;=12距离较短;=13距离较短
    """
    url_drive = r"http://api.map.baidu.com/routematrix/v2/driving?output=json&origins={0},{1}&destinations={2},{3}&{4}&tactics=11&ak={4}".format(out_lat,out_lng,des_lat,des_lng,ak)
    result_drive = json.loads(urlopen(url_drive).read())  # json转dict
    status_drive = result_drive['status']
    print('ak秘钥:{0}  获取驾车路线状态码status:{1}'.format(ak, status_drive))
    if status_drive == 0:  # 状态码为0:无异常
        distance_drive = result_drive['result'][0]['distance']['value']  # 里程(米)
        timesec_drive = result_drive['result'][0]['duration']['value']  # 耗时(秒)
    elif status_drive == 302 or status_drive == 210 or status_drive == 201:  # 302:额度不足;210:IP验证未通过
        distance_drive = timesec_drive = 'AK错误'
        akn += 1
        ak = AK[akn]
    else:
        distance_drive = timesec_drive = '请求错误'

    
    """
    ### 以下是乘车规划
    可选参数
    tac_bus = r'&tactics_incity=0'
    # 市内公交换乘策略 可选,默认为0      0推荐;1少换乘;2少步行;3不坐地铁;4时间短;5地铁优先
    city_bus = r'&tactics_intercity=0'
    # 跨城公交换乘策略  可选,默认为0    0时间短;1出发早;2价格低;
    city_type = r'&trans_type_intercity=0'
    # 跨城交通方式策略  可选,默认为0  0火车优先;1飞机优先;2大巴优先;
    """
    url_bus = r'http://api.map.baidu.com/direction/v2/transit?output=json&origin={0},{1}&destination={2},{3}&{4}&ak={4}'.format(out_lat,out_lng,des_lat,des_lng,ak)
    print(url_bus)
    result_bus = json.loads(urlopen(url_bus).read())
    status_bus = result_bus['status']
    print('ak秘钥:{0}  获取乘车路线状态码status:{1}'.format(ak, status_bus))
    if status_bus == 0:
        rsls = result_bus['result']['routes']
        if rsls == []:    # 无方案时状态也为0,但只返回一个空list
            distance_bus = timesec_bus = cost_bus = '无公交方案'
        else:
            distance_bus = result_bus['result']['routes'][0]['distance']  # 乘车路线距离总长(米)
            timesec_bus = result_bus['result']['routes'][0]['duration']  # 乘车时间(秒)
            cost_bus = result_bus['result']['routes'][0]['price']  # 乘车费用(元)
    elif status_bus == 302 or status_bus == 210 or status_bus == 201:
        distance_bus = timesec_bus = cost_bus = 'AK错误'
        akn += 1
        ak = AK[akn]
    elif status_bus == 1001:
        distance_bus = timesec_bus = cost_bus = '无公交方案'
    else:  # 其他类型状态码(服务器错误)
        distance_bus = timesec_bus = cost_bus = '请求错误'
    
    dataList.append([ak,status_drive,distance_drive,timesec_drive,status_bus,distance_bus,timesec_bus,cost_bus])

dfAll = pandas.DataFrame(dataList, columns=['ak','status_drive','distance_drive','timesec_drive','status_bus','distance_bus','timesec_bus','cost_bus'])
dfAll

最后保存为Excel:

result_path = r'E://data/路线规划结果.xls'   # 爬取数据文件保存路径
dfAll.to_excel(result_path )

 

有什么问题欢迎骚扰我微信:

 

 

 

  • 23
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 55
    评论
好的,我了解了你的问题。首先,你需要使用百度地图API获取轨迹点的经纬度信息,然后使用Python的Matplotlib库来绘制轨迹图。 以下是一个简单的步骤: 1. 在百度地图开放平台上创建一个应用,获取到对应的AK(Access Key)。 2. 使用百度地图API的“轨迹纠偏”功能,将原始轨迹点转换为经纬度坐标点,并保存到本地文件中。 3. 使用Python的Matplotlib库,读取保存的经纬度坐标点,绘制轨迹图。 下面是一个简单的代码示例: ```python import requests import json import matplotlib.pyplot as plt # 设置AK ak = 'your_access_key' # 获取轨迹点 url = 'http://api.map.baidu.com/rectify/v1/track?ak={}'.format(ak) data = { "entity_name": "your_entity_name", "start_time": "your_start_time", "end_time": "your_end_time", "is_processed": "1" } response = requests.post(url, data=json.dumps(data)) points = response.json()['points'] # 保存轨迹点到本地文件 with open('points.txt', 'w') as f: for point in points: f.write('{} {}\n'.format(point['x'], point['y'])) # 绘制轨迹图 x = [] y = [] with open('points.txt', 'r') as f: for line in f.readlines(): point = line.strip().split(' ') x.append(float(point[0])) y.append(float(point[1])) plt.plot(x, y) plt.show() ``` 在上述代码中,你需要替换AK、entity_name、start_time和end_time参数为你自己的值。同时,你也可以根据需要自定义轨迹图的样式。 希望这可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值