1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python调用百度地图api获取起点终点路线规划距离和预估时长

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

时间:2020-10-26 19:41:53

相关推荐

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

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

工具:Python3

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

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

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

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

# -*- coding: utf-8 -*-import pandasimport csvimport reimport timeimport jsonfrom urllib.request import urlopenimport urllib# 原数据文件格式: 序号 + 起点纬度 + 起点经度 + 终点纬度 + 终点经度origin_path = 'E://data/起点终点坐标.xlsx' # 原始坐标文件路径result_path = 'E://data/result122901.txt' # 爬取数据文件保存路径"""# 百度地图提供的api服务网址"http://api./routematrix/v2/driving?output=json" # 驾车(routematrix 批量算路)'http://api./routematrix/v2/riding?output=json' # 骑行'http://api./routematrix/v2/walking?output=json' # 步行'http://api./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 # 使用第几个akfor 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./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转dictstatus_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 += 1ak = AK[akn]else:distance_drive = timesec_drive = '请求错误'"""### 以下是乘车规划可选参数tac_bus = r'&tactics_incity=0'# 市内公交换乘策略 可选,默认为00推荐;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./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,但只返回一个空listdistance_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 += 1ak = 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 )

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。