高德地图开发iOS 地图SDK在地图上绘制—轨迹纠偏

高德地图开发iOS 地图SDK在地图上绘制—轨迹纠偏

轨迹纠偏 最后更新时间: 2021年01月22日

轨迹记录、纠偏类需求强烈建议您使用高德开放平台提供的猎鹰SDK或者猎鹰服务API,后续版本的地图SDK会逐步停止轨迹纠偏接口的维护。

简介

轨迹纠偏可帮助您将您记录的轨迹点进行抽稀、纠偏,把轨迹匹配到道路上,提供平滑的绘制效果,3D地图SDK 4.3.0及以上版本支持该功能。

轨迹纠偏常用于行驶距离计算、轨迹管理的场景。

提醒:目前该功能只支持驾车的场景,只能将漂移的点匹配到车行道上。

结合定位轨迹纠偏(自5.2.0版本起支持)

 第 1 步,初始化MATraceManager

开始记录轨迹,每2s记录一次轨迹,每隔5个点合并请求一次纠偏并回调。

Objective-C

MATraceManager *manager = [MATraceManager sharedInstance];

第 2 步 ,开启轨迹纠偏

Objective-C

/**
 * @brief 开始轨迹定位, 内部使用系统CLLocationManager,distanceFilter,desiredAccuracy均为系统默认值
 * @param locCallback 定位回调, 回调中返回坐标类型为AMapCoordinateTypeGPS
 */
- (void)startTraceWith:(MATraceLocationCallback)locCallback;

第 3 步 ,在回调block里解析返回结果

Objective-C

///定位回调, locations: 原始定位点; tracePoints: 纠偏后的点,如果纠偏失败返回nil; distance:距离; error: 纠偏失败时的错误信息
typedef void(^MATraceLocationCallback)(NSArray<CLLocation *> *locations, NSArray<MATracePoint *> *tracePoints, double distance, NSError *error);

第 4 步 ,结束轨迹纠偏

Objective-C

/**
 * @brief 停止轨迹定位
 */
- (void)stopTrace;

如何使用轨迹纠偏

按照以下介绍的步骤,就可以将您的轨迹数据平滑的绘制到地图上了。

第 1 步,初始化 MATraceManager

Objective-C

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取消。 进行轨迹纠偏,返回纠偏后的轨迹数据。

Objective-C

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 回调,通过这个回调,可获取传入的整条轨迹数据的纠偏结果,同时返回这条数据的距离。

Objective-C

typedef void(^MAFinishCallback)(NSArray<MATracePoint *> *points, double distance);

2、SDK采用分段的方式处理轨迹数据,按分段的顺序,每完成一段轨迹数据的纠偏就会进 processingCallback 回调,通过该回调,返回该分段的纠偏轨迹点数据,以及该段的编号(从0开始)。

采用分段方式有以下两个优势:

 

  • 当轨迹点数据量大的时候,可减少处理整条轨迹数据的等待时间。
  • 当有部分的轨迹数据不符合要求导致纠偏失败时,通过过程回调可看到已完成部分的结果。

Objective-C

typedef void(^MAProcessingCallback)(int index, NSArray<MATracePoint *> *points);

3、当传入的轨迹点数据出现以下几种情况,会因为参数错误导致纠偏失败,进入 failedCallback 回调,通过该回调,能知道纠偏失败的原因。

 

  • 网络不连通。
  • 原始轨迹数据只有1个点。

Objective-C

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)通过工单提交给我们。