驾车/货车路线规划 最后更新时间: 2021年01月22日
基本介绍
根据出发地、目的地、途经地以及路径策略设置,为用户量身设计出行方案。同时可结合实时交通,帮助用户绕开拥堵路段,提供更贴心、更人性化的驾车出行体验。要实现驾车、货车路径规划功能,以下两个类您需要了解:
- AMapNavi :此类是导航功能管理类,提供路线规划、行前选路、导航中重算等方法。它是一个单例,通过getInstance方法获取该单例,通过destroy方法来销毁该单例。
- AMapNaviListener:此类是导航事件信息与数据协议类,提供算路导航过程中的事件(如:路径规划成功/失败、TTS字符串、GPS信号弱、到达目的地等)以及实时数据(如:诱导信息NaviInfo、定位信息、电子眼信息等)回调接口。
说明
- 路径规划功能需要联网使用
- 起终点信息可通过多种方式获取,如:使用坐标拾取器查询您需要的点的坐标;还可以通过搜索 SDK 中的 POI 搜索查询兴趣点,作为起终点。
- 从导航 SDK V5.0.0 版本起最多支持设置 16 个途经点,注意:导航组件最多支持设置3个途径点。
- 路径的计算策略包含单一策略和多策略,通过多策略,可计算出多条规划路径,需要通过 AMapNavi 的 getNaviPaths 方法获取这些路径。
1. 算路策略
导航SDK提供21种驾车策略,分成两种类型:返回单一路径的策略和返回多条路径的策略,对应PathPlanningStrategy 枚举。
策略ID |
常量字段 |
策略描述 |
---|---|---|
0 | DRIVING_DEFAULT | 速度优先,不考虑当时路况,返回耗时最短的路线,但是此路线不一定距离最短 |
1 | DRIVING_SAVE_MONEY | 费用优先,不走收费路段,且耗时最少的路线 |
2 | DRIVING_SHORTEST_DISTANCE | 距离优先,不考虑路况,仅走距离最短的路线,但是可能存在穿越小路/小区的情况 |
3 | DRIVING_NO_EXPRESS_WAYS | 速度优先,不走快速路,例如京通快速路(因为策略迭代,建议使用13) |
4 | DRIVING_AVOID_CONGESTION | 躲避拥堵,但是可能会存在绕路的情况,耗时可能较长 |
5 | DRIVING_MULTIPLE_PRIORITY_SPEED_COST_DISTANCE | 多策略(同时使用速度优先、费用优先、距离优先三个策略计算路径)。其中必须说明,就算使用三个策略算路,会根据路况不固定的返回一到三条路径规划信息 |
6 | DRIVING_SINGLE_ROUTE_AVOID_HIGHSPEED | 速度优先,不走高速,但是不排除走其余收费路段 |
7 | DRIVING_SINGLE_ROUTE_AVOID_HIGHSPEED_COST | 费用优先,不走高速且避免所有收费路段 |
8 | DRIVING_SINGLE_ROUTE_AVOID_CONGESTION_COST | 躲避拥堵和收费,可能存在走高速的情况,并且考虑路况不走拥堵路线,但有可能存在绕路和时间较长 |
9 | DRIVING_SINGLE_ROUTE_AVOID_HIGHSPEED_COST_CONGESTION | 躲避拥堵和收费,不走高速 |
10 | DRIVING_MULTIPLE_ROUTES_DEFAULT | 返回结果会躲避拥堵,路程较短,尽量缩短时间,与高德地图的默认策略(也就是不进行任何勾选)一致 |
11 | DRIVING_MULTIPLE_SHORTEST_TIME_DISTANCE | 返回三个结果包含:时间最短;距离最短;躲避拥堵(由于有更优秀的算法,建议用10代替) |
12 | DRIVING_MULTIPLE_ROUTES_AVOID_CONGESTION | 返回的结果考虑路况,尽量躲避拥堵而规划路径,与高德地图的“躲避拥堵”策略一致 |
13 | DRIVING_MULTIPLE_ROUTES_AVOID_HIGHSPEED | 返回的结果不走高速,与高德地图“不走高速”策略一致 |
14 | DRIVING_MULTIPLE_ROUTES_AVOID_COST | 返回的结果尽可能规划收费较低甚至免费的路径,与高德地图“避免收费”策略一致 |
15 | DRIVING_MULTIPLE_ROUTES_AVOID_HIGHSPEED_CONGESTION | 返回的结果考虑路况,尽量躲避拥堵而规划路径,并且不走高速,与高德地图的“躲避拥堵&不走高速”策略一致 |
16 | DRIVING_MULTIPLE_ROUTES_AVOID_HIGHTSPEED_COST | 返回的结果尽量不走高速,并且尽量规划收费较低甚至免费的路径结果,与高德地图的“避免收费&不走高速”策略一致 |
17 | DRIVING_MULTIPLE_ROUTES_AVOID_COST_CONGESTION | 返回路径规划结果会尽量的躲避拥堵,并且规划收费较低甚至免费的路径结果,与高德地图的“躲避拥堵&避免收费”策略一致 |
18 | DRIVING_MULTIPLE_ROUTES_AVOID_HIGHSPEED_COST_CONGESTION | 返回的结果尽量躲避拥堵,规划收费较低甚至免费的路径结果,并且尽量不走高速路,与高德地图的“避免拥堵&避免收费&不走高速”策略一致 |
19 | DRIVING_MULTIPLE_ROUTES_PRIORITY_HIGHSPEED | 返回的结果会优先选择高速路,与高德地图的“高速优先”策略一致 |
20 | DRIVING_MULTIPLE_ROUTES_PRIORITY_HIGHSPEED_AVOID_CONGESTION | 返回的结果会优先考虑高速路,并且会考虑路况躲避拥堵,与高德地图的“躲避拥堵&高速优先”策略一致 |
您可以使用以上表格中的策略值进行直接算路,若您想实现和高德地图一样的 checkbox 选项,那么建议您直接使用我们封装的AMapNavi中的strategyConvert 方法来获取策略值。
方法名 |
参数说明 |
返回值说明 |
方法效果 |
备注 |
---|---|---|---|---|
strategyConvert |
avoidCongestion:是否躲避拥堵 avoidHighway:是否不走高速 avoidCost:是否避免收费 prioritiseHighway:是否高速优先 multipleRoute: 单路径or多路径,6.3版本以后该参数已经无效,统一使用多路线算路。 | int | 进行算路策略转换,将传入的特定规则转换成 PathPlanningStrategy 的枚举值。 | 不走高速与高速优先不能同时为true。 高速优先与避免收费不能同时为true。 |
2. 经纬度算路
传入起、终点的经纬度信息,来进行路线规划。
示例代码:
// 获取导航Manager
AMapNavi mAMapNavi = AMapNavi.getInstance(this);
// 起点信息
List<NaviLatLng> startList = new ArrayList<NaviLatLng>();
startList.add(new NaviLatLng(39.993308,116.473199));
// 终点信息
List<NaviLatLng> endList = new ArrayList<NaviLatLng>();
endList.add(new NaviLatLng(39.917834, 116.397036));
// 经纬度算路
mAMapNavi.calculateDriveRoute(startList, endList, null, PathPlanningStrategy.DRIVING_MULTIPLE_ROUTES_DEFAULT);
3. POI 算路
传入起、终点的POI信息,来进行路线规划。位置的POI信息可以通过高德开放平台提供的poi搜索服务来获取。
示例代码:
AMapNavi mAMapNavi = AMapNavi.getInstance(this);
// 起点信息
NaviPoi start = new NaviPoi("龙城花园", null, "B000A8UF3J");
// 终点信息
NaviPoi end = new NaviPoi("北京大学", null, "B000A816R6");
// POI算路
mAMapNavi.calculateDriveRoute(start, end, null, PathPlanningStrategy.DRIVING_MULTIPLE_ROUTES_DEFAULT);
说明:POI算路中,NaviPoi对象内也可以传入经纬度信息,优先使用POIID,如果POIID无效,则使用经纬度算路。
4. 起点角度算路
在POI算路中,支持通过NaviPoi对象传入自定义的起点角度,根据不同的出发角度规划出对应合理的路线。需要注意的是,想要使用自定义的起点角度来算路时,则不能使用poiId,且需要传入经纬度信息与合法的角度值。
示例代码:
AMapNavi mAMapNavi = AMapNavi.getInstance(this);
// 起点信息
NaviPoi start = new NaviPoi("龙城花园", new LatLng(39.993308,116.473199), "");
// 设置起点角度
start.setDirection(35);
// 终点信息
NaviPoi end = new NaviPoi("北京大学", new LatLng(39.917834, 116.397036), "");
// POI算路
mAMapNavi.calculateDriveRoute(start, end, null, PathPlanningStrategy.DRIVING_MULTIPLE_ROUTES_DEFAULT);
5. 设置车辆信息
支持在算路前,通过相关接口设置车辆信息,包括车牌号、车型、货车宽高载重,以及算路时是否躲避限行等,充分考虑车牌限号、ETA限行、限高限重等车辆因素给路线规划带来的影响,计算出最合理的行驶路线,为出行带来便捷。
示例代码:
// 构建车辆信息
AMapCarInfo carInfo = new AMapCarInfo();
carInfo.setCarNumber("京C123456");
carInfo.setRestriction(true);
AMapNavi mAMapNavi = AMapNavi.getInstance(this);
// 设置车辆信息
mAMapNavi.setCarInfo(carInfo);
// 算路
NaviPoi start = new NaviPoi("龙城花园", null, "B000A8UF3J");
NaviPoi end = new NaviPoi("北京大学", null, "B000A816R6");
mAMapNavi.calculateDriveRoute(start, end, null, PathPlanningStrategy.DRIVING_MULTIPLE_ROUTES_DEFAULT);
说明:具体配置参数含义,请参考官方文档。
6. 途经点算路
从导航 SDK V5.0.0 版本起最多支持设置 16 个途经点的路线规划。
示例代码:
AMapNavi mAMapNavi = AMapNavi.getInstance(this);
// 起点信息
NaviPoi start = new NaviPoi("龙城花园", null, "B000A8UF3J");
// 终点信息
NaviPoi end = new NaviPoi("北京大学", null, "B000A816R6");
// 途经点信息
List<NaviPoi> waysPoiIds = new ArrayList<NaviPoi>();
waysPoiIds.add(new NaviPoi("途经点1", null, "B000A805M7"));
waysPoiIds.add(new NaviPoi("途经点2", null, "B0FFFAADBU"));
waysPoiIds.add(new NaviPoi("途经点3", null, "B0FFF5BER7"));
// POI算路
mAMapNavi.calculateDriveRoute(start, end, waysPoiIds, PathPlanningStrategy.DRIVING_MULTIPLE_ROUTES_DEFAULT);
货车路线规划
从导航SDK v6.0.0版本开始,全面支持货车算路和导航功能。其中主要区别于驾车的部分,就是在货车的路径规划策略中,会将货车特有的限高、限重、车型等信息加入到路径规划策略中进行计算。
特别注意:货车路径规划是收费接口,您如果申请试用或者正式应用都请通过工单系统提交商务合作类工单进行沟通,否则默认是无法算路成功的。
货车的算路接口和驾车都是一样的,SDK是通车辆信息来区别是否为货车的。AMapCarInfo的 CarType 为1\3\5时都为货车。
// 构建车辆信息
AMapCarInfo carInfo = new AMapCarInfo();
carInfo.setCarNumber("京C123456"); //设置车牌号
carInfo.setCarType("1"); //设置车辆类型,0:小车; 1:货车. 默认0(小车).
carInfo.setVehicleAxis("6"); //设置货车的轴数,mCarType = 1时候生效,取值[0-255],默认为2
carInfo.setVehicleHeight("3.56"); //设置货车的高度,单位:米,mCarType = 1时候生效,取值[0-25.5],默认1.6米
carInfo.setVehicleLength("7.3"); //设置货车的最大长度,单位:米,mCarType = 1时候生效,取值[0-25],默认6米
carInfo.setVehicleWidth("2.5"); //设置货车的最大宽度,单位:米,mCarType = 1时候生效,取值[0-25.5],默认2.5米
carInfo.setVehicleSize("4"); //设置货车的大小,1-微型货车 2-轻型/小型货车 3-中型货车 4-重型货车,默认为2
carInfo.setVehicleLoad("25.99"); //设置货车的总重,即车重+核定载重,单位:吨,mCarType = 1时候生效,取值[0-6553.5]
carInfo.setVehicleWeight("20"); //设置货车的核定载重,单位:吨,mCarType = 1时候生效,取值[0-6553.5]
carInfo.setRestriction(true); //设置是否躲避车辆限行,true代表躲避车辆限行,false代表不躲避车辆限行,默认为true
carInfo.setVehicleLoadSwitch(true); //设置货车重量是否参与算路,true-重量会参与算路;false-重量不会参与算路。默认为false
AMapNavi mAMapNavi = AMapNavi.getInstance(this);
// 设置车辆信息
mAMapNavi.setCarInfo(carInfo);
注意,务必在算路前进行车辆信息的设置,否则需要等到下次算路才生效。
处理结果
当路线规划成功时,会触发 AMapNaviListener 的 onCalculateRouteSuccess 回调,在该回调函数中,可以获取路线对象,进行规划路线的显示:
@Override
public void onCalculateRouteSuccess(AMapCalcRouteResult routeResult) {
// 获取路线数据对象
HashMap<Integer, AMapNaviPath> naviPaths = AMapNavi.getInstance(this).getNaviPaths();
// 绘制显示路径
...
}
也可以直接开启导航:
@Override
public void onCalculateRouteSuccess(AMapCalcRouteResult routeResult) {
// 开启导航
AMapNavi.getInstance(this).startNavi(NaviType.GPS);
}
如果路线规划失败,则会触发 AMapNaviListener 的 onCalculateRouteFailure 回调,可以在此回调中来执行相应处理逻辑