欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高德地图使用笔记-历史轨迹回放,动态改变速度

程序员文章站 2022-07-11 15:37:17
...

高德地图使用笔记-历史轨迹回放,动态改变速度

需求介绍

应客户要求,显示车辆GPS历史轨迹,并且要带入相应速度,显示当时速度以及相应进度,所以综合考量后界定用高德地图(因为穷,所以没有使用轨迹纠偏,GPS数据是5分钟一个点位,所以历史轨迹非常感人)
高德地图使用笔记-历史轨迹回放,动态改变速度

资源引入

1.引入高德资源文件
高德官方api地址

<link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css"/> 
<script language="javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=你的key&plugin=AMap.GraspRoad"></script>

开始绘制地图

使用到的api地址
高德地图轨迹展示
高德地图轨迹展示列子
1.发送请求拿到相应的所需数据

        request({
            url: 'xxxxxxxxxxxxxxxxxxx',
            method: 'POST',
            data: { carNo: this.state.carNo, endTime: moment(this.state.endValue).format('YYYY-MM-DD HH:mm:ss'), startTime: moment(this.state.startValue).format("YYYY-MM-DD HH:mm:ss") }//个人所需查询条件
        }).then(data => {
            if (data.rc == 0) {
                console.log(data)
                let steep = []//速度
                let path = []//经纬度
                data.ret.list.forEach((item) => {
                    steep.push(item.speed == 0 ? 50 : item.speed)//因为GPS数据有问题所以自己调整了一下
                    path.push([item.lng, item.lat])//lng:精度,lat:维度
                })
                //后台没有给我转换数据格式,所以只能自己装换,因为不知道有多少数据,所以用了一个2s的定时器
                setTimeout(() => {
                    this.setState({
                        steep: steep,//设置全局速度
                        path: path//设置全局经纬度
                    }, () => {
                        this.load()//开始绘制
                    })
                }, 2000)

            } else {
                message.warning('查询错误,请重新查询')
            }
        })

2.初始化地图轨迹
当我们拿到所需要数据的时候
path:经纬度二维数组数据
steep:速度数组数据

    load = () => {
        AMapUI.load(['ui/misc/PathSimplifier'], function (PathSimplifier) {
			//先判断是否支持
            if (!PathSimplifier.supportCanvas) {
                alert('当前环境不支持 Canvas!');
                return;
            }

            //启动地图初始化
            this.initPage(PathSimplifier);//PathSimplifier 这个对象很重要,
        }.bind(this));
    }
  	initPage = (PathSimplifier) => {
  		//普通的初始化
        let map = new AMap.Map("containerTwo", {
            resizeEnable: true,
            mapStyle: 'amap://styles/a8fdec119d6af8ed151ae83c97eff4d6', //设置地图的显示样式
            zoom: 15,//现实大小
            center: [116.478935, 39.997761]//中心位置
        });

        //创建组件实例
        var pathSimplifierIns = new PathSimplifier({
            zIndex: 100,
            map: map, //所属的地图实例
            getPath: function (pathData, pathIndex) {
                //返回轨迹数据中的节点坐标信息,[AMap.LngLat, AMap.LngLat...] 或者 [[lng|number,lat|number],...]
                return pathData.path;
            },
            getHoverTitle: function (pathData, pathIndex, pointIndex) {
                //返回鼠标悬停时显示的信息
                if (pointIndex >= 0) {
                    //鼠标悬停在某个轨迹节点上
                    return pathData.name + ',点:' + pointIndex + '/' + pathData.path.length;
                }
                //鼠标悬停在节点之间的连线上
                return pathData.name + ',点数量' + pathData.path.length;
            },
            renderOptions: {
                //轨迹线的样式
                pathLineStyle: {
                    strokeStyle: 'red',
                    lineWidth: 6,
                    dirArrowStyle: true
                }
            },
            //绘制路线节点
            renderOptions: {
                renderAllPointsIfNumberBelow: 100 //绘制路线节点,如不需要可设置为-1
            }
        });

        //设置数据
        pathSimplifierIns.setData([{
            name: '路线0',
            path: this.state.path
        }]);
        //创建一个巡航器 novg0需要提前设置为全局变量
        navg0 = pathSimplifierIns.createPathNavigator(0, //关联第1条轨迹
            {
                loop: false, //循环播放
                speed: 5,//形式速度
                pathNavigatorStyle: {
                    width: 24,//图中小车宽度
                    height: 48,//图中小车高度
                    //使用图片
                    content: PathSimplifier.Render.Canvas.getImageContent('./img/xc1.png'),//图片的引入路径是打包后的路径,也就是index.html的图片引入路径
                    strokeStyle: null,
                    fillStyle: null,
                    //经过路径的样式
                    pathLinePassedStyle: {
                        lineWidth: 6,
                        strokeStyle: 'black',
                        dirArrowStyle: {
                            stepSpace: 15,
                            strokeStyle: 'red'
                        }
                    }
                },
            });
		//创建一个点
        navg0.marker = new AMap.Marker({
            offset: new AMap.Pixel(12, -10),
            content: `<div  class=${style.markerInfo}>当前速度 : 100Km/h</div>`,//设置当前点信息窗口显示内容
            map: map
        });
        navg0.on('move', function (e) {
            navg0.marker.setPosition(navg0.getPosition());
        });
       
       
    }

3.开始播放历史轨迹
这个时候页面已经有了一个地图和一条巡航轨迹,现在可以播放了

        var steep = this.state.steep
        navg0.start();//开始播放
        timer= setInterval(() => {//定时器需要提前声明

            //当移动到最后一个点位时清除定时器
            //navg0.getCursor() 获取小车移动到具体点位的信息
            if (navg0.getCursor().idx == steep.length - 1) {
                clearInterval(timer)
            }
            //navg0.setSpeed()  设置小车移动速度,*10是我的数据不正常
            //将获取的位置index=navg0.getCursor().idx  取出速度steep数组的对应当前速度
            navg0.setSpeed(steep[navg0.getCursor().idx] * 10)
            //改变播放进度条
            this.setState({
            	inputValue:Math.round((navg0.getCursor().idx)/steep.length*100)
            })
			//设置小车信息窗口内容
			//navg0.marker.setContent()
            navg0.marker.setContent(`<div  class=${style.markerInfo}>当前速度 : ${steep[navg0.getCursor().idx]}Km/h</div>`)
        }, 500)

到此为止,就做完了,因为穷没有使用轨迹纠偏所以可以使用这个方法,谢谢观看