轨迹纠偏 最后更新时间: 2021年01月22日
轨迹记录、纠偏类需求强烈建议您使用高德开放平台提供的猎鹰SDK或者猎鹰服务API,后续版本的地图SDK会逐步停止轨迹纠偏接口的维护。
简介
轨迹纠偏可帮助您将您记录的轨迹点进行抽稀、纠偏,把轨迹匹配到道路上,提供平滑的绘制效果,3D地图SDK 4.3.0及以上版本支持该功能。
轨迹纠偏常用于行驶距离计算、轨迹管理的场景。
提醒:目前该功能只支持驾车的场景,只能将漂移的点匹配到车行道上。
结合定位轨迹纠偏(自5.2.0版本起支持)
第 1 步,初始化MATraceManager
开始记录轨迹,每2s记录一次轨迹,每隔5个点合并请求一次纠偏并回调。
MATraceManager *manager = [MATraceManager sharedInstance];
第 2 步 ,开启轨迹纠偏
/**
* @brief 开始轨迹定位, 内部使用系统CLLocationManager,distanceFilter,desiredAccuracy均为系统默认值
* @param locCallback 定位回调, 回调中返回坐标类型为AMapCoordinateTypeGPS
*/
- (void)startTraceWith:(MATraceLocationCallback)locCallback;
第 3 步 ,在回调block里解析返回结果
///定位回调, locations: 原始定位点; tracePoints: 纠偏后的点,如果纠偏失败返回nil; distance:距离; error: 纠偏失败时的错误信息
typedef void(^MATraceLocationCallback)(NSArray<CLLocation *> *locations, NSArray<MATracePoint *> *tracePoints, double distance, NSError *error);
第 4 步 ,结束轨迹纠偏
/**
* @brief 停止轨迹定位
*/
- (void)stopTrace;
如何使用轨迹纠偏
按照以下介绍的步骤,就可以将您的轨迹数据平滑的绘制到地图上了。
第 1 步,初始化 MATraceManager
MATraceManager *manager = [[MATraceManager alloc] init];
第 2 步,构造轨迹点数据 List
需要按照 MATraceLocation 定义好的格式构造轨迹点 List。
MATraceLocation 的信息通过下表中的属性设置:
需要您注意的是,
1、必填信息的缺失会导致纠偏失败,非必填信息的缺失会在一定程度影响最终纠偏结果,因此尽可能的多提供以下信息是确保绘制一条平滑轨迹的最佳方案。建议使用iOS定位SDK中定位精度高,有速度和角度返回的位置点数据。
2、传入的经纬度点,必须是国内的坐标,轨迹纠偏功能不支持国外的坐标点的纠偏。
参数类型 | 属性名 | 属性说明 |
---|---|---|
CLLocationCoordinate2D | loc | 经纬度信息,必填 |
double | time | 时间,单位:毫秒,必填 |
double | speed | 速度,单位:km/h,必填 |
double | angle | 角度,必填 |
第 3 步,进行轨迹纠偏
轨迹纠偏支持传入多种坐标系(高德、GPS原始坐标以及百度)的轨迹点数据。进行轨迹纠偏的方法如下:
方法名 | 参数说明 | 返回值说明 | 方法效果 |
---|---|---|---|
queryProcessedTraceWith | locations:待纠偏处理的点集。 type:loctions经纬度坐标的类型,如果已经是高德坐标系,则type传-1,详见:AMapCoordinateType 枚举。 processingCallback:分段处理的回调。 finishCallback:全部处理完毕的回调。 failedCallback:失败的回调。 | 返回一个NSOperation对象,可调用cancel取消。 | 进行轨迹纠偏,返回纠偏后的轨迹数据。 |
NSOperation *op = [manager queryProcessedTraceWith:mArr type:type processingCallback:^(int index, NSArray<MATracePoint *> *points) {
[weakSelf addSubTrace:points toMapView:weakSelf.mapView2];
} finishCallback:^(NSArray<MATracePoint *> *points, double distance) {
weakSelf.queryOperation = nil;
[weakSelf addFullTrace:points toMapView:weakSelf.mapView2];
[weakSelf.resultLabel setHidden:NO];
weakSelf.resultLabel.text = [NSString stringWithFormat:@"距离:%.0f米", distance];
[weakSelf.resultLabel sizeToFit];
weakSelf.resultLabel.center = CGPointMake(CGRectGetMidX(weakSelf.resultLabel.bounds), weakSelf.mapView2.bounds.size.height - CGRectGetMidY(weakSelf.resultLabel.bounds));
if(!weakSelf.resultLabel.superview) {
[weakSelf.mapView2 addSubview:weakSelf.resultLabel];
}
} failedCallback:^(int errorCode, NSString *errorDesc) {
NSLog(@"Error: %@", errorDesc);
weakSelf.queryOperation = nil;
}];
第 4 步:获取纠偏后的数据
1、当前轨迹点纠偏全部成功就一定会进入 finishCallback 回调,通过这个回调,可获取传入的整条轨迹数据的纠偏结果,同时返回这条数据的距离。
typedef void(^MAFinishCallback)(NSArray<MATracePoint *> *points, double distance);
2、SDK采用分段的方式处理轨迹数据,按分段的顺序,每完成一段轨迹数据的纠偏就会进 processingCallback 回调,通过该回调,返回该分段的纠偏轨迹点数据,以及该段的编号(从0开始)。
采用分段方式有以下两个优势:
- 当轨迹点数据量大的时候,可减少处理整条轨迹数据的等待时间。
- 当有部分的轨迹数据不符合要求导致纠偏失败时,通过过程回调可看到已完成部分的结果。
typedef void(^MAProcessingCallback)(int index, NSArray<MATracePoint *> *points);
3、当传入的轨迹点数据出现以下几种情况,会因为参数错误导致纠偏失败,进入 failedCallback 回调,通过该回调,能知道纠偏失败的原因。
- 网络不连通。
- 原始轨迹数据只有1个点。
typedef void(^MAFailedCallback)(int errorCode, NSString *errorDesc);
注意事项
1、作为地图SDK的功能,需要设置正确的高德Key才能保证轨迹纠偏功能的正确使用。
2、若您对纠偏结果存疑(例如:距离计算不准确,轨迹不正确等等),可将您的轨迹点转成标准的 JSON 格式文件,通过工单提交给我们(注意:我们只接受转成我们能验证格式的轨迹点数据)。
a)标准的 JSON 格式文件可通过 http://tool.oschina.net/codeformat/json 转化。
b)检查参数的字段名称是否与下表吻合,不一样请修改成一样。
经度 | lon |
纬度 | lat |
时间(单位:毫秒) | loctime |
速度(单位:Km/h) | speed |
角度(单位:度) | bearing |
c)通过工单提交给我们。