示例中心
功能在线体验
menu Created with Sketch. closed Created with Sketch.

高德 开发 iOS 导航SDK 开发指南 出行路线规划 驾车路线规划

更新时间:2018年12月06日

基本介绍

根据出发地、目的地以及路径策略设置,为用户量身设计出行方案。同时可结合实时交通,帮助用户绕开拥堵路段,提供更贴心、更人性化的驾车出行体验。

注意:路径规划功能需要联网使用。

要实现驾车路径规划,以下两个类您需要了解:

 

  • AMapNaviDriveManager 是驾车导航管理类,提供计算规划路线、偏航以及拥堵重新算路等方法。注意:从导航SDK5.4.0开始,AMapNaviDriveManager的init方法已被禁止使用,请使用单例 [AMapNaviDriveManager sharedInstance] 替代,且在调用类的 dealloc 函数里或其他适当时机(如导航ViewController被pop时),调用 [AMapNaviDriveManager destroyInstance] 来销毁单例(需要注意如未销毁成功,请检查单例是否被强引用)
  • <AMapNaviDriveManagerDelegate> 是驾车导航管理协议类,提供导航过程中的事件(如:路径规划成功/失败、拥堵重新算路、到达目的地等)回调接口。

说明:

1、起点和终点的坐标可通过多种方式获取,如:使用坐标拾取器查询您需要的点的坐标;还可以通过搜索SDK中的POI搜索查询兴趣点,作为起点或者终点。

2、从导航 SDK V5.0.0 版本起最多支持设置 16 个途经点,注意:导航组件最多支持设置3个途径点。

3、提供两种驾车路线规划的方法,如下表所示:

方法名

参数说明

返回值说明

方法效果

calculateDriveRouteWithEndPoints:wayPoints:drivingStrategy:

endPoints:终点坐标;

wayPoints:途经点坐标;

strategy:路径的计算策略;

BOOL,表示路径是否计算成功

不带起点的驾车路径规划。

calculateDriveRouteWithStartPoints:endPoints:wayPoints:drivingStrategy:

startPoints:起点坐标;

endPoints:终点坐标;

wayPoints:途经点坐标;

strategy:路径的计算策略;

BOOL,表示路径是否计算成功

带起点的驾车路径规划。

4、无论起点坐标还是终点坐标,均可设置多个。当坐标以列表形式存放时,列表的尾点为实际导航点(起点或终点),其他坐标点为辅助信息,带有方向性,可有效避免算路到马路的另一侧。

5、路径的计算策略包含单一策略和多策略,通过多策略,可计算出多条规划路径,需要通过 AMapNaviDriveManager 的 naviRoutes 方法获取这些路径。

6、推荐使用带起点的路径规划方法,因为不带起点的路径规划方法会因定位失败导致使用默认在北京的位置,从而使算路结果异常。

策略说明

导航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。


使用说明

第 1 步,初始化

1)初始化导航的起点和终点坐标(为了方便展示路线,特定固定了起点和终点坐标)

- (void)initProperties
{
    self.startPoint = [AMapNaviPoint locationWithLatitude:39.99 longitude:116.47];
    self.endPoint   = [AMapNaviPoint locationWithLatitude:39.90 longitude:116.32];
}
let startPoint = AMapNaviPoint.location(withLatitude: 39.993135, longitude: 116.474175)!
let endPoint = AMapNaviPoint.location(withLatitude: 39.908791, longitude: 116.321257)!

2)初始化 MAMapView。

- (void)initMapView
{
    if (self.mapView == nil)
    {
        self.mapView = [[MAMapView alloc] initWithFrame:CGRectMake(0, kRoutePlanInfoViewHeight,
                                                                   self.view.bounds.size.width,
                                                                   self.view.bounds.size.height - kRoutePlanInfoViewHeight)];
        [self.mapView setDelegate:self];
        [self.view addSubview:self.mapView];
    }
}
func initMapView() {
    mapView = MAMapView(frame: CGRect(x: 0, y: routePlanInfoViewHeight, width: view.bounds.width, height: view.bounds.height - routePlanInfoViewHeight))
    mapView.delegate = self
    view.addSubview(mapView)
}

3)初始化 AMapNaviDriveManager。

- (void)initDriveManager
{
       //请在 dealloc 函数中执行 [AMapNaviDriveManager destroyInstance] 来销毁单例
       [[AMapNaviDriveManager sharedInstance] setDelegate:self];
}
func initDriveManager() {
        //请在 deinit 函数中执行 AMapNaviDriveManager.destroyInstance() 来销毁单例
        AMapNaviDriveManager.sharedInstance().delegate = self
}

第 2 步,计算驾车规划路线

[[AMapNaviDriveManager sharedInstance] calculateDriveRouteWithStartPoints:@[self.startPoint]
                                            endPoints:@[self.endPoint]
                                            wayPoints:nil
                                      drivingStrategy:17];
AMapNaviDriveManager.sharedInstance().calculateDriveRoute(
withStart: [startPoint],
end: [endPoint],
wayPoints: nil, 
drivingStrategy: 17) 

第 3 步,处理结果

当驾车路线规划成功时,会进 driveManagerOnCalculateRouteSuccess 回调,在该回调函数中,可以进行规划路线显示也可以直接开启导航。

说明:

1)通过 AMapNaviDriveManager 的 naviRoutes 获取规划路线的列表,线路详细信息请参考 AMapNaviRoute 类。

2)若进行线路展示,可通过 AMapNaviRoute 的 routeCoordinates 属性,可获取导航路线的所有形状点,然后通过在 MAMapView 上绘制线进行线路展示。

3)若想开启导航,请参考在地图上导航

- (void)driveManagerOnCalculateRouteSuccess:(AMapNaviDriveManager *)driveManager
{
    NSLog(@"onCalculateRouteSuccess");
    
    //显示路径或开启导航
}
func driveManager(onCalculateRouteSuccess driveManager: AMapNaviDriveManager) {
   NSLog("CalculateRouteSuccess")
   
   //显示路径或开启导航
    }

第 4 步,当退出页面的时候,销毁AMapNaviDriveManager单例

- (void)dealloc
{
    [[AMapNaviDriveManager sharedInstance] stopNavi];
    [[AMapNaviDriveManager sharedInstance] removeDataRepresentative:self.driveView];
    [[AMapNaviDriveManager sharedInstance] setDelegate:nil];
    
    BOOL success = [AMapNaviDriveManager destroyInstance];
    NSLog(@"单例是否销毁成功 : %d",success);
    
}
deinit {
    AMapNaviDriveManager.sharedInstance().stopNavi()
    AMapNaviDriveManager.sharedInstance().removeDataRepresentative(driveView)
    AMapNaviDriveManager.sharedInstance().delegate = nil
        
    let success = AMapNaviDriveManager.destroyInstance()
    NSLog("单例是否销毁成功 : \(success)")
        
}



新用户
福利
功能
在线体验
常见
问题