未来行程路线规划 最后更新时间: 2021年01月22日
自地图 SDK 搜索功能 6.9.0 版本起新增未来行程路线规划,简称ETD。 未来出行规划(ETD)服务已覆盖全国所有城市,可提供未来7天的出行路线规划。
注意:下面介绍的功能使用的是地图SDK的搜索功能,需要在工程中导入【搜索功能库(AMapSearchKit.framework)】。
第一步,引入头文件
引入 AMapFoundationKit.h 和 AMapSearchKit.h 这两个头文件。
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapSearchKit/AMapSearchKit.h>
//在桥接文件中引入头文件
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapSearchKit/AMapSearchKit.h>
第二步,配置KEY
在使用搜索功能时,需要添加 Key。
[AMapServices sharedServices].apiKey = @"您的key";
AMapServices.shared().apiKey = "您的Key"
第三步, 定义 AMapSearchAPI
定义主搜索对象 AMapSearchAPI ,并继承搜索协议<AMapSearchDelegate>。
第四步,构造 AMapSearchAPI
构造主搜索对象 AMapSearchAPI,并设置代理。
self.search = [[AMapSearchAPI alloc] init];
self.search.delegate = self;
search = AMapSearchAPI()
search.delegate = self
第五步,设置未来行程规划参数
请求参数类为 AMapDrivingRouteSearchRequest,其中:
参数名 | 含义 | 是否必填 |
---|---|---|
origin | 出发点坐标 | 必填 |
destination | 目的点坐标 | 必填 |
beginTime | 出发时间 | 必填 |
interval | 时间间隔 | 必填 |
timeCount | 时间点个数,最多48个 | 必填 |
originId | 出发点POIID | 否 |
destinationId | 目的点POIID | 否 |
origintype | 出发点POI类型编码 | 否 |
destinationtype | 目的点点POI类型编码 | 否 |
parentId | 目的点的父POIID | 否 |
plateProvince | 车牌省份,用汉字填入车牌省份缩写。用于判断是否限行。 | 否 |
plateNumber | 车牌详情,填入除省份及标点之外的字母和数字(需大写)。用于判断是否限行。 | 否 |
cartype | 驾车路径规划车辆类型 | 否 |
strategy | 路径规划的策略,可选,默认为0-速度优先;详细策略请见[下方ETD驾车策略说明] | 否 |
self.startAnnotation.coordinate = self.startCoordinate;
self.destinationAnnotation.coordinate = self.destinationCoordinate;
AMapFutureRouteSearchRequest *navi = [[AMapFutureRouteSearchRequest alloc] init];
/* 出发点. */
navi.origin = [AMapGeoPoint locationWithLatitude:self.startCoordinate.latitude
longitude:self.startCoordinate.longitude];
/* 目的地. */
navi.destination = [AMapGeoPoint locationWithLatitude:self.destinationCoordinate.latitude
longitude:self.destinationCoordinate.longitude];
NSTimeInterval startTime = [[NSDate dateWithTimeIntervalSinceNow:3600] timeIntervalSince1970];
NSString *timeString = [NSString stringWithFormat:@"%0.f", startTime];
navi.beginTime = timeString;//出发时间设置为当前时间之后一个小时
navi.interval = 900;//时间间隔为15分钟
navi.timeCount = 10;
request.origin = AMapGeoPoint.location(withLatitude: CGFloat(startCoordinate.latitude), longitude: CGFloat(startCoordinate.longitude))
request.destination = AMapGeoPoint.location(withLatitude: CGFloat(destinationCoordinate.latitude), longitude: CGFloat(destinationCoordinate.longitude))
let request = AMapFutureRouteSearchRequest()
let nowTime = Date().timeIntervalSince1970
var timeStamp = Int(nowTime!)
timeStamp += 3600;
let timeStr = String(timeStamp)
request.beginTime = timeStr
request.interval = 900
request.timeCount = 10
第六步,发起未来行程路线规划
调用 AMapSearchAPI 的 AMapFutureRouteSearch 并发起未来行程路线规划。
[self.search AMapFutureRouteSearch:navi];
search.aMapFutureRouteSearch(request)
第七步,在回调中处理数据
当检索成功时,会进到 onFutureRouteSearchDone 回调函数中,在该回调中,通过解析 AMapFutureRouteSearchResponse 获取将未来行程规划路线的数据显示在地图上。
- (void)onFutureRouteSearchDone:(AMapRouteSearchBaseRequest *)request response:(AMapFutureRouteSearchResponse *)response
{
if (!response.paths.count || !response.timeInfos.count) {
return;
}
//解析response获取路径信息,具体解析见 Demo
}
func onFutureRouteSearchDone(_ request: AMapRouteSearchBaseRequest!, response: AMapFutureRouteSearchResponse!) {
if response.paths.count == 0 || response.timeInfos.count == 0 {
return
}
//解析response获取路径信息,具体解析见 Demo
}
ETD驾车策略说明
策略ID | 策略说明 |
---|---|
1 | 返回的结果考虑路况,尽量躲避拥堵而规划路径,与高德地图的“躲避拥堵”策略一致 |
2 | 返回的结果不走高速,与高德地图“不走高速”策略一致 |
3 | 返回的结果尽可能规划收费较低甚至免费的路径,与高德地图“避免收费”策略一致 |
4 | 返回的结果考虑路况,尽量躲避拥堵而规划路径,并且不走高速,与高德地图的“躲避拥堵&不走高速”策略一致 |
5 | 返回的结果尽量不走高速,并且尽量规划收费较低甚至免费的路径结果,与高德地图的“避免收费&不走高速”策略一致 |
6 | 返回路径规划结果会尽量的躲避拥堵,并且规划收费较低甚至免费的路径结果,与高德地图的“躲避拥堵&避免收费”策略一致 |
7 | 返回的结果尽量躲避拥堵,规划收费较低甚至免费的路径结果,并且尽量不走高速路,与高德地图的“避免拥堵&避免收费&不走高速”策略一致 |
8 | 返回的结果会优先选择高速路,与高德地图的“高速优先”策略一致 |
9 | 返回的结果会优先考虑高速路,并且会考虑路况躲避拥堵,与高德地图的“躲避拥堵&高速优先”策略一致 |
10 | 不考虑路况,返回速度最优、耗时最短的路线,但是此路线不一定距离最短 |
11 | 避让拥堵&速度优先&避免收费 |
失败说明
当检索失败时,会进入 didFailWithError 回调函数,通过该回调函数获取产生的失败的原因。
- (void)AMapSearchRequest:(id)request didFailWithError:(NSError *)error
{
NSLog(@"Error: %@", error);
}
func aMapSearchRequest(_ request: Any!, didFailWithError error: Error!) {
print("Error:\(error)")
}