目录
前言
在当今数字化时代,地理信息系统(GIS)技术已经深入到我们生活的方方面面。无论是日常出行规划、物流配送优化,还是城市交通管理,路线规划服务都扮演着至关重要的角色。而百度地图作为国内地图服务提供商,其强大的路线规划API为开发者提供了丰富的功能和数据支持。基于Java开发语言,结合百度地图的路线规划服务,不仅可以实现高效、精准的路线规划,还能通过Java的强大生态和企业级应用能力,为各类应用场景提供稳定可靠的解决方案。

在之前的系列博客中,关于在线地图导航的应用上,我们对天地图、高德地图均有过详细的介绍,同样作为在线地图的佼佼者,百度地图的也是值得信赖的服务接口。通过百度地图的路线规划能力来赋能我们的业务。在实际的业务过程中,我们可以基于百度地图的相关服务能力,同时对比不同的厂商地图接入能力。
本文将以Java编程语言为例,详细的对百度地图开放平台的驾车路线规划服务进行介绍,不仅详细的介绍其API和请求响应参数,同时还以Java为例,讲解如何对平台返回的对象进行对应的封装,通过自定义封装的结果。可以为后续的数据持久化和数据挖掘分析提供坚实的数据基础。文章首先详细的介绍百度地图的驾车路线服务,包括接口请求参数和响应参数。然后详细介绍在Java当中如何集成路径规划服务,并且将官方的JSON转换成我们的JavaBean。通过本文,您不仅可以掌握百度驾车路线规划的相关内容,同时可以了解如何自己来封装和定义相关业务对象,无论您是地理应用开发爱好者,还是GIS开发工程师,均可以学习实践。
一、驾车路线服务简介
本节将对百度地图的驾车路线服务进行简单的介绍。这不仅是我们开发的重要文档,也是我们后续进行问题查找的重要资料。这里将详细的介绍百度地图提供哪些规划服务、驾车路线服务包括哪些以及驾车路线服务的请求参数和响应参数信息。
1、百度路线规划服务
路线规划服务(又名Direction API)是一套REST风格的Web服务API,以HTTP/HTTPS形式提供了路线规划服务。

