自制语音助手想做一个查询交通路线的功能,于是就想到了百度地图。在百度地图的服务器端应用中,提供了“轻量级路线规划”API接口,正好可以满足需求。要用这个接口,需要注册百度地图账号并创建一个服务器端的应用。有关开通百度地图服务器端应用的操作,可以参考博文:python调用百度地图api,查询地方的经度纬度,将数据写入excel_python获取当前位置经纬度-CSDN博客
在百度地图开发文档中关于路径规划的示例如下所示。
在ak这里输入自己的api_key后执行,就能看到规划结果了。
请注意:看到红框中的内容了吗?这里需要输入起始地和目的地的经纬度坐标。但我们平时只会输入具体地址,这个经纬度坐标从哪儿获取?这就需要用到百度地图的另一个API接口——地理编码。
在百度地图开发文档中关于地理编码的示例如下所示。
很简单吧?不过有一点需要注意,这里的address必须要写XX市,如果不写则会返回空。
好了,现在知道了路线规划的接口,也知道了地理编码的接口,把它们组合起来,就能做一个自定义的路线规划程序了。如下是我的代码:
import requestsak = ‘您的AK’def local_geocode(address):
‘’‘获取地理编码’’’global akresult = ''index0 = address.find('市')
#地址中是否写了XX市的判断if index0 == -1:address = "上海市"+address
#如果地址中不含XX市,默认加一个‘上海市’url = "https://api.map.baidu.com/geocoding/v3"params = {"address": address,"output": "json","ak": ak,}response = requests.get(url=url, params=params)if response:resp = response.json()if resp['status'] == 0:
#status=0表示接口调用成功,否则就是各种报错了result = (resp['result']['location']['lng'], resp['result']['location']['lat'])return resultdef route_plan(loc1, loc2, type='transit'):
‘’‘获取规划路线,默认公交路线规划’’’global ak
origin_url = "https://api.map.baidu.com/directionlite/v1/"url = origin_url + type#拼接不同的type,调用不同的路线规划接口,分别是driving,transit,riding,walking
orign = str(loc1[1]) + ',' + str(loc1[0])destination = str(loc2[1]) + ',' + str(loc2[0])
#地理编码获取的经纬度信息,放到路线规划中需要把位置换一换params = {"origin": orign,"destination": destination,"ak": ak,}response = requests.get(url=url, params=params)if response:resp = response.json()print(resp)if resp['status'] == 0:
#status=0表示接口调用成功,否则就是各种报错了distance = resp['result']['routes'][0]['distance']
#起点到终点的距离,单位是米duration = resp['result']['routes'][0]['duration']
#起点到终点的耗时,单位是秒data = resp['result']['routes'][0]['steps']
#具体规划路径的key是stepsfor step in data:print(step)addr1 = input('输入初始地址:')
loc1 = local_geocode(addr1)
addr2 = input('输入目的地:')
loc2 = local_geocode(addr2)
route_plan(loc1, loc2)
执行上面程序,可以得到如下的结果。
如果把transit改成其他三种方式,得到的response数据格式会有些不同,如下图,设计代码的时候需要注意。
好了,这就是完整的python获取百度地图路径规划的代码了。喜欢的话请给我一个赞吧!