百度路书做轨迹回放-vue

16 篇文章 0 订阅

其实不管是vue还是其他框架 还是jq  都是用原生js写 都一样的。

首先第一步众所周知

<script src="http://api.map.baidu.com/api?v=2.0&ak=你的K"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/LuShu/1.2/src/LuShu_min.js"></script>

这里注意ak后面不要加别的东西,否则会报错。

我先说一下思路,就是首先要根据GPS点画一条轨迹,然后将这些GPS点喂给百度lushu,然后小车按着我们规定好的轨迹运动。

话不多说上代码:

data(){
    return{
        gpsArr:[],//后台拿到的gps点数组
        speed:4000
    }
}
initMap(){
    var map = new BMap.Map("mymap");
    map.enableScrollWheelZoom(new BMap.Point(116.404, 39.915), 13);
    map.centerAndZoom();
    var arrPois = [];

    for (let i = 0; i < this.gpsArr.length; i++) {
      var p0 = this.gpsArr[i].longtitude;
      var p1 = this.gpsArr[i].latitude;
      // var checksum = makerArry[i].checksum;
      var point = new BMap.Point(p0, p1); //118.230272,33.482474
      arrPois.push(point);
    }
    //画轨迹
      var polyLine = new BMap.Polyline(arrPois, {
        strokeColor: "blue", //设置颜色
        strokeWeight: 5, //宽度
        strokeOpacity: 0.5 //透明度
      });
      map.addOverlay(polyLine);
      //画轨迹结束
}

此时在地图中已经看到我们画的线了,接下来创建路书

initLushu(map, arrPois, mycaiId) {
      this.lushu = new BMapLib.LuShu(map, arrPois, {
        defaultContent: mycaiId, //"从天安门到百度大厦"
        autoView: true, //是否开启自动视野调整,如果开启那么路书在运动过程中会根据视野自动调整
        icon: new BMap.Icon(
          "http://developer.baidu.com/map/jsdemo/img/car.png",
          new BMap.Size(52, 26),
          {
            anchor: new BMap.Size(27, 13)
          }
        ),
        speed: this.speed,
        enableRotation: true, //是否设置marker随着道路的走向进行旋转
        landmarkPois: [
          {
            lng: 116.306954,
            lat: 40.05718,
            html: "加油站",
            pauseTime: 2
          }
        ]
      });
    },

接下来 生成路书,在这里我们生成路书之前可能要重新写一下路书的move函数,因为我们各自的需求不一样,可能需要修改

BMapLib.LuShu.prototype._move = function(initPos, targetPos, effect) {
        var pointsArr = [initPos, targetPos]; //点数组
        var me = this,
          //当前的帧数
          currentCount = 0,
          //步长,米/秒
          timer = 10,
          step = this._opts.speed / (1000 / timer),
          //初始坐标
          init_pos = this._projection.lngLatToPoint(initPos),
          //获取结束点的(x,y)坐标
          target_pos = this._projection.lngLatToPoint(targetPos),
          //总的步长
          count = Math.round(me._getDistance(init_pos, target_pos) / step);
        //显示折线 syj201607191107
        //如果想显示小车走过的痕迹,放开这段代码就行
        // this._map.addOverlay(
        //   new BMap.Polyline(pointsArr, {
        //     strokeColor: "#111",
        //     strokeWeight: 5,
        //     strokeOpacity: 0.5
        //   })
        // ); // 画线
        //如果小于1直接移动到下一点
        if (count < 1) {
          me._moveNext(++me.i);
          return;
        }
        me._intervalFlag = setInterval(function() {
          //两点之间当前帧数大于总帧数的时候,则说明已经完成移动
          if (currentCount >= count) {
            clearInterval(me._intervalFlag);
            //移动的点已经超过总的长度
            if (me.i > me._path.length) {
              return;
            }
            //运行下一个点
            me._moveNext(++me.i);
          } else {
            currentCount++;
            var x = effect(init_pos.x, target_pos.x, currentCount, count),
              y = effect(init_pos.y, target_pos.y, currentCount, count),
              pos = me._projection.pointToLngLat(new BMap.Pixel(x, y));
            //设置marker
            if (currentCount == 1) {
              var proPos = null;
              if (me.i - 1 >= 0) {
                proPos = me._path[me.i - 1];
              }
              if (me._opts.enableRotation == true) {
                me.setRotation(proPos, initPos, targetPos);
              }
              if (me._opts.autoView) {
                if (!me._map.getBounds().containsPoint(pos)) {
                  me._map.setCenter(pos);
                }
              }
            }
            //正在移动
            me._marker.setPosition(pos);
            //设置自定义overlay的位置
            me._setInfoWin(pos);
          }
        }, timer);
      };

重写完之后就可以调用路书的api来控制小车移动还是停止了

lushu.start()   pause()  stop() 

好最后整理一遍

<template>
    <div>
        <div id='mymap'></div>
        <button @click='play(1)'>播放</button>
        <button @click='play(2)'>暂停</button>
        <button @click='play(3)'>停止</button>
    </div>
    