从上图可以看到,百度地图的路线规划服务视图是非常丰富的,不仅包含驾车的方式,还包含骑行、步行和公交。大家可以根据自己的业务需要来调用相应的服务即可。更多服务能力,大家可以访问百度开放平台的相关链接了解。
2、驾车路线服务
驾车服务作为路线服务中非常重要的一环。如今随着城市交通建设的大力发展,许多城市的道路建设几乎是日新月异,如果没有路线导航服务,出行一定会受到极大的限制。
百度驾车路线服务:
根据起终点坐标检索符合条件的驾车路线规划方案,支持以下功能:
支持一次请求返回多条路线(备用路线)
支持18个以内的途径点
支持传入车牌规避限行路段
支持传入起点车头方向,辅助判断起点所在正逆向车道,辅助更准确算路
支持未来出行规划,指定未来7天任意出发时刻,将依据智能预测路况和道路限行规划合理路线
驾车路线服务的访问地址如下:
bash
https://api.map.baidu.com/direction/v2/driving?origin=40.01116,116.339303&destination=39.936404,116.452562&ak=您的AK
3、请求参数
| 字段名称 | 含义 | 字段类型 | 必填 | 备注 |
|---|---|---|---|---|
| ak | 用户的访问权限,AK申请 | string | 必填 | |
| origin | 起点经纬度,小数点后不超过6位,40.056878,116.30815 | string | 必填 | 起点经纬度,格式为:纬度,经度;小数点后不超过6位,40.056878,116.30815 |
| destination | 终点经纬度,小数点后不超过6位,40.056878,116.30815 | string | 必填 | 终点经纬度,格式为:纬度,经度;小数点后不超过6位,40.056878,116.30815 |
| origin_uid | POI 的 uid(在已知起点POI 的 uid 情况下,请尽量填写uid,将提升路线规划的准确性, 使用地点检索服务获取uid 使用地点输入提示服务获取uid) | string | 选填 | |
| destination_uid | POI 的 uid(在已知终点POI 的 uid 情况下,请尽量填写uid,将提升路线规划的准确性, 使用地点检索服务获取uid 使用地点输入提示服务获取uid | string | 选填 | |
| waypoints | 途径点坐标串,支持18个以内的有序途径点。多个途径点坐标按顺序以英文竖线符号分隔,示例: 40.465,116.314|40.232,116.352|40.121,116.453 | string | 选填 | |
| coord_type | 坐标类型,可选参数,默认为bd09ll。允许的值为:bd09ll(百度经纬度坐标)、bd09mc(百度墨卡托坐标)、gcj02(国测局加密坐标)、wgs84(gps设备获取的坐标)。 | string | 选填 | 默认bd09II |
| ret_coordtype | 返回结果坐标类型,默认为bd09ll,允许的值为:bd09ll(百度经纬度坐标)、gcj02(国测局加密坐标) | string | 选填 | 默认bd09II |
| tactics | 0:默认 2:距离最短(只返回一条路线,不考虑限行和路况,距离最短且稳定,用于估价场景) 3:不走高速 4:高速优先 5:躲避拥堵 6:少收费 7: 躲避拥堵 & 高速优先 8: 躲避拥堵 & 不走高速 9: 躲避拥堵 & 少收费 10: 躲避拥堵 & 不走高速 & 少收费 11: 不走高速 & 少收费 12: 距离优先(考虑限行和路况,距离相对短且不一定稳定) 13:时间优先 | int | 选填 | 默认0:默认策略 |
| alternatives | 是否返回备选路线 类型:string 可选值: 0:返回一条推荐路线 1:返回1-3条路线供选择 | int | 选填 | 默认0 |
| cartype | 车辆类型,区分车辆是普通燃油车或纯电动汽车。由于部分城市对燃油车和电动车限行规则有差异,该字段用于结合plate_number车牌号来规避限行。例如:纯电动汽车在北京本地无尾号限行,而燃油车需遵守尾号限行。 可选值: 0:普通汽车 1:纯电动汽车 | int | 选填 | 默认0 |
| plate_number | 车牌号,如 京A00022 用于规避车牌号限行路段。 1、若有规避限行区域的可选路线,则返回规避后的路线,不会返回限行路线 2、若无规避限行的可选路线(如:起终点在限行区域内,或所有符合偏好的路线都无法规避限行区域),则返回限行路线中最优路线,并在返回字段 restriction 中提示用户路段被限行 | string | 选填 | 不填则不做规避 |
| departure_time | 设置出发时间(支持未来7天),UNIX时间戳。 该字段将影响duration字段的返回,用于返回未来驾车路线耗时。取值范围:当前时间之后7天*24小时内任意时刻(超出时间范围将预估路线) 若设置该参数,则路线规划服务将依据设定时间预测路况和限行规则,并据此计算路线和耗时。详细说明 | string | 选填 | 默认为当前时间 注意:该功能为高级付费服务,需通过工单联系工作人员开通 |
| ext_departure_time | 更多出发时间,UNIX时间戳。 该字段将影响ext_duration字段的返回,用于返回驾车路线历史耗时(路线在指定出发时间的耗时)。目前支持输入过去7天内一个或多个出发时间戳(不超过12个),多个时间戳之间用","英文半角逗号隔开。示例: ext_departure_time=1526527619 ext_departure_time=1526527619,1526525384,1526523654 注:目前出发时间仅影响ext_duration字段,还不会影响路线计算和选择。即仍按照现在的路况计算并推荐路线,但将增加返回该路线在其他时间的耗时。详细说明 | string | 选填 | 不填则不返回ext_duration字段 注意:该功能为高级付费服务,需通过工单联系工作人员开通 |
| expect_arrival_time | 预期的到达时间,UNIX时间戳。 该字段将影响suggest_departure_time字段的返回,用于返回建议出发时间。取值范围:当前时间之后15分钟的任意时刻(小于这个时间则不做处理) 若设置此参数,则路线规划服务将依据设定时间计算路线和耗时,并给出建议出发时间 若算出的suggest_departure_time小于当前时间,则设置suggest_departure_time为-1。详细说明 | string | 选填 | 不填则不返回ext_duration字段 注意:该功能为高级付费服务,需通过工单联系工作人员开通 |
| gps_direction | 起点的车头方向。 字段类型:int64 取值范围:0-359 | int | 选填 | 车头方向为与正北方向顺时针夹角,该参数用于辅助判断起点所在正逆向车道,提高算路准确率。 当speed大于1.5米/秒且gps_direction存在时,采用该方向。gps_direction并不代表需填写从gps获取的方向,可以填入校正后的方向。请填写尽量准确的方向,其准确性很大程度决定了计算的精度。 |
| radius | 起点的定位精度,字段类型:float,取值范围[0,2000] | float | 选填 | 配合gps_direction字段使用 |
| speed | 起点车辆的行驶速度,字段类型:float | float | 选填 | 单位:米/秒,配合gps_direction字段使用,当speed大于1.5米/秒且gps_direction存在时,采用gps_direction的方向。 |
| output | 表示输出类型,可设置为xml或json | string | 选填 | 默认为json |
| sn | 用户的权限签名,当AK设置为SN校验时,该参数必填 SN计算方法 | string | 选填 | |
| timestamp | 时间戳,与SN配合使用 | int64 | SN存在时必填 | |
| callback | 回调函数 | string | 选填 | 仅在output=json时,该参数有效 |
| intelligent_plan | 传入多个途经点,综合考虑路况、交规限行、 途经点的相对位置以及路线整体的绕路成本等,支持智能调整途经点顺序,给出最优路线。可选值: 0(默认值):不执行途经点智能规划 1:执行途经点智能规划。详细说明 | int | 选填 | 默认0:不执行途经点智能规划 注意:该功能为高级付费服务,需通过工单联系工作人员开通 |
| walkinfo | 起终点步导路线 | int | 选填 | 1 表示下发起终点步导路线; 0 不下发起终点步导路线; 默认值为0 |
| steps_info | 是否下发step详情 1:下发step详情 0:不下发step详情 | int | 选填 | |
| origin_bind_stategy | 起点绑路策略 0-起点绑路不剔除封闭道路 1-起点绑路剔除封闭道路 | int | 选填 | 默认值0 |
| dest_bind_stategy | 终点绑路策略 0-终点绑路不剔除封闭道路 1-终点绑路剔除封闭道路 | int | 选填 | 默认值0 |
| origin_road_type | 起点道路类型, 0 普通道路[默认。绑路策略不参考此入参]; 1高架上;2高架下;3主路;4辅路;(高速和匝道切换其实相当于主辅路切换) | int | 选填 | 默认值0 |
4、响应参数
| 字段名称 | 字段含义 | 字段类型 | 备注 | ||||
|---|---|---|---|---|---|---|---|
| status | 状态码 | int | 0:成功 1:服务内部错误 2:参数无效 7:无返回结果 | ||||
| message | 状态码对应的信息 | string | |||||
| type | 默认返回2,开发者无需关注 | int | |||||
| result | 返回的结果 | ||||||
| restriction | 限行结果提示信息 若无限行路线,则返回空 若无法规避限行,则返回限行提示信息 | string | |||||
| total | 返回方案的总数 | int | |||||
| routes | 返回的方案集 | 若请求参数设置了符合规则的departure_time,则按照设定时间的预测路况和限行规则计算路线。 若未设置departure_time,则按照当前时刻的路况和限行规则计算路线 | |||||
| restriction_info | |||||||
| status | 限行状态 | int | 取值范围【0,3】 0:无限行 1:已规避限行, 路线合法 2:无法规避限 行,路线非法 3:疫情相关的信息 | ||||
| desc | 限行提示语 | string | 当限行status为1或 2时,会有相应的 限行描述信息。 若该路线有多条 提示信息,则以 英文竖线分隔符 分隔,如: "已为您避开北京 限行区域" "无法为您避开北 京限行区域,请 合理安排出行" "起点在北京限行 区域,请合理安 排出行" "终点在北京限行 区域,请合理安 排出行" "起点在北京限行 区域,请合理安 排出行|终点在北 京限行区域,请 合理安排出行" | ||||
| origin | |||||||
| lng | 起点经度 | double | |||||
| lat | 起点纬度 | double | |||||
| destination | |||||||
| lng | 终点经度 | double | |||||
| lat | 终点纬度 | double | |||||
| tag | 方案标签 | string | |||||
| traffic_light | 红绿灯数量 | int | |||||
| route_id | 如无特殊需要,开发者无需关注 | string | |||||
| distance | 方案距离,单位:米 | int | |||||
| duration | 未来驾车路线耗时,单位:秒 | int | 若请求参数设置了符合规则的departure_time,则按照设定出发时间的预测路况计算路线耗时。 若未设置departure_time,则按照当前时刻的路况计算路线耗时 注意:该功能为高级付费服务,需通过工单联系工作人员开通 | ||||
| ext_duration | 驾车路线历史耗时(扩展),单位:秒 | int | 若设置了请求参数ext_departure_time,则返回该字段; 若ext_departure_time设置了一个或多个出发时间则以英文半角逗号","分隔返回多个扩展耗时; 若扩展耗时计算失败,则返回-1。 注意:该功能为高级付费服务,需通过工单联系工作人员开通 | ||||
| suggest_departure_time | 建议出发时间,单位:秒 | int64 | 若请求参数设置了符合规则的expect_arrival_time,则按照预计到达时间预测路况计算路线,并给出建议出发时间。 若算出的suggest_departure_time小于当前时间,则设置 suggest_departure_time为-1。 注意:该功能为高级付费服务,需通过工单联系工作人员开通 | ||||
| taxi_fee | 出租车费用,单位:元 | int | |||||
| toll | 此路线道路收费,单位:元 | int | 此高速费为预估价格,与实际高速收费并不完全一致 | ||||
| toll_distance | 收费路段里程,单位:米 | int | |||||
| steps | array | 路线分段 | |||||
| leg_index | 途径点序号 | int | 途径点序号为从0开始的整数,用于标识step所属的途径点路段如:若该step属于起点至第一个途径中的路段,则其leg_index为0 | ||||
| direction | 进入道路的角度 | int | 枚举值,返回值在0-11之间的一个值,共12个枚举值,以30度递进,即每个值代表角度范围为30度;其中返回"0"代表345度到15度,以此类推,返回"11"代表315度到345度";分别代表的含义是:0-[345°-15°];1-[15°-45°];2-[45°-75°];3-[75°-105°];4-[105°-135°];5-[135°-165°];6-[165°-195°];7-[195°-225°];8-[225°-255°];9-[255°-285°];10-[285°-315°];11-[315°-345°] 注:角度为与正北方向顺时针夹角 | ||||
| distance | step的距离信息 | int | 单位米 | ||||
| road_name | 分段的道路名称 | string | 如"信息路" 若道路未命名或百度地图未采集到该道路名称,则返回"无名路" | ||||
| road_type | 分段的道路类型 | int | 枚举值:返回0-9之间的值 0:高速路 1:城市高速路 2:国道 3:省道 4:县道 5:乡镇村道 6:其他道路 7:九级路 8:航线(轮渡) 9:行人道路 | ||||
| toll | 分段道路收费, 单位:元 | int | 因一个收费路段可能覆盖多个step,部分情况下费用无法按step准确拆分,故分段step收费可能存在不准确情况 | ||||
| toll_distance | 分段道路收费路程,单位:米 | int | |||||
| toll_gate_name | 收费站名称 | string | 只有在进收费站和出收费站时才有 | ||||
| toll_gate_location | |||||||
| lng | 收费站位置:经 度 | double | 只有在进收费站和出收费站时才有 | ||||
| lat | 收费站位置:纬 度 | double | 只有在进收费站和出收费站时才有 | ||||
| start_location | |||||||
| lng | 分段起点经度 | double | |||||
| lat | 分段起点纬度 | double | |||||
| end_location | |||||||
| lng | 分段终点经度 | double | |||||
| lat | 分段终点纬度 | double | |||||
| path | 分段坐标 | string | |||||
| adcodes | 分段途经的城市 编码 | string | 若途经多个城 市,则adcode以英 文半角逗号相隔 如: 110000,120000 | ||||
| traffic_condition | 分段路况详情 | array | |||||
| status | 路况指数 | int | 0: 无路况 1: 畅通 2: 缓行 3: 拥堵 4: 非常拥堵 | ||||
| geo_cnt | 从当前坐标点开 始,path中路况相 同的坐标点个数 | int | |||||
| distance | 距离,从当前坐 标点开始path 中 路况相同的距 离,单位:米 | float | 注:单条线路中 所有distance的和 会与route的 distance字段存在 差异,不是完全 一致 | ||||
| end_walkinfo | 终点步导路线 | array | |||||
| distance | 终点步导路线距离 | int | 单位米 | ||||
| path | 终点步导路线坐标点 | string | |||||
| start_walkinfo | 起点步导路线 | array | |||||
| distance | 起点步导路线距离 | int | 单位米 | ||||
| path | 起点步导路线坐标点 | string |
二、UniHttp接口访问集成
这里我们使用UniHttp来简化Http服务调用,关于如何快速集成UniHttp,在博主之前的系列博客中均有所涉及,如果想了解更多使用教程,可以查询官网,也可以私信留言。这里仅详细说明如何进行访问接口的创建和本地接口的创建和集成。本节是实际的进行接口调用,并且返回相应的结果实战。
1、访问接口创建
java
package com.yelang.project.thridinterface;
import com.burukeyou.uniapi.http.annotation.param.QueryPar;
import com.burukeyou.uniapi.http.annotation.request.GetHttpInterface;
import com.burukeyou.uniapi.http.core.response.HttpResponse;
import com.yelang.project.thridinterface.apiprocessor.BaiduHttpApi;
/**
* - 百度驾车路径规划服务2.0版本
* @author 夜郎king
*
*/
@BaiduHttpApi(snMode = false)
public interface BaiduDrivingV2Service {
@GetHttpInterface(path = "/direction/v2/driving")
/**
* - 驾车路线规划
* @param ak 用户的访问权限,AK申请
* @param origin - 起点经纬度,小数点后不超过6位,40.056878,116.30815
* @param destination -终点经纬度,小数点后不超过6位,40.056878,116.30815
* @param coordType - 坐标类型,可选参数,默认为bd09ll。允许的值为:bd09ll(百度经纬度坐标)、bd09mc(百度墨卡托坐标)、gcj02(国测局加密坐标)、wgs84(gps设备获取的坐标)。
* @param retCoordtype 返回结果坐标类型,默认为bd09ll,允许的值为:bd09ll(百度经纬度坐标)、gcj02(国测局加密坐标)
* @param tactics 0:默认、2:距离最短(只返回一条路线,不考虑限行和路况,距离最短且稳定,用于估价场景)
* 3:不走高速、4:高速优先、5:躲避拥堵、6:少收费、7: 躲避拥堵 & 高速优先
* 8: 躲避拥堵 & 不走高速、9: 躲避拥堵 & 少收费、10: 躲避拥堵 & 不走高速 & 少收费
* 11: 不走高速 & 少收费、12: 距离优先(考虑限行和路况,距离相对短且不一定稳定)、13:时间优先
* @param alternatives 是否返回备选路线,类型:string。选值:0:返回一条推荐路线 1:返回1-3条路线供选择
* @param cartype 车辆类型,区分车辆是普通燃油车或纯电动汽车。由于部分城市对燃油车和电动车限行规则有差异,该字段用于结合plate_number车牌号来规避限行。例如:纯电动汽车在北京本地无尾号限行,而燃油车需遵守尾号限行。可选值:0:普通汽车、1:纯电动汽车
* @param speed 起点车辆的行驶速度,字段类型:float
* @param stepsInfo 是否下发step详情。1:下发step详情 0:不下发step详情
* @return
*/
public HttpResponse<String> getSearch(@QueryPar("ak") String ak, @QueryPar("origin") String origin,
@QueryPar("destination") String destination, @QueryPar("coord_type") String coordType,
@QueryPar("ret_coordtype") String retCoordtype, @QueryPar("tactics") int tactics,
@QueryPar("alternatives") int alternatives, @QueryPar("cartype") int cartype,
@QueryPar("speed") float speed, @QueryPar("steps_info") int stepsInfo
);
}
以上参数是根据业务的需求进行定义的,除必填的参数以外,很多选填的参数是可以不定义,直接使用默认值即可。
2、本地调用测试
下面我们以从广东省广州市为起点,驾车开往贵州省铜仁市为例,车速选择匀速100公里,车型为普通油车、需要返回备选路线、并且返回下发详情的实例进行接口请求。这里我们使用Junit的方式进行集成,核心代码如下:
java
package com.yelang.project.unihttp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.burukeyou.uniapi.http.core.response.HttpResponse;
import com.yelang.common.utils.StringUtils;
import com.yelang.project.thridinterface.BaiduDrivingV2Service;
/**
* - 百度地图驾车服务测试类
* @author 夜郎king
*
*/
@SpringBootTest
@RunWith(SpringRunner.class)
public class BaiduDrivingV2ServiceCase {
private static final String BAIDU_CLIENT_AK = "yourak";
@Autowired
private BaiduDrivingV2Service drivingService;
@Test
public void testDriving() {
String origin = "23.115102,113.269043";//出发地:广东省广州市
String destination = "27.728514,109.186249";//目的地:贵州省铜仁市
String coordType = "wgs84";
String retCoordtype = "bd09ll";//返回坐标类型,请跟入参的坐标类型有所区别,返回坐标不支持WGS84
int tactics = 0;//默认距离最短
int alternatives = 1;//1表示返回1-3条备选路线
int cartype = 0;//普通油车
float speed = 27.78F;//100千米/小时 ≈ 27.78米/秒
int stepsInfo = 1;//下发详情
HttpResponse<String> result = drivingService.getSearch(BAIDU_CLIENT_AK, origin, destination, coordType, retCoordtype, tactics, alternatives, cartype, speed, stepsInfo);
System.out.println(result.getBodyResult());
}
}
3、响应对象初探
在本地IDE中运行以上程序后,可以看到以下输出:

在文本编辑器中对返回数据进行json格式化后,可以看到如下结构:

这个结构很重要,这个结构是我们下一步进行Java对象封装的重要参考资料。
三、响应对象的Java封装
通过上一节,我们已经成功的获取到了百度地图开放平台返回的路径规划结果,数据格式是json,在实际业务中,我们需要使用Java来进行数据的持久化或者数据挖掘,因此需要将json反序列化成JavaBean。这里分别介绍响应类图、以及相应的实现,最后基于GSON来进行对象转换说明。
1、驾车路线服务响应类图
根据前面的响应参数介绍以及在上一小节的真实响应对象的研究,我们大致对返回对象有了一个初印象。整理成如下类图:

根据业务的需要,为了完整的业务数据还原,这里设计11个类来对百度地图的路线规划服务接口返回数据进行接收。
2、响应对象实现
a、公共属性类
公共对象是所有百度公共接口的父类,用来定义响应数据的公共属性,定义如下:
java
package com.yelang.project.meteorology.domain;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* - 百度接口公共DTO对象,用于封装通用信息
* @author 夜郎king
*/
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class BdCommonDTO implements Serializable {
private static final long serialVersionUID = 4985268844473756688L;
private int status;//状态码 本次API访问状态,如果成功返回0,如果失败返回其他数字。
private String message;//响应信息 对status的中文描述
}
b、驾车路线数据传输类
驾车路线数据传输类封装了规划的路线信息,核心代码如下:
java
package com.yelang.project.meteorology.domain.baidudto;
import java.io.Serializable;
import com.yelang.project.meteorology.domain.BdCommonDTO;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString(callSuper=true)//callSuper=true表示输出父类属性
@EqualsAndHashCode(callSuper=true)
public class BdDrivingDTO extends BdCommonDTO implements Serializable{
private static final long serialVersionUID = 5055488530865458258L;
private Integer type;//默认返回2,开发者无需关注
private BdDrivingResultDTO result;
}
c、导航信息类
导航信息类包含了分段信息、方案总数、具体的方案路线信息,核心代码如下:
java
package com.yelang.project.meteorology.domain.baidudto;
import java.io.Serializable;
import java.util.List;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class BdDrivingResultDTO implements Serializable{
private static final long serialVersionUID = 6407644142297216118L;
private String restriction;//限行结果提示信息,若无限行路线,则返回空,若无法规避限行,则返回限行提示信息
private int total;//返回方案的总数
@SerializedName("navi_restype")
private String naviRestype;
@SerializedName("session_id")
private String sessionId;
private List<BdDrivingRouteDTO> routes;
private String holiday;
@SerializedName("ret_coordtype")
private String retCoordtype;
@SerializedName("api_restype")
private String apiRestype;
}
d、具体路线分段信息类
具体路线分段信息类,封装了路线详情、距离、打车费用预估、预计时间和具体的转折路线列表,核心代码如下:
java
package com.yelang.project.meteorology.domain.baidudto;
import java.io.Serializable;
import java.util.List;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class BdDrivingRouteDTO implements Serializable{
private static final long serialVersionUID = -2475019111446934340L;
private BdLocationDTO origin;
private BdLocationDTO destination;
private String tag;//方案标签
private String mrsl;
@SerializedName("route_md5")
private String routeMd5;
@SerializedName("data_version")
private String dataVersion;
@SerializedName("traffic_light")
private int trafficLight;
private float distance;//距离,单位米
private int duration;//未来驾车路线耗时,单位:秒
@SerializedName("taxi_fee")
private float taxiFee;
@SerializedName("has_guidance")
private boolean hasGuidance;
private List<BdDrivingStepDTO> steps;//路线分段集合
@SerializedName("restriction_info")
private BdDrivingRestrictionInfoDTO restrictionInfo;
@SerializedName("yellow_tip")
private List<BdDrivingYelloTipDTO> yellowTipList;
private int toll;//此路线道路收费,单位:元
@SerializedName("toll_distance")
private float tollDistance;
private float score;
@SerializedName("route_id")
private String routeId;
}
篇幅有限,如果百度驾车路径规划完整响应类的代码,可以参考上述的结果先自己研究,如有问题,可以私信博主就具体的类进行交流。
3、使用GSON转换实例
最后我们将百度开放平台返回的JSON数据转换成Java对象,转换框架这里以Gson为例,其它的json框架也是可以的。转换代码如下:
java
Gson gson = new Gson();
if(StringUtils.isNotEmpty(result.getBodyResult())) {
BdDrivingDTO drivingDTO = gson.fromJson(result.getBodyResult(), BdDrivingDTO.class);
System.out.println(drivingDTO);
System.out.println("---------------------------");
System.out.println(gson.toJson(drivingDTO));
}
运行程序后,可以看到正常的数据输出。后续我们可以基于此和其他应用的结合。
四、常见问题
在百度驾车路线规划服务集成过程中,可能会遇到一些问题。比如我在集成过程中就遇到了关于坐标精度和坐标和格式的问题。导致这个问题的原因主要还是对官网文档不是很熟悉,实践出真知,纸上得来终觉浅,只有经过实战才知道可能会遇到什么问题。
1、坐标顺序问题
众所周知,在地理位置中,经纬度是描述一个点的具体格式。因此我们特别习惯在描述一个点时,使用(经度,纬度)的方式,如:113.269043,23.115102。但是这种方式在实际查询过程中会报以下错误:

解决的办法也比较简单,在百度的位置描述中,将纬度描述在前,即(纬度,经度)即可。
2、坐标格式问题
坐标类型永远是GIS应用中绕不开的话题,大家可能都以为通用的WGS84,在接口的参数定义中,我们可以看到,查询参数的坐标是支持WGS84的,但是在返回的坐标中,却没有了这个参数支持。如果在返回参数中设置了WGS84,大概率是会报错的,如下图所示:

解决办法就是按照文档调整参数设置即可。
五、总计
内容很长,感谢各位辛苦看到最后,以上就是本文的主要内容。本文将以Java编程语言为例,详细的对百度地图开放平台的驾车路线规划服务进行介绍,不仅详细的介绍其API和请求响应参数,同时还以Java为例,讲解如何对平台返回的对象进行对应的封装,通过自定义封装的结果。可以为后续的数据持久化和数据挖掘分析提供坚实的数据基础。文章首先详细的介绍百度地图的驾车路线服务,包括接口请求参数和响应参数。然后详细介绍在Java当中如何集成路径规划服务,并且将官方的JSON转换成我们的JavaBean。受限于文章篇幅,很多代码和内容不能逐一展示,如对其中内容有疑问,可以留言或者私信交流。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。