驾车出行路线规划 最后更新时间: 2021年04月01日
注意:下面介绍的功能使用的是地图SDK的搜索功能,需要在工程中导入搜索功能库(AMapSearchKit.framework)。
驾车出行路线规划常用于驾车里程的价格预估,以及出行路线的提前规划。
实现驾车路线规划的步骤如下:
第 1 步,引入头文件
引入 AMapFoundationKit.h 和 AMapSearchKit.h 这两个头文件。
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapSearchKit/AMapSearchKit.h>
//在桥接文件中引入头文件
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapSearchKit/AMapSearchKit.h>
第 2 步,配置Key
在使用搜索功能时,需要添加 Key。
如果您使用的是搜索库(AMapSearchKit.framework) v4.x 版本需要引入基础 SDK AMapFoundationKit.framework ,设置 Key 的方法如下:
iOS 搜索功能 v4.x 版本设置 Key:
[AMapServices sharedServices].apiKey = @"您的key";
AMapServices.shared().apiKey = "您的Key"
如果您使用的是搜索功能 v3.x 或之前版本,请您尽快更新。
iOS 搜索功能 v3.x 版本设置 Key:
[AMapSearchServices sharedServices].apiKey = @"您的key";
AMapSearchServices.shared().apiKey = "您的Key"
第 3 步,定义 AMapSearchAPI
定义主搜索对象 AMapSearchAPI ,并继承搜索协议<AMapSearchDelegate>。
第 4 步,构造 AMapSearchAPI
构造主搜索对象 AMapSearchAPI,并设置代理。
self.search = [[AMapSearchAPI alloc] init];
self.search.delegate = self;
search = AMapSearchAPI()
search.delegate = self
第 5 步,设置驾车线路规划参数
请求参数类为 AMapDrivingRouteSearchRequest,其中:
- origin:起点坐标,必设。
- destination:终点坐标,必设。
- waypoints:途经点,目前最多支持6个途经点。
- avoidpolygons:避让区域,目前最多支持100个避让区域,每个区域16个点。
- avoidroad:避让道路,设置避让道路后,避让区域失效。
- strategy:路径规划的策略,可选,默认为0-速度优先;详细策略请见驾车策略说明。
self.startAnnotation.coordinate = self.startCoordinate;
self.destinationAnnotation.coordinate = self.destinationCoordinate;
AMapDrivingRouteSearchRequest *navi = [[AMapDrivingRouteSearchRequest alloc] init];
navi.requireExtension = YES;
navi.strategy = 5;
/* 出发点. */
navi.origin = [AMapGeoPoint locationWithLatitude:self.startCoordinate.latitude
longitude:self.startCoordinate.longitude];
/* 目的地. */
navi.destination = [AMapGeoPoint locationWithLatitude:self.destinationCoordinate.latitude
longitude:self.destinationCoordinate.longitude];
startCoordinate = CLLocationCoordinate2DMake(39.910267, 116.370888)
destinationCoordinate = CLLocationCoordinate2DMake(39.989872, 116.481956)
let request = AMapDrivingRouteSearchRequest()
request.origin = AMapGeoPoint.location(withLatitude: CGFloat(startCoordinate.latitude), longitude: CGFloat(startCoordinate.longitude))
request.destination = AMapGeoPoint.location(withLatitude: CGFloat(destinationCoordinate.latitude), longitude: CGFloat(destinationCoordinate.longitude))
request.requireExtension = true
第 6 步,发起驾车路线规划
[self.search AMapDrivingRouteSearch:navi];
search.aMapDrivingRouteSearch(request)
第 7 步,在回调中处理数据
当检索成功时,会进到 onRouteSearchDone 回调函数中,在该回调中,通过解析 AMapRouteSearchResponse 获取将驾车规划路线的数据显示在地图上。
说明:
1)可以在回调中解析 response,获取驾车的路径。
2)response.route.paths 可以获取到 AMapPath 列表,驾车方案的详细信息可参考 AMapPath 类。
3)规划路径的结果构成如下图所示,可根据此结构图解析结果,准确展示线路。
/* 路径规划搜索回调. */
- (void)onRouteSearchDone:(AMapRouteSearchBaseRequest *)request response:(AMapRouteSearchResponse *)response
{
if (response.route == nil)
{
return;
}
//解析response获取路径信息,具体解析见 Demo
}
func onRouteSearchDone(_ request: AMapRouteSearchBaseRequest!, response: AMapRouteSearchResponse!) {
if response.count > 0 {
//解析response获取路径信息
}
}
驾车策略说明
策略ID | 策略描述 |
---|---|
0 | 速度优先,不考虑当时路况,返回耗时最短的路线,但是此路线不一定距离最短 |
1 | 费用优先,不走收费路段,且耗时最少的路线 |
2 | 距离优先,不考虑路况,仅走距离最短的路线,但是可能存在穿越小路/小区的情况 |
3 | 速度优先,不走快速路,例如京通快速路(因为策略迭代,建议使用13) |
4 | 躲避拥堵,但是可能会存在绕路的情况,耗时可能较长 |
5 | 多策略(同时使用速度优先、费用优先、距离优先三个策略计算路径)。其中必须说明,就算使用三个策略算路,会根据路况不固定的返回一到三条路径规划信息 |
6 | 速度优先,不走高速,但是不排除走其余收费路段 |
7 | 费用优先,不走高速且避免所有收费路段 |
8 | 躲避拥堵和收费,可能存在走高速的情况,并且考虑路况不走拥堵路线,但有可能存在绕路和时间较长 |
9 | 躲避拥堵和收费,不走高速 |
10 | 返回结果会躲避拥堵,路程较短,尽量缩短时间,与高德地图的默认策略(也就是不进行任何勾选)一致 |
11 | 返回三个结果包含:时间最短;距离最短;躲避拥堵(由于有更优秀的算法,建议用10代替) |
12 | 返回的结果考虑路况,尽量躲避拥堵而规划路径,与高德地图的“躲避拥堵”策略一致 |
13 | 返回的结果不走高速,与高德地图“不走高速”策略一致 |
14 | 返回的结果尽可能规划收费较低甚至免费的路径,与高德地图“避免收费”策略一致 |
15 | 返回的结果考虑路况,尽量躲避拥堵而规划路径,并且不走高速,与高德地图的“躲避拥堵&不走高速”策略一致 |
16 | 返回的结果尽量不走高速,并且尽量规划收费较低甚至免费的路径结果,与高德地图的“避免收费&不走高速”策略一致 |
17 | 返回路径规划结果会尽量的躲避拥堵,并且规划收费较低甚至免费的路径结果,与高德地图的“躲避拥堵&避免收费”策略一致 |
18 | 返回的结果尽量躲避拥堵,规划收费较低甚至免费的路径结果,并且尽量不走高速路,与高德地图的“避免拥堵&避免收费&不走高速”策略一致 |
19 | 返回的结果会优先选择高速路,与高德地图的“高速优先”策略一致 |
20 | 返回的结果会优先考虑高速路,并且会考虑路况躲避拥堵,与高德地图的“躲避拥堵&高速优先”策略一致 |
说明
当检索失败时,会进入 didFailWithError 回调函数,通过该回调函数获取产生的失败的原因。
- (void)AMapSearchRequest:(id)request didFailWithError:(NSError *)error
{
NSLog(@"Error: %@", error);
}
func aMapSearchRequest(_ request: Any!, didFailWithError error: Error!) {
print("Error:\(error)")
}