示例中心
功能在线体验
控制台

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

更新时间:2018年03月07日

基本介绍

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

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

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

 

  • 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提供20种驾车策略,分成两种类型:返回单一路径的策略和返回多条路径的策略,对应 AMapNaviDrivingStrategy 枚举。

常量字段

说明

DRIVING_DEFAULT

单路径-默认算路模式,速度优先(即:不考虑路况的时间最短),是指在理想路况下,根据道路固有属性(静态权值)计算得到的路线。

DRIVING_SAVE_MONEY

单路径-费用优先(尽量避开收费道路,有可能起始点间必有收费路)。

DRIVING_SHORTEST_DISTANCE

单路径-距离优先(距离最短)。

DRIVING_NO_EXPRESS_WAYS

单路径-普通路优先(不走快速路,包含高速路)

DRIVING_AVOID_CONGESTION

单路径-时间优先 。规避拥堵的路线(考虑实时路况)。

DRIVING_MULTIPLE_PRIORITY_SPEED_COST_DISTANCE

多策略(同时使用速度优先、费用优先、距离优先三个策略计算路径)。 其中必须说明,就算使用三个策略算路,会根据路况不固定的返回一~三条路径规划信息。

DRIVING_SINGLE_ROUTE_AVOID_HIGHSPEED

单路径,【不走高速】

DRIVING_SINGLE_ROUTE_AVOID_HIGHSPEED_COST

单路径,【不走高速&躲避收费】

DRIVING_SINGLE_ROUTE_AVOID_CONGESTION_COST

单路径,【躲避收费&躲避拥堵】

DRIVING_SINGLE_ROUTE_AVOID_HIGHSPEED_COST_CONGESTION

单路径,【不走高速&躲避收费&躲避拥堵】

DRIVING_MULTIPLE_ROUTES_DEFAULT

多路径,时间最短,距离最短(考虑路况)【对应高德地图App不设置任何偏好的策略】

DRIVING_MULTIPLE_SHORTEST_TIME_DISTANCE

多路径,时间最短,距离最短(不考虑路况)

DRIVING_MULTIPLE_ROUTES_AVOID_CONGESTION

多路径,躲避拥堵(考虑路况)【对应高德地图App设置避让用户偏好的策略】

DRIVING_MULTIPLE_ROUTES_AVOID_HIGHSPEED

多路径,不走高速【对应高德地图App不走高速的规划偏好】

DRIVING_MULTIPLE_ROUTES_AVOID_COST

多路径,避免收费【对应高德地图App设置避免收费的规划偏好】

DRIVING_MULTIPLE_ROUTES_AVOID_HIGHSPEED_CONGESTION

多路径,不走高速&躲避拥堵【对应高德地图App同时选中躲避拥堵和不走高速的规划偏好】

DRIVING_MULTIPLE_ROUTES_AVOID_HIGHTSPEED_COST

多路径,不走高速&避免收费【对应高德地图App同时选中避免收费和不走高速的规划偏好】

DRIVING_MULTIPLE_ROUTES_AVOID_COST_CONGESTION

多路径,避免收费&躲避拥堵【对应高德地图App同时选中躲避拥堵和避免收费的规划偏好】

DRIVING_MULTIPLE_ROUTES_AVOID_HIGHSPEED_COST_CONGESTION

多路径,不走高速&避免收费&躲避拥堵【对应高德地图App同时选中躲避拥堵、避免收费和不走高速的规划偏好】

DRIVING_MULTIPLE_ROUTES_PRIORITY_HIGHSPEED

多路径,高速优先【对应高德地图App高速优先的规划偏好】

DRIVING_MULTIPLE_ROUTES_PRIORITY_HIGHSPEED_AVOID_CONGESTION

多路径,高速优先&躲避拥堵【对应高德地图App同时选中躲避拥堵和高速优先的规划偏好】

您可以使用以上表格中的策略进行算路,若您想实现和高德地图一样的 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)")
        
}



示例中心 功能
在线体验
常见问题