input怎么获取全路径_利用百度地图API获取多方式行程时间

47ec79afb3a60e6ae1bb003567521c24.gif

点击上方蓝色字体,关注我

这一篇关于api接口调用

预计阅读需要8分钟

aa3e5a8a172e49bda3ca349f346fefd8.gif

今天的推送是大学舍友小牛同学的投稿(虽然没有稿费),以路径规划这个接口为例,非常详细介绍了如何使用百度api接口,学起来很快,应该也很有用处,api接口用起来都差不多

笔者使用的是百度地图“Web服务API”提供的路径规划功能,地址如下

http://lbsyun.baidu.com/index.php?title=webapi

预期效果

输入:起终点的经纬度坐标

返回:多种交通方式的当前时刻的预计行程时间ps:若基础数据为文字地址,可使用百度地图API提供的“正/逆地理编码服务”转换为经纬坐标数据

获取秘钥

秘钥是访问百度地图API各项功能的密码,需向百度地图申请获得

293503f4d18aada94e7820273ca23b25.png

点击网址,登录百度账号,点击获取秘钥,即可进入控制台界面我们需要以开发应用的名义申请秘钥,因此在应用管理的我的应用中点击创建应用简单输入必要信息提交后稍等便可通过验证返回控制台即可获得所申请应用的AK码即秘钥

1911c1c5c72863d1a8bcc9ad1efa1708.png

路线规划

点击网址中的路线规划分区进入路线规划服务界面

6787c404de2b5a98204df410a6b3a020.png

百度给定的使用文档详细标明了请求格式,以及返回格式

以返回参数相对复杂的公交路径规划为例

请求时有必填和选填部分

不可或缺的部分:

API地址+起终点经纬度+AK秘钥(各要素间通过&连接)

还有许多选填参数:

输入输出坐标类型(火星坐标/百度坐标/GPS坐标)、出行者选择路径的策略

值得一提的是在公交路径规划中是可以通过控制“公交换乘策略”是否使用地铁这一变量分别获得仅公交车出行和综合使用公共交通两种状态下的行程时间的

这在需要分别获得公交车以及地铁出行数据并加以对比时十分方便

由于唯一的变量为起终点经纬度,因此可以将请求代码整合为一个函数,方便调用:

def stod(slat,slng,dlat,dlng):#输入:起点纬度、起点经度、终点纬度、终点经度    url ="http://api.map.baidu.com/direction/v2/transit?" #API地址    ak = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' #秘钥    real_url = url +"origin="+slat+","+slng+"&destination="+dlat+","+dlng+"&ak="+ak #完整的请求代码    req = requests.get(real_url)    t = req.text    data = json.loads(t) #将数据保存在数组data中    try:#防止某几条数据报错导致请求终止        total_duration = data['result']["routes"][0]["duration"]/60        stepstr = str(total_duration) #获取该条数据总行程时间        steps = data['result']["routes"][0]['steps'] #获取该条路径的所有步骤        for step in steps:            step_tructions = step[0]["instructions"]#每一步的介绍包括乘坐公交车或地铁线路名            step_duration = step[0]["duration"]#每一步所花费的时间            stepstr = stepstr+"/"+step_tructions+"/"+str(step_duration/60)    except:        stepstr = None    req.close()    return stepstr #返回数据为总时长/第一步/第一步耗时/第二步/第二步耗时/...

全方式整合版

由于计算每种出行方式出行时耗都要单独编写一个函数,不够简洁,笔者将公共交通、小汽车、电动车、自行车、步行五种出行方式整合为一个Class(类)方便后续在其他py文件中直接调用。
类文件如下:

import requestsimport jsonclass Round_plan():    """一个关于调用百度地图API全方式路径规划功能的类"""    def __init__(self,transit_mode):        self.transit_mode=transit_mode    def stod(self,slat,slng,dlat,dlng):        self.slat=slat        self.slng=slng        self.dlat=dlat        self.dlng=dlng        if self.transit_mode=='Car':            a="driving"        elif self.transit_mode=='Public transit' :            a="transit"        elif self.transit_mode=="E-bike":            a="riding"        elif self.transit_mode=="Bike":            a="riding"        elif self.transit_mode=="Walk":            a="walking"        url = "http://api.map.baidu.com/direction/v2/"+a+"?"        ak = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'        if self.transit_mode=="E-bike":            real_url = url + "origin="+slat+","+slng+"&destination="+dlat+","+dlng+"&ak="+ak+"&riding_type="+"1"        else:            real_url = url + "origin="+slat+","+slng+"&destination="+dlat+","+dlng+"&ak="+ak        req = requests.get(real_url)        t = req.text        data = json.loads(t)        # print(data['result']["routes"][0])        try:            if self.transit_mode != 'Public transit' :                total_duration = data['result']["routes"][0]["duration"]/60                stepstr = str(total_duration)            else:                 total_duration = data['result']["routes"][0]["duration"]/60                 stepstr = str(total_duration)                 steps = data['result']["routes"][0]['steps']                 for step in steps:                    step_tructions = step[0]["instructions"]                    step_duration = step[0]["duration"]                    # print(step_tructions , step_duration)                    stepstr = stepstr+"/"+step_tructions+"/"+str(step_duration/60)        except:             stepstr = None        req.close()        return stepstr

应用案例

原始数据为test.xlsx,包含5条起终点经纬坐标:

e8fedc1fb30486b1b5d1d84ab0d9ee04.png

主程序代码如下

from round_plan import Round_plan #引用类import xlrdimport openpyxlimport timeimport socketsocket.setdefaulttimeout(20)transit_mode=input("Please input which transit mode you will choose:(Car/Public transit/E-bike/Bike/Walk)")file_name=input("Please input the filename of the data:")if __name__ == '__main__':  #调用文件的方式为直接执行    path = file_name+r'.xlsx'    xl = xlrd.open_workbook(path)    sheet = xl.sheets()[0]    data = []    data.append(sheet.col_values(0))    data.append(sheet.col_values(1))    data.append(sheet.col_values(2))    data.append(sheet.col_values(3))    slat = data[0]    slng = data[1]    dlat = data[2]    dlng = data[3]    stepstr_list=[]    # print(data)    for i in range(len(slat)):        print(i)        if(i%100==0):            time.sleep(1)        rount_result=Round_plan(transit_mode)   #类的实例        stepstr = rount_result.stod(str(slat[i]), str(slng[i]), str(dlat[i]), str(dlng[i]))        stepstr_list.append(stepstr)    wb = openpyxl.Workbook()    sheet = wb.active    sheet.title = 'stepstr_data'    value = [stepstr_list]    for i in range(0, 1):        for j in range(0, len(value[i])):            sheet.cell(row=j + 1, column=i + 1, value=value[i][j])    wb.save(transit_mode+'-test.xlsx')    print("写入数据成功!")

当数据量较大时建议设置较长的每100次请求间隔时间,这是为了防止远程主机认为短时间内一款应用产生大量请求,系为恶意访问强行终止访问,报错如下

4521b5eca2eb3508346b51ade2a7da40.png

最终效果如图所示:

d927f9844f2b5d1bd14ae504609d5125.png

得到数据结构如图所示:

cc66fe992a3cd161530c64b4754fee93.png

可以留言了

点击这里,给我留言!

517cc0599f529015fba8cb40a9d6eb9e.gifEND 517cc0599f529015fba8cb40a9d6eb9e.gif

57426a13ebc4f20d974e9b4be4ee32a3.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值