腾讯地图GL(轨迹回放)

腾讯地图轨迹回放的实现

效果图
在这里插入图片描述

  • 首先了解一下需要使用到的API
API定义
MultiMarker(必选)用于实现在地图中的点标注功能,可以根据用户设置的样式同时标注多个位置
InfoWindow(可选)信息窗口,一般用于地点的摘要性信息的展示,Javascript API GL 提供了TMap.infoWindow类,用于实现这一功能
MultiPolyline(可选)矢量图形指绘制在地图上的二维线、面覆盖物, 具有广泛的应用场景,用于构建折线,常用于表现规划线路、行动轨迹、区域边界等
  • 实现思路
    1、将轨迹数据进行处理,遍历经纬度,全部转为腾讯地图new TMap.LatLng(lat,lng),放进一个数组变量,用于后面渲染回放轨迹和渲染轨迹线;
    2、创建一个数组变量,用来存放信息窗口需要展示的内容
for (let i = 0; i < arr.length; i++) {
            if (i !== arr.length - 1) {
                if (arr[i + 1].lon !== arr[i].lon && arr[i + 1].lat !== arr[i].lat) { // 去重和一些没有经纬度的数据
                    this.polylineData.push(new TMap.LatLng(arr[i].lat, arr[i].lon));
                    this.trackData.push({
                        position: new TMap.LatLng(arr[i].lat, arr[i].lon),
                        updateTime: arr[i].updateTime,
                        speed: arr[i].speed,
                        imei: arr[i].imei,
                        coordType: arr[i].coordType,
                    });
                }
            } else {
                this.polylineData.push(new TMap.LatLng(arr[i].lat, arr[i].lon));
                this.trackData.push({
                    position: new TMap.LatLng(arr[i].lat, arr[i].lon),
                    updateTime: arr[i].updateTime,
                    speed: arr[i].speed,
                    imei: arr[i].imei,
                    coordType: arr[i].coordType,
                });
            }
        }

3、设置轨迹的相关图标样式,包括起点、终点和行走的图标

this.playBackMarkers.setStyles({
            'car-down': new TMap.MarkerStyle({
                width: 30,
                height: 30,
                anchor: {
                    x: 10,
                    y: 20,
                },
                faceTo: 'screen',
                rotate: 0,
                src: require('../../assets/images/car.png'),
            }),
            polyMark: new TMap.MarkerStyle({
                width: 40,
                height: 40,
                anchor: { x: 15, y: 32 },
                src: require('../../assets/images/coordinate-spot.png'),
            }),
            start: new TMap.MarkerStyle({
                width: 25,
                height: 35,
                anchor: { x: 15, y: 32 },
                src: require('../../assets/images/start.png'),
            }),
            end: new TMap.MarkerStyle({
                width: 25,
                height: 35,
                anchor: { x: 15, y: 32 },
                src: require('../../assets/images/end.png'),
            }),
        });

4、通过MultiMarker.setGeometries设置固定的起点、终点和行走开始点的图标

this.playBackMarkers.setGeometries([
            {
                id: 'car',
                styleId: 'car-down',
                rank: 4,
                position: this.polylineData[0],
            },
            {
                id: 'start',
                styleId: 'start',
                updateTime: this.trackData[0].updateTime,
                speed: this.trackData[0].speed,
                rank: 4,
                imei: this.trackData[0].imei,
                coordType: this.trackData[0].coordType,
                position: this.trackData[0].position,
            },
            {
                id: 'end',
                styleId: 'end',
                rank: 4,
                updateTime: this.trackData[this.trackData.length - 1].updateTime,
                speed: this.trackData[this.trackData.length - 1].speed,
                imei: this.trackData[this.trackData.length - 1].imei,
                coordType: this.trackData[this.trackData.length - 1].coordType,
                position: this.trackData[this.trackData.length - 1].position,
            },
        ]);

5、通过MultiMarker.add将需要回放的点数据全部添加进坐标点,从而在地图上将所有的轨迹点显示出来

this.trackData.map((item, index) => {
            if (index != 0 && index != this.trackData.length - 1) {
                return this.playBackMarkers.add([
                    {
                        id: index,
                        styleId: 'polyMark',
                        position: item.position,
                        updateTime: item.updateTime,
                        speed: item.speed,
                        imei: item.imei,
                        rank: 2,
                        coordType: item.coordType,
                    },
                ]);
            }
        });

6、创建MultiPolyline轨迹线,设置PolylineStyle的相关样式,将前面处理好的轨迹数据通过MultiPolyline.add添加进去

this.polylineLayer = new TMap.MultiPolyline({
            map: this.map, // 绘制到目标地图
            // 折线样式定义
            styles: {
                style_blue: new TMap.PolylineStyle({
                    color: '#3777FF', // 线填充色
                    width: 6, // 折线宽度
                    borderWidth: 2, // 边线宽度
                    borderColor: '#FFF', // 边线颜色
                    lineCap: 'round', // 线端头方式
                    // eraseColor: 'rgba(190,188,188,1)',
                    eraseColor: 'rgba(74, 179, 34, .7)',
                    showArrow: true,
                    arrowOptions: {
                        width: 6,
                        height: 4,
                    },
                }),
            },
            geometries: [],
        });

        this.polylineLayer.setGeometries([
            {
                id: 'erasePath',
                styleId: 'style_blue',
                paths: this.polylineData,
            },
        ]);

7、创建InfoWindow信息窗体
8、做一个开始回放、暂停回放、重新回放、结束回放的事件处理

switchType(type) {
        if (type == 'start') {
            this.playBackMarkers.moveAlong(
                {
                    car: {
                        path: this.polylineData, 
                        speed: 70,
                    },
                },
                {
                    autoRotation: true,
                }
            );
        } else if (type == 'stop') {
            this.playBackMarkers.pauseMove();
        } else if (type == 'continue') {
            this.playBackMarkers.resumeMove();
        } else if (type == 'reStart') {
            this.playBackMarkers.moveAlong(
                {
                    car: {
                        path: this.polylineData,
                        speed: 70,
                    },
                },
                {
                    autoRotation: true,
                }
            );
        } else if (type == 'closePlackBack') {
            if (this.trackData.length > 3) {
                this.infoWindow.destroy();
                this.polylineData = [];
                this.trackData = [];
                this.playBackMarkers.stopMove();
                this.playBackMarkers.setGeometries([]);
                this.playBackMarkers.setMap(null);
                this.polylineLayer.setMap(null);
            }
        }
    }

8、对轨迹回放的进行监听,执行腾讯地图的路线擦除,保证轨迹的填充线能够跟着行走图标的实际情况走

 // 使用路线擦除接口 eraseTo, https://lbs.qq.com/webApi/javascriptGL/glDoc/glDocVector
                this.polylineLayer.eraseTo(
                    'erasePath',
                    passedLatLngs.length - 1,
                    passedLatLngs[passedLatLngs.length - 1]
                );

9、监听marker点的点击,将点击后获取到的marker点赋值到信息窗体

  • 总结
    1、轨迹回放结束时务必要清除MultiMarker、MultiPolyline,关闭infoWindow信息窗体
    2、infoWindow上的点击事件需要通过监听元素来添加,并且通过bind来改变this指向,否则不生效
    3、轨迹数据一定要做去重处理,否则轨迹的填充线在回放的时候会有问题
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值