驾车/货车路线规划 最后更新时间: 2021年01月22日
基本介绍
根据出发地、目的地、途经地以及路径策略设置,为用户量身设计出行方案。同时可结合实时交通,帮助用户绕开拥堵路段,提供更贴心、更人性化的驾车出行体验。要实现驾车、货车路径规划功能,以下三个类您需要了解:
- AMapNaviDriveManager是驾车/货车导航管理类,提供路线规划、行前选路、导航中重算等方法。注意:从导航SDK5.4.0开始,AMapNaviDriveManager的init方法已被禁止使用,请使用单例[AMapNaviDriveManager sharedInstance]替代,且在调用类的dealloc函数里或其他适当时机(如导航ViewController被pop时),调用[AMapNaviDriveManager destroyInstance]来销毁单例(需要注意如未销毁成功,请检查单例是否被强引用)
- <AMapNaviDriveManagerDelegate> 是驾车/货车导航管理协议类,提供算路导航过程中的事件(如:路径规划成功/失败、TTS字符串、GPS信号弱、到达目的地等)回调接口。
- <AMapNaviDriveDataRepresentable> 是驾车/货车导航数据协议类,提供算路导航过程中的实时数据(如:诱导信息NaviInfo、定位信息、电子眼信息等)回调接口。
说明:
- 路径规划功能需要联网使用
- 起终点信息可通过多种方式获取,如:使用坐标拾取器查询您需要的点的坐标;还可以通过搜索SDK中的POI 搜索查询兴趣点,作为起终点。
- 从导航SDKV5.0.0版本起最多支持设置16个途经点,注意:导航组件最多支持设置3个途径点。
- 提供四种驾车路线规划的方法,如下表所示:
方法名 | 参数说明 | 返回值说明 | 方法效果 |
---|---|---|---|
calculateDriveRouteWithEndPoints:wayPoints:drivingStrategy: | endPoints:终点坐标; wayPoints:途经点坐标; strategy:路径的计算策略; | BOOL,表示规划路径所需条件和参数校验是否成功,不代表算路是否成功。 | 终点为经纬度的无起点驾车/货车路径规划。(内部取当前定位作为起点) |
calculateDriveRouteWithStartPoints:endPoints:wayPoints:drivingStrategy: | startPoints:起点坐标; endPoints:终点坐标; wayPoints:途经点坐标; strategy:路径的计算策略; | BOOL,表示规划路径所需条件和参数校验是否成功,不代表算路是否成功。 | 起终点为经纬度的驾车/货车路径规划。 |
calculateDriveRouteWithStartPointPOIId:endPointPOIId:wayPointsPOIId:drivingStrategy: | startPOIId:起点POIId; endPOIId:终点POIId; wayPOIIds:途经点POIId; strategy:路径的计算策略; | BOOL,表示规划路径所需条件和参数校验是否成功,不代表算路是否成功。 | 根据高德POIId进行驾车/货车路径规划,为了保证路径规划的准确性,请尽量使用此方法 |
calculateDriveRouteWithStartPOIInfo:endPOIInfo:wayPOIInfos:drivingStrategy: | startPOIInfo:起点POIInfo; endPOIInfo:终点POIInfo; wayPOIInfos:途经点POIInfo; strategy:路径的计算策略; | BOOL,表示规划路径所需条件和参数校验是否成功,不代表算路是否成功。 | 根据高德POIInfo进行驾车路径规划,为了保证路径规划的准确性,请尽量使用此方法 |
- 推荐使用-calculateDriveRouteWithStartPOIInfo:endPOIInfo:wayPOIInfos:drivingStrategy: 方法进行路径规划,SDK内部会根据POIId或者 startPOIInfo.startAngle,自动补全其他信息,从而规划出更合理的路线,有效减少绕路的出现。
- 路径的计算策略包含单一策略和多策略,通过多策略,可计算出多条规划路径,需要通过AMapNaviDriveManager的naviRoutes方法获取这些路径。
起点角度算路
根据高德POIInfo进行驾车路径规划的方法是支持传入起点角度来避免抓路方向错误,将路线的起点误认为是马路对面。
///高德POI信息 since 6.4.0
@interface AMapNaviPOIInfo : NSObject <NSCopying>
///POI的id
@property (nonatomic, copy) NSString *mid;
///POI的坐标点
@property (nonatomic, strong) AMapNaviPoint *locPoint;
///车头方向角度, 默认为-1, 0为正北, 顺时针方向增加. 注意:mid == nil && locPoint != nil && startAngle >=0 才起作用. since 6.6.0
@property (nonatomic, assign) double startAngle;
@end
AMapNaviPOIInfo *startInfo = [[AMapNaviPOIInfo alloc] init];
startInfo.locPoint = [AMapNaviPoint locationWithLatitude:39.913578 longitude:116.473565];
startInfo.startAngle = 270;
AMapNaviPOIInfo *endInfo = [[AMapNaviPOIInfo alloc] init];
endInfo.locPoint = [AMapNaviPoint locationWithLatitude:40.095326 longitude:116.341895];
endInfo.mid = @"B000A8UIN8";
[[AMapNaviDriveManager sharedInstance] calculateDriveRouteWithStartPOIInfo:startInfo endPOIInfo:endInfo wayPOIInfos:nil drivingStrategy:AMapNaviDrivingStrategyMultipleDefault];
算路策略
导航SDK提供21种驾车策略,分成两种类型:返回单一路径的策略和返回多条路径的策略,对应AMapNaviDrivingStrategy枚举。
策略ID |
常量字段 |
策略描述 |
---|---|---|
0 | AMapNaviDrivingStrategySingleDefault | 速度优先,不考虑当时路况,返回耗时最短的路线,但是此路线不一定距离最短 |
1 | AMapNaviDrivingStrategySingleAvoidCost | 费用优先,不走收费路段,且耗时最少的路线 |
2 | AMapNaviDrivingStrategySinglePrioritiseDistance | 距离优先,不考虑路况,仅走距离最短的路线,但是可能存在穿越小路/小区的情况 |
3 | AMapNaviDrivingStrategySingleAvoidExpressway | 速度优先,不走快速路,例如京通快速路(因为策略迭代,建议使用13) |
4 | AMapNaviDrivingStrategySingleAvoidCongestion | 躲避拥堵,但是可能会存在绕路的情况,耗时可能较长 |
5 | AMapNaviDrivingStrategySinglePrioritiseSpeedCostDistance | 多策略(同时使用速度优先、费用优先、距离优先三个策略计算路径)。其中必须说明,就算使用三个策略算路,会根据路况不固定的返回一到三条路径规划信息 |
6 | AMapNaviDrivingStrategySingleAvoidHighway | 速度优先,不走高速,但是不排除走其余收费路段 |
7 | AMapNaviDrivingStrategySingleAvoidHighwayAndCost | 费用优先,不走高速且避免所有收费路段 |
8 | AMapNaviDrivingStrategySingleAvoidCostAndCongestion | 躲避拥堵和收费,可能存在走高速的情况,并且考虑路况不走拥堵路线,但有可能存在绕路和时间较长 |
9 | AMapNaviDrivingStrategySingleAvoidHighwayAndCostAndCongestion | 躲避拥堵和收费,不走高速 |
10 | AMapNaviDrivingStrategyMultipleDefault | 返回结果会躲避拥堵,路程较短,尽量缩短时间,与高德地图的默认策略(也就是不进行任何勾选)一致 |
11 | AMapNaviDrivingStrategyMultipleShortestTimeDistance | 返回三个结果包含:时间最短;距离最短;躲避拥堵(由于有更优秀的算法,建议用10代替) |
12 | AMapNaviDrivingStrategyMultipleAvoidCongestion | 返回的结果考虑路况,尽量躲避拥堵而规划路径,与高德地图的“躲避拥堵”策略一致 |
13 | AMapNaviDrivingStrategyMultipleAvoidHighway | 返回的结果不走高速,与高德地图“不走高速”策略一致 |
14 | AMapNaviDrivingStrategyMultipleAvoidCost | 返回的结果尽可能规划收费较低甚至免费的路径,与高德地图“避免收费”策略一致 |
15 | AMapNaviDrivingStrategyMultipleAvoidHighwayAndCongestion | 返回的结果考虑路况,尽量躲避拥堵而规划路径,并且不走高速,与高德地图的“躲避拥堵&不走高速”策略一致 |
16 | AMapNaviDrivingStrategyMultipleAvoidHighwayAndCost | 返回的结果尽量不走高速,并且尽量规划收费较低甚至免费的路径结果,与高德地图的“避免收费&不走高速”策略一致 |
17 | AMapNaviDrivingStrategyMultipleAvoidCostAndCongestion | 返回路径规划结果会尽量的躲避拥堵,并且规划收费较低甚至免费的路径结果,与高德地图的“躲避拥堵&避免收费”策略一致 |
18 | AMapNaviDrivingStrategyMultipleAvoidHighwayAndCostAndCongestion | 返回的结果尽量躲避拥堵,规划收费较低甚至免费的路径结果,并且尽量不走高速路,与高德地图的“避免拥堵&避免收费&不走高速”策略一致 |
19 | AMapNaviDrivingStrategyMultiplePrioritiseHighway | 返回的结果会优先选择高速路,与高德地图的“高速优先”策略一致 |
20 | AMapNaviDrivingStrategyMultiplePrioritiseHighwayAvoidCongestion | 返回的结果会优先考虑高速路,并且会考虑路况躲避拥堵,与高德地图的“躲避拥堵&高速优先”策略一致 |
您可以使用以上表格中的策略进行算路,若您想实现和高德地图一样的checkbox选项,那么建议您直接使用我们封装的ConvertDrivingPreferenceToDrivingStrategy方法进行获取策略值。
方法名 |
参数说明 |
返回值说明 |
方法效果 | 备注 |
---|---|---|---|---|
ConvertDrivingPreferenceToDrivingStrategy | multipleRoute:是否多路径规划 avoidCongestion:是否躲避拥堵 avoidHighway:是否不走高速 avoidCost:是否避免收费 prioritiseHighway:是否高速优先 | NSInteger | 进行算路策略转换,将传入的特定规则转换成 AMapNaviDrivingStrategy 的枚举值。 | 不走高速与高速优先不能同时为true。 高速优先与避免收费不能同时为true。 |
货车路线规划
从导航SDKv6.0.0版本开始,全面支持货车算路和导航功能。其中主要区别于驾车的部分就是在货车的路径规划策略中,会将货车特有的限高、限重、车型等信息加入到路径规划策略中进行计算。
特别注意:货车路径规划是收费接口,您如果申请试用或者正式应用都请通过工单系统提交商务合作类工单进行沟通,否则默认是无法算路成功的。
货车的算路接口和驾车都是一样的,SDK是通车辆信息来区别是否为货车的。AMapNaviVehicleInfo.type为1\3\5时都为货车。
//设置车辆信息
AMapNaviVehicleInfo *info = [[AMapNaviVehicleInfo alloc] init];
info.vehicleId = "京N66Y66"; //设置车牌号
info.type = 1; //设置车辆类型,0:小车; 1:货车. 默认0(小车).
info.size = 4; //设置货车的类型(大小)
info.width = 3; //设置货车的宽度,范围:[0-25.5],单位:米
info.height = 3.9; //设置货车的高度,范围:[0-25.5],单位:米
info.length = 15; //设置货车的长度,范围:[0-25],单位:米
info.load = 50; //设置货车的总重,即车重+核定载重,范围:[0-6553.5],单位:吨
info.weight = 45; //设置货车的核定载重,范围:[0-6553.5],单位:吨
info.axisNums = 6; //设置货车的轴数(用来计算过路费及限重)
[[AMapNaviDriveManager sharedInstance] setVehicleInfo:info];
//设置车辆信息
let info = AMapNaviVehicleInfo.init()
info.vehicleId = "京N66Y66"; //设置车牌号
info.type = 1; //设置车辆类型,0:小车; 1:货车. 默认0(小车).
info.size = 4; //设置货车的类型(大小)
info.width = 3; //设置货车的宽度,范围:(0,5],单位:米
info.height = 3.9; //设置货车的高度,范围:(0,10],单位:米
info.length = 15; //设置货车的长度,范围:(0,25],单位:米
info.load = 50; //设置货车的总重,即车重+核定载重,范围:(0,100],单位:吨
info.weight = 45; //设置货车的核定载重,范围:(0,100),单位:吨
info.axisNums = 6; //设置货车的轴数(用来计算过路费及限重)
let success = AMapNaviDriveManager.sharedInstance().setVehicleInfo(info)
使用说明
第1步,设置起终点信息
//使用POI初始化起终点
self.startPOIInfo = [[AMapNaviPOIInfo alloc]init];
self.startPOIInfo.mid = @"B0FFFAB6J2";
self.endPOIInfo = [[AMapNaviPOIInfo alloc]init];
self.endPOIInfo.mid = @"B0FFIA9OE8";
//使用POI初始化起终点
let startPOIInfo = AMapNaviPOIInfo.init()
startPOIInfo.mid = "B0FFFAB6J2"
let endPOIInfo = AMapNaviPOIInfo.init()
endPOIInfo.mid = "B0FFIA9OE8"
第2步,规划路线
//使用起终点POI规划路线
[[AMapNaviDriveManager sharedInstance] calculateDriveRouteWithStartPOIInfo:self.startPOIInfo endPOIInfo:self.endPOIInfo wayPOIInfos:nil drivingStrategy:AMapNaviDrivingStrategySingleDefault];
//使用起终点POI规划路线
AMapNaviDriveManager.sharedInstance().calculateDriveRoute(withStart:startPOIInfo, end:endPOIInfo, wayPOIInfos:nil, drivingStrategy:AMapNaviDrivingStrategySingleDefault)
第3步,处理结果
当路线规划成功时,会触发-driveManager:onCalculateRouteSuccessWithType: 回调,在该回调函数中,可以进行规划路线的显示,也可以直接开始导航。
- (void)driveManager:(AMapNaviDriveManager *)driveManager onCalculateRouteSuccessWithType:(AMapNaviRoutePlanType)type;
{
NSLog(@"onCalculateRouteSuccess");
//显示路径或开始导航
}
func driveManager(_ driveManager: AMapNaviDriveManager, onCalculateRouteSuccessWith type: AMapNaviRoutePlanType)
{
NSLog("onCalculateRouteSuccess");
//显示路径或开始导航
}