</template>
<script>
    data(){
        return{
            gosArr:[],//后台拿到的gps点数组
            speed:4000,//速度
            lushu:{},//路书
            mycaiId:'京123465',
            myMap: {} //地图
        }
    },
    methods:{
           initMap(){
                var map = new BMap.Map("mymap");
                map.enableScrollWheelZoom(new BMap.Point(116.404, 39.915), 13);
                map.centerAndZoom();
                var arrPois = [];

                for (let i = 0; i < this.gpsArr.length; i++) {
                  var p0 = this.gpsArr[i].longtitude;
                  var p1 = this.gpsArr[i].latitude;
                  // var checksum = makerArry[i].checksum;
                  var point = new BMap.Point(p0, p1); //118.230272,33.482474
                  arrPois.push(point);
                }
                //画轨迹
                  var polyLine = new BMap.Polyline(arrPois, {
                    strokeColor: "blue", //设置颜色
                    strokeWeight: 5, //宽度
                    strokeOpacity: 0.5 //透明度
                  });
                  map.addOverlay(polyLine);
                  //画轨迹结束
                BMapLib.LuShu.prototype._move = function(initPos, targetPos, effect) {
        var pointsArr = [initPos, targetPos]; //点数组
        var me = this,
          //当前的帧数
          currentCount = 0,
          //步长,米/秒
          timer = 10,
          step = this._opts.speed / (1000 / timer),
          //初始坐标
          init_pos = this._projection.lngLatToPoint(initPos),
          //获取结束点的(x,y)坐标
          target_pos = this._projection.lngLatToPoint(targetPos),
          //总的步长
          count = Math.round(me._getDistance(init_pos, target_pos) / step);
        //显示折线 syj201607191107
        //如果想显示小车走过的痕迹,放开这段代码就行
        // this._map.addOverlay(
        //   new BMap.Polyline(pointsArr, {
        //     strokeColor: "#111",
        //     strokeWeight: 5,
        //     strokeOpacity: 0.5
        //   })
        // ); // 画线
        //如果小于1直接移动到下一点
        if (count < 1) {
          me._moveNext(++me.i);
          return;
        }
        me._intervalFlag = setInterval(function() {
          //两点之间当前帧数大于总帧数的时候,则说明已经完成移动
          if (currentCount >= count) {
            clearInterval(me._intervalFlag);
            //移动的点已经超过总的长度
            if (me.i > me._path.length) {
              return;
            }
            //运行下一个点
            me._moveNext(++me.i);
          } else {
            currentCount++;
            var x = effect(init_pos.x, target_pos.x, currentCount, count),
              y = effect(init_pos.y, target_pos.y, currentCount, count),
              pos = me._projection.pointToLngLat(new BMap.Pixel(x, y));
            //设置marker
            if (currentCount == 1) {
              var proPos = null;
              if (me.i - 1 >= 0) {
                proPos = me._path[me.i - 1];
              }
              if (me._opts.enableRotation == true) {
                me.setRotation(proPos, initPos, targetPos);
              }
              if (me._opts.autoView) {
                if (!me._map.getBounds().containsPoint(pos)) {
                  me._map.setCenter(pos);
                }
              }
            }
            //正在移动
            me._marker.setPosition(pos);
            //设置自定义overlay的位置
            me._setInfoWin(pos);
          }
        }, timer);
      };    
            this.initLushu(map, arrPois, this.mycaiId);
            },
            initLushu(map, arrPois, mycaiId) {
                  this.lushu = new BMapLib.LuShu(map, arrPois, {
                    defaultContent: mycaiId, //"从天安门到百度大厦"
                    autoView: true, //是否开启自动视野调整,如果开启那么路书在运动过程中会根据视野自动调整
                    icon: new BMap.Icon(
                      "http://developer.baidu.com/map/jsdemo/img/car.png",
                      new BMap.Size(52, 26),
                      {
                        anchor: new BMap.Size(27, 13)
                      }
                    ),
                    speed: this.speed,
                    enableRotation: true, //是否设置marker随着道路的走向进行旋转
                    landmarkPois: [
                      {
                        lng: 116.306954,
                        lat: 40.05718,
                        html: "加油站",
                        pauseTime: 2
                      }
                    ]
                  });
                },
                play(val) {
      if (this.arrIndex >= this.gpsArr.length - 3) {
        this.arrIndex = 0;
      }
      switch (val) {
        case 1:
          this.lushu.start();
          break;
        case 2:
          this.lushu.pause();
          break;
        case 3:
          this.lushu.stop();
          this.arrIndex = 0;
          this.percentage = 0;
          break;
      }
    },
                
    }

</script>
<style scoped>
</style>

 

Vue.js是一个用于构建用户界面的开源JavaScript框架,可以简化开发过程并提高开发效率。百度地图JS API是百度地图提供的一套JavaScript API,可以在网页中集成地图功能。轨迹回放是指根据已经记录的轨迹数据,将轨迹在地图上以动画的形式重新播放出来。 在Vue中使用百度地图JS API进行轨迹回放,首先需要在Vue项目中引入百度地图的JS文件,并在Vue实例的mounted钩子函数中初始化地图。 在获取到轨迹数据后,可以使用百度地图提供的Polyline类创建一个折线对象,并将轨迹点添加到折线对象中。然后使用地图的addOverlay方法将折线对象添加到地图上,实现轨迹的显示。 为了实现轨迹回放效果,可以使用Vue的定时器函数setInterval来定时改变折线对象的显示范围,从而实现轨迹的动画效果。可以通过设置折线对象的路径切片来控制每次显示的轨迹点数量,并随着时间的推移逐渐增加显示的点数,从而实现回放效果。 同时,为了提高回放的流畅度和体验,可以使用百度地图提供的动画效果类Effect来给轨迹点添加动画效果,比如平滑移动、旋转等,使得轨迹回放更加真实。 总而言之,利用Vue百度地图JS API,可以很方便地实现轨迹回放功能。通过初始化地图、创建折线对象、定时改变折线对象的显示范围,再加上动画效果的设置,就能够实现一个带有回放功能的轨迹展示页面。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值