最后更新时间:2025-03-25


轨迹图

腾讯地图SDK自4.4.7版本起支持轨迹图功能,该功能可以根据起点坐标和终点坐标在地图上展示轨迹效果,示例图如下:





一、添加轨迹图

为了添加一个简单的轨迹,你需要提前准备好带有轨迹点坐标及时间戳的数据集。基本使用步骤如下:

  1. 准备轨迹点坐标和时间戳,示例如下:

    // 起点坐标,终点坐标,时间戳
    39.792151 116.397607 14
    

    轨迹图测试数据

  2. 遍历所有数据并创建轨迹点数据对象,保存在数组中:

    NSMutableArray <QTrailNode *> *nodes = [NSMutableArray array];
    [ar enumerateObjectsUsingBlock:^(id  _Nonnull obj2, NSUInteger idx, BOOL * _Nonnull stop) {
        
        NSArray *finalArray = [obj2 componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        
        if ((int)finalArray.count >= 3)
        {
            // 纬度.
            double lat = [finalArray[0] doubleValue];
            // 经度.
            double lon = [finalArray[1] doubleValue];
            // 时间戳.
            double val = [finalArray[2] doubleValue];
            
            // 判断经纬度是否正确
            if ( (lat >= -90) && (lat <= 90) && (lon >= -180) && (lon <= 180) ) {
                QTrailNode *node = [[QTrailNode alloc] init];
                node.coordinate = CLLocationCoordinate2DMake(lat, lon);
                node.timeStamp = val;
                
                // 判断时间戳是否为升序,轨迹线的数据点要按照升序排序
                if (val > temp)
                {
                    temp = val;
                }
                
                [nodes addObject:node];
            }
        }
    }];
    
  3. 通过轨迹点数据对象创建轨迹线图层对象,并配置轨迹线图层的样式,添加到地图上:

    // 单条线的数据
    QTrailLine *singleLine = [[QTrailLine alloc] init];
    // 设置轨迹线的数据点,数据点中的时间戳要保证升序排序
    singleLine.nodes = nodes;
    // 将轨迹线添加到数组中
    [self.lines addObject:singleLine];
    
    // 使用轨迹线数组创建轨迹Overlay
    QTrailOverlay *trail = [[QTrailOverlay alloc] initWithTrailData:self.line];
    // 设置轨迹Overlay的样式
    QTrailLineStyle *style = [[QTrailLineStyle alloc] init];
    style.width = 5;
    // 将轨迹Overlay添加到地图中
    [self.mapView addOverlay:trail];
    
  4. 实现mapView的代理方法,将轨迹图层展示到地图上:

    - (QOverlayView *)mapView:(QMapView *)mapView viewForOverlay:(id<QOverlay>)overlay
    {
        if ([overlay isKindOfClass:[QTrailOverlay class]])
        {
            QTrailOverlayView *tv = [[QTrailOverlayView alloc] initWithTrailOverlay:overlay];
            
            return tv;
        }
        
        return nil;
    }
    


二、配置轨迹图的参数

QTrailOverlay轨迹图层对象常用属性如下表所示:

属性 说明
NSArray <QTrailLine *> *lines 轨迹线数据
QTrailLineStyle *style 轨迹线样式

QTrailLineStyle对象用于配置轨迹线的样式,常用属性如下表所示:

属性 说明
NSArray <UIColor *> *colors 轨迹线的颜色数组,数组长度需大于0,且最大长度为3。
用法说明: 实现单色线,则colors数组为A。实现A-B的渐变线,则colors数组传入A, B。
int highlightDuration 轨迹高亮时间,单位:毫秒。取值大于等于0,等于0时无动画,默认200ms。
CGFloat animateRatio 动画速率,取值大于0,默认1。
CGFloat width 轨迹线线宽,单位:point,默认值2。

1、配置轨迹图颜色方式如下所示:

QHeatGradient对象为矢量热力图的颜色梯度对象,配置矢量热力图颜色方式如下:

NSArray<UIColor *> *colorDB = @[
            [UIColor purpleColor],
            [UIColor cyanColor],
            [UIColor greenColor]
];

self.trail.style.colors = colorDB;

// 设置颜色后,要调用该方法刷新轨迹图
[self.trail setNeedsDisplay];


2、切换轨迹图展示层级:

轨迹图展示层级默认在楼块之上POI之下(QOverlayLevelAboveBuildings)。如果需要调整展示层级,可以通过如下方法:

QTrailOverlayView *hv = (QTrailOverlayView *) [self.mapView viewForOverlay:self.trail];

hv.displayLevel = QOverlayLevelAboveLabels;


3、轨迹图动画效果:

轨迹图支持配置动画速率、高亮时间两个动画效果,使用方法如下:

// 动画速率
self.trail.style.animateRatio = 10;
// 高亮时间
self.trail.style.highlightDuration = arc4random() % 2000 + 1000;
// 刷新样式需调用此接口,否则新样式不生效
[self.trail setNeedsDisplay];


二、移除轨迹图

调用mapView的removeOverlay:即可将轨迹图移除:

[self.mapView removeOverlay:self.trail];