vue2 百度地图实现 车在线路上移动 BMap、BMapGL

news2024/11/27 2:21:06

文章目录

  • 效果
  • BMap 实现
  • vue2 中BMap实现
  • vue2 中使用BMapGL实现

参考文章: 百度地图API实时画出动态运行轨迹(一条行驶轨迹),车头实时指向行驶方向,设置角度偏移

下文中可能用到的图片统一放在上面,自取。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

效果

效果基本上都是这样,只是实现方式不同
在这里插入图片描述

BMap 实现

新建html文件,粘贴下面代码。粘贴完后保存打开即可看见效果。

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>百度地图的动态行驶轨迹</title>
    <script type="text/javascript"
        src="http://api.map.baidu.com/api?v=2.0&ak=wIt2mDCMGWRIi2pioR8GZnfrhSKQHzLY"></script>
</head>

<body>
    <div id="mapId" style="height: 500px;">
        <script>
            var map = new BMap.Map("mapId");
            map.enableScrollWheelZoom(); // 开启鼠标滚轮缩放
            map.addControl(new BMap.ScaleControl()); // 添加比例尺控件
            // map.centerAndZoom("青岛", 8);

            var PointArr = [
                { lat: 36.10339957700999, lng: 120.4207801005104 },
                { lat: 36.10349055332635, lng: 120.42113539348455 },
                { lat: 36.10370795896673, lng: 120.42162977768736 },
                { lat: 36.10411490190429, lng: 120.42166901055167 },
                { lat: 36.104232027406695, lng: 120.42185015059275 },
                { lat: 36.10425620255758, lng: 120.42202022562539 },
                { lat: 36.104265908631284, lng: 120.42208225102176 },
                { lat: 36.104399968669526, lng: 120.42187425183421 },
                { lat: 36.10452708476511, lng: 120.42076268466177 },
                { lat: 36.10480132817409, lng: 120.4196557913201 },
                { lat: 36.10560773716036, lng: 120.418951386886 },
                { lat: 36.10621159088823, lng: 120.41900182905378 },
                { lat: 36.1064641068988, lng: 120.41992809616544 },
                { lat: 36.10679444086644, lng: 120.42102125032955 },
                { lat: 36.107010189089046, lng: 120.42182982905027 },
                { lat: 36.107014665948654, lng: 120.42193587265254 },
                { lng: 120.42201589513277, lat: 36.10700627324672 },
                { lng: 120.42201589513277, lat: 36.10700627324672 },
                { lng: 120.42236704579075, lat: 36.10708566579729 },
                { lng: 120.42269817692573, lat: 36.107201270041955 },
                { lng: 120.42239277578172, lat: 36.10812797579566 },
                { lng: 120.42175457671763, lat: 36.10947659586882 },
                { lng: 120.42144906678747, lat: 36.11028554037044 },
                { lng: 120.4213722360578, lat: 36.110547069787465 },
                { lng: 120.4213722360578, lat: 36.110547069787465 },
                { lng: 120.4213722360578, lat: 36.110547069787465 },
                { lng: 120.4213722360578, lat: 36.110547069787465 },
                { lng: 120.4213722360578, lat: 36.110547069787465 },
                { lng: 120.4213722360578, lat: 36.110547069787465 },
                { lng: 120.4213722360578, lat: 36.110547069787465 },
                { lng: 120.4213722360578, lat: 36.110547069787465 },
                { lng: 120.4213722360578, lat: 36.110547069787465 },
                { lng: 120.42134433787885, lat: 36.110691285540966 },
                { lng: 120.42234193234574, lat: 36.110931417305515 },
                { lng: 120.42374305054953, lat: 36.11109804633305 },
                { lng: 120.42478859440246, lat: 36.111102173671576 },
                { lng: 120.42606467439863, lat: 36.11129314178323 },
                { lng: 120.4274220550685, lat: 36.11148065963647 },
                { lng: 120.42831965719076, lat: 36.111638311669736 },
                { lng: 120.42839951065358, lat: 36.11164240198062 },
                { lng: 120.42839951065358, lat: 36.11164240198062 },
                { lng: 120.42839951065358, lat: 36.11164240198062 },
                { lng: 120.42839951065358, lat: 36.11164240198062 },
                { lng: 120.42839951065358, lat: 36.11164240198062 },
                { lng: 120.42839951065358, lat: 36.11164240198062 },
                { lng: 120.42839951065358, lat: 36.11164240198062 },
                { lng: 120.42839951065358, lat: 36.11164240198062 },
                { lng: 120.42869196887202, lat: 36.1116737914188 },
                { lng: 120.43031048017785, lat: 36.11190642360766 },
                { lng: 120.43239173942534, lat: 36.11229570404404 },
                { lng: 120.43368467575368, lat: 36.11281195352835 },
                { lng: 120.43371757862009, lat: 36.11284016439977 },
                { lng: 120.43379230066179, lat: 36.11284161798212 },
                { lng: 120.43441423254144, lat: 36.113205746094536 },
                { lng: 120.43549342023326, lat: 36.11391074053337 },
                { lng: 120.43637497341942, lat: 36.11441797319607 },
                { lng: 120.4365024200745, lat: 36.11445405475196 },
                { lng: 120.43670459776231, lat: 36.11458083085174 },
                { lng: 120.43745246924915, lat: 36.11507070008782 },
                { lng: 120.43821097991501, lat: 36.115416050767585 },
                { lng: 120.43821097991501, lat: 36.115416050767585 },
                { lng: 120.43821097991501, lat: 36.115416050767585 },
                { lng: 120.43821097991501, lat: 36.115416050767585 },
                { lng: 120.43821097991501, lat: 36.115416050767585 },
                { lng: 120.43823585473245, lat: 36.11541929557907 },
                { lng: 120.43823585473245, lat: 36.11541929557907 },
                { lng: 120.43823585473245, lat: 36.11541929557907 },
                { lng: 120.43823585473245, lat: 36.11541929557907 },
                { lng: 120.43823585473245, lat: 36.11541929557907 },
                { lng: 120.43823585473245, lat: 36.11541929557907 },
                { lng: 120.43823585473245, lat: 36.11541929557907 },
                { lng: 120.43859812511984, lat: 36.115583971494395 },
                { lng: 120.43901701857004, lat: 36.115714318017346 },
                { lng: 120.43928467292172, lat: 36.11582517772885 },
                { lng: 120.43959708522435, lat: 36.115963587312805 },
                { lng: 120.43986466921422, lat: 36.116047547858166 },
                { lng: 120.44007952157578, lat: 36.11611896447754 },
                { lng: 120.440167025596, lat: 36.11612294605039 },
                { lng: 120.440167025596, lat: 36.11612294605039 },
                { lng: 120.44024360205321, lat: 36.116138815526504 },
                { lng: 120.44024360205321, lat: 36.116138815526504 },
                { lng: 120.44024360205321, lat: 36.116138815526504 },
                { lng: 120.44026150723737, lat: 36.11614702160796 },
                { lng: 120.44027344364953, lat: 36.11615215895656 },
                { lng: 120.44027344364953, lat: 36.11615215895656 },
                { lng: 120.44028836484941, lat: 36.1161593311561 },
                { lng: 120.44034209724579, lat: 36.116201960713745 },
                { lng: 120.44048233691922, lat: 36.116254585044935 },
                { lng: 120.44048233691922, lat: 36.116254585044935 },
                { lng: 120.4405738257871, lat: 36.116276646228826 },
                { lng: 120.44073595695149, lat: 36.11635856195875 },
                { lng: 120.44115463412841, lat: 36.11652357056175 },
                { lng: 120.44118546544034, lat: 36.11653994619434 },
                { lng: 120.44118546544034, lat: 36.11653994619434 },
                { lng: 120.44121529948468, lat: 36.1165533090833 }];
            map.centerAndZoom(PointArr, 13);// 根据经纬度显示地图的范围
            map.setViewport(PointArr);// 根据提供的地理区域或坐标设置地图视野

            addStartMarker(new BMap.Point(PointArr[0].lng, PointArr[0].lat), '起点', map);
            var carMk;//先将终点坐标展示的mark对象定义
            //小车行驶图标
            var drivingPoint = new BMap.Icon('http://developer.baidu.com/map/jsdemo/img/car.png', new BMap.Size(52, 26), {
                anchor: new BMap.Size(27, 13),
                imageSize: new BMap.Size(52, 26)
            });
            //终点图标
            var terminalPoint = new BMap.Icon('endMap.png', new BMap.Size(45, 45), {
                anchor: new BMap.Size(20, 45),
                imageSize: new BMap.Size(45, 45)
            });
            var i = 0;
            var interval = setInterval(function () {
                if (i >= PointArr.length) {
                    clearInterval(interval);
                    return;
                }
                drowLine(map, PointArr[i], PointArr[i + 1]);//画线调用
                i = i + 1;
            }, 1000);

            // 划线
            function drowLine(map, PointArr, PointArrNext) {
                if (PointArrNext != undefined) {
                    var polyline = new BMap.Polyline(
                        [
                            new BMap.Point(PointArr.lng, PointArr.lat),
                            new BMap.Point(PointArrNext.lng, PointArrNext.lat)
                        ],
                        {
                            strokeColor: "red",
                            strokeWeight: 7,
                            strokeOpacity: 1
                        });   //创建折线
                    map.addOverlay(polyline);
                    addMarkerEnd(new BMap.Point(PointArrNext.lng, PointArrNext.lat), '小车行驶', map, PointArrNext, new BMap.Point(PointArr.lng, PointArr.lat));//添加图标
                } else {
                    addMarkerEnd(new BMap.Point(PointArr.lng, PointArr.lat), '终点', map);//添加终点图标
                }
            }
            //添加起始图标
            function addStartMarker(point, name, mapInit) {
                if (name == "起点") {
                    var myIcon = new BMap.Icon("startMap.png", new BMap.Size(45, 45), {
                        anchor: new BMap.Size(20, 45),//这句表示图片相对于所加的点的位置mapStart
                        imageSize: new BMap.Size(45, 45)//图标所用的图片的大小,此功能的作用等同于CSS中的background-size属性。可用于实现高清屏的高清效果
                        // offset: new BMap.Size(-10, 45), // 指定定位位置
                        // imageOffset: new BMap.Size(0, 0 - 10 * 25) // 设置图片偏移
                    });
                    window.marker = new BMap.Marker(point, { icon: myIcon });  // 创建标注
                    mapInit.addOverlay(marker);               // 将标注添加到地图中
                    //marker.setAnimation(BMAP_ANIMATION_BOUNCE); //跳动的动画
                }
            }
            //添加行驶和终点图标
            function addMarkerEnd(point, name, mapInit, trackUnit, prePoint) {
                if (name == "小车行驶") {
                    if (carMk) {//先判断第一次进来的时候这个值有没有定义,有的话就清除掉上一次的。然后在进行画图标。第一次进来时候没有定义也就不走这块,直接进行画图标
                        mapInit.removeOverlay(carMk);
                    }
                    carMk = new BMap.Marker(point, { icon: drivingPoint });  // 创建标注
                    carMk.setRotation(trackUnit.route);//trackUnit.route
                    //getAngle(point,prePoint);// js求解两点之间的角度
                    carMk.setRotation(getAngle(point, prePoint) - 90);// 旋转的角度
                    mapInit.addOverlay(carMk);               // 将标注添加到地图中
                    //carMk.setAnimation(BMAP_ANIMATION_BOUNCE); //跳动的动画
                } else {
                    mapInit.removeOverlay(carMk);
                    carMk = new BMap.Marker(point, { icon: terminalPoint });  // 创建标注
                    mapInit.addOverlay(carMk);
                }
            }
            //获得角度的函数
            function getAngle(n, next) {
                var ret
                var w1 = n.lat / 180 * Math.PI
                var j1 = n.lng / 180 * Math.PI

                var w2 = next.lat / 180 * Math.PI
                var j2 = next.lng / 180 * Math.PI

                ret = 4 * Math.pow(Math.sin((w1 - w2) / 2), 2) - Math.pow(Math.sin((j1 - j2) / 2) * (Math.cos(w1) - Math.cos(w2)), 2);
                ret = Math.sqrt(ret);

                // var temp = Math.sin(Math.abs(j1 - j2) / 2) * (Math.cos(w1) + Math.cos(w2));
                var temp = Math.sin((j1 - j2) / 2) * (Math.cos(w1) + Math.cos(w2));
                console.log(temp)
                ret = ret / temp;

                ret = Math.atan(ret) / Math.PI * 180;
                ret += 90;

                // 这里用如此臃肿的if..else是为了判定追踪单个点的具体情况,从而调整ret的值
                if (j1 - j2 < 0) {
                    // console.log('j1<j2')
                    if (w1 - w2 < 0) {
                        // console.log('w1<w2')
                        ret;
                    } else {
                        // console.log('w1>w2')
                        ret = -ret + 180;
                    }
                } else {
                    // console.log('j1>j2')
                    if (w1 - w2 < 0) {
                        // console.log('w1<w2')
                        ret = 180 + ret;
                    } else {
                        // console.log('w1>w2')
                        ret = -ret;
                    }
                }
                return ret;
            }


        </script>
</body>

</html>

vue2 中BMap实现

关于vue2 中使用BMap就不详细介绍了,直接放代码。

<template>
  <div class="demo">
    <baidu-map id="bd_map_d" @ready="initMap1"></baidu-map>
    <!-- @ready="initMap1" -->
  </div>
</template>
<script
  type="text/javascript"
  src="http://api.map.baidu.com/api?v=2.0&ak=wIt2mDCMGWRIi2pioR8GZnfrhSKQHzLY"
></script>
<script>
export default {
  data() {
    return {
      setHeading: 64.5, // 旋转角度
      setTilt: 73, // 倾斜角度
      // baiduMap
      BMap: "",
      map: "",
      center: { lng: 0, lat: 0 },
      zoom: 3,
      carMk: "",
      drivingPoint: "",
      terminalPoint: "",
      myIcon: "https://www.picb.cc/image/iy7YSK",
      interval: null,
      PointArr: [
        { lat: 36.10339957700999, lng: 120.4207801005104 },
        { lat: 36.10349055332635, lng: 120.42113539348455 },
        { lat: 36.10370795896673, lng: 120.42162977768736 },
        { lat: 36.10411490190429, lng: 120.42166901055167 },
        { lat: 36.104232027406695, lng: 120.42185015059275 },
        { lat: 36.10425620255758, lng: 120.42202022562539 },
        { lat: 36.104265908631284, lng: 120.42208225102176 },
        { lat: 36.104399968669526, lng: 120.42187425183421 },
        { lat: 36.10452708476511, lng: 120.42076268466177 },
        { lat: 36.10480132817409, lng: 120.4196557913201 },
        { lat: 36.10560773716036, lng: 120.418951386886 },
        { lat: 36.10621159088823, lng: 120.41900182905378 },
        { lat: 36.1064641068988, lng: 120.41992809616544 },
        { lat: 36.10679444086644, lng: 120.42102125032955 },
        { lat: 36.107010189089046, lng: 120.42182982905027 },
        { lat: 36.107014665948654, lng: 120.42193587265254 },
        { lng: 120.42201589513277, lat: 36.10700627324672 },
        { lng: 120.42236704579075, lat: 36.10708566579729 },
        { lng: 120.42269817692573, lat: 36.107201270041955 },
        { lng: 120.42239277578172, lat: 36.10812797579566 },
        { lng: 120.42175457671763, lat: 36.10947659586882 },
        { lng: 120.42144906678747, lat: 36.11028554037044 },
        { lng: 120.4213722360578, lat: 36.110547069787465 },
        { lng: 120.42134433787885, lat: 36.110691285540966 },
        { lng: 120.42234193234574, lat: 36.110931417305515 },
        { lng: 120.42374305054953, lat: 36.11109804633305 },
        { lng: 120.42478859440246, lat: 36.111102173671576 },
        { lng: 120.42606467439863, lat: 36.11129314178323 },
        { lng: 120.4274220550685, lat: 36.11148065963647 },
        { lng: 120.42831965719076, lat: 36.111638311669736 },
        { lng: 120.42839951065358, lat: 36.11164240198062 },
        { lng: 120.42869196887202, lat: 36.1116737914188 },
        { lng: 120.43031048017785, lat: 36.11190642360766 },
        { lng: 120.43239173942534, lat: 36.11229570404404 },
        { lng: 120.43368467575368, lat: 36.11281195352835 },
        { lng: 120.43371757862009, lat: 36.11284016439977 },
        { lng: 120.43379230066179, lat: 36.11284161798212 },
        { lng: 120.43441423254144, lat: 36.113205746094536 },
        { lng: 120.43549342023326, lat: 36.11391074053337 },
        { lng: 120.43637497341942, lat: 36.11441797319607 },
        { lng: 120.4365024200745, lat: 36.11445405475196 },
        { lng: 120.43670459776231, lat: 36.11458083085174 },
        { lng: 120.43745246924915, lat: 36.11507070008782 },
        { lng: 120.43821097991501, lat: 36.115416050767585 },
        { lng: 120.43823585473245, lat: 36.11541929557907 },
        { lng: 120.43859812511984, lat: 36.115583971494395 },
        { lng: 120.43901701857004, lat: 36.115714318017346 },
        { lng: 120.43928467292172, lat: 36.11582517772885 },
        { lng: 120.43959708522435, lat: 36.115963587312805 },
        { lng: 120.43986466921422, lat: 36.116047547858166 },
        { lng: 120.44007952157578, lat: 36.11611896447754 },
        { lng: 120.440167025596, lat: 36.11612294605039 },
        { lng: 120.44024360205321, lat: 36.116138815526504 },
        { lng: 120.44026150723737, lat: 36.11614702160796 },
        { lng: 120.44027344364953, lat: 36.11615215895656 },
        { lng: 120.44028836484941, lat: 36.1161593311561 },
        { lng: 120.44034209724579, lat: 36.116201960713745 },
        { lng: 120.44048233691922, lat: 36.116254585044935 },
        { lng: 120.4405738257871, lat: 36.116276646228826 },
        { lng: 120.44073595695149, lat: 36.11635856195875 },
        { lng: 120.44115463412841, lat: 36.11652357056175 },
        { lng: 120.44118546544034, lat: 36.11653994619434 },
        { lng: 120.44121529948468, lat: 36.1165533090833 },
      ],
    };
  },
  methods: {
    initMap1({ BMap, map }) {
      this.BMap = BMap;
      this.map = map;
      this.center.lng = 116.404;
      this.center.lat = 39.915;
      this.zoom = 15;
      this.map = new BMap.Map("bd_map_d");
      this.map.enableScrollWheelZoom(); // 开启鼠标滚轮缩放
      this.map.addControl(new BMap.ScaleControl()); // 添加比例尺控件
      // map.centerAndZoom("青岛", 8);
      this.map.centerAndZoom(this.PointArr, 13); // 根据经纬度显示地图的范围
      this.map.setViewport(this.PointArr); // 根据提供的地理区域或坐标设置地图视野
      //小车行驶图标
      this.drivingPoint = new BMap.Icon(
        "http://developer.baidu.com/map/jsdemo/img/car.png",
        new BMap.Size(52, 26),
        {
          anchor: new BMap.Size(27, 13),
          imageSize: new BMap.Size(52, 26),
        }
      );
      var i = 0;
      this.interval = setInterval(() => {
        if (i >= this.PointArr.length) {
          clearInterval(this.interval);
          return;
        }
        this.drowLine(this.map, this.PointArr[i], this.PointArr[i + 1]); //画线调用
        i = i + 1;
      }, 1000);
      //终点图标
      this.terminalPoint = new BMap.Icon(
        "@/assets/bus/end.png",
        new BMap.Size(45, 45),
        {
          anchor: new BMap.Size(20, 45),
          imageSize: new BMap.Size(45, 45),
        }
      );
    },
    // 划线
    drowLine(map, PointArr, PointArrNext) {
      if (PointArrNext != undefined) {
        var polyline = new BMap.Polyline(
          [
            new BMap.Point(PointArr.lng, PointArr.lat),
            new BMap.Point(PointArrNext.lng, PointArrNext.lat),
          ],
          {
            strokeColor: "red",
            strokeWeight: 7,
            strokeOpacity: 1,
          }
        ); //创建折线
        map.addOverlay(polyline);
        this.addMarkerEnd(
          new BMap.Point(PointArrNext.lng, PointArrNext.lat),
          "小车行驶",
          map,
          PointArrNext,
          new BMap.Point(PointArr.lng, PointArr.lat)
        ); //添加图标
      } else {
      }
    },
    //添加行驶和终点图标
    addMarkerEnd(point, name, mapInit, trackUnit, prePoint) {
      if (name == "小车行驶") {
        if (this.carMk) {
          mapInit.removeOverlay(this.carMk);
        }
        this.carMk = new BMap.Marker(point, { icon: this.drivingPoint }); // 创建标注
        this.carMk.setRotation(trackUnit.route); //trackUnit.route
        this.carMk.setRotation(this.getAngle(point, prePoint) - 90); // 旋转的角度
        mapInit.addOverlay(this.carMk); // 将标注添加到地图中
      } else {
        mapInit.removeOverlay(this.carMk);
        this.carMk = new BMap.Marker(point, { icon: this.terminalPoint }); // 创建标注
        mapInit.addOverlay(this.carMk);
      }
    },
    //获得角度的函数
    getAngle(n, next) {
      var ret;
      var w1 = (n.lat / 180) * Math.PI;
      var j1 = (n.lng / 180) * Math.PI;
      var w2 = (next.lat / 180) * Math.PI;
      var j2 = (next.lng / 180) * Math.PI;
      ret =
        4 * Math.pow(Math.sin((w1 - w2) / 2), 2) -
        Math.pow(Math.sin((j1 - j2) / 2) * (Math.cos(w1) - Math.cos(w2)), 2);
      ret = Math.sqrt(ret);
      var temp = Math.sin((j1 - j2) / 2) * (Math.cos(w1) + Math.cos(w2));
      ret = ret / temp;
      ret = (Math.atan(ret) / Math.PI) * 180;
      ret += 90;
      if (j1 - j2 < 0) {
        if (w1 - w2 < 0) {
          ret;
        } else {
          ret = -ret + 180;
        }
      } else {
        if (w1 - w2 < 0) {
          ret = 180 + ret;
        } else {
          ret = -ret;
        }
      }
      return ret;
    },
  },
  mounted() {
    // this.initMap()
    // this.initMap1();
  },
  beforeDestroy() {
    clearInterval(this.interval);
  },
};
</script>
<style lang="scss" scoped>
.demo {
  height: calc(100vh - 4.60417vw);
  width: 100%;

  #bd_map_d {
    height: 100%;
    width: 100%;
  }
}
</style>

vue2 中使用BMapGL实现

<template>
  <div class="demo1">
    <div id="bd_map_d"></div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      map: null,
      setHeading: 64.5, // 旋转角度
      setTilt: 73, // 倾斜角度
      PointArr: [
        { lat: 36.10339957700999, lng: 120.4207801005104 },
        { lat: 36.10349055332635, lng: 120.42113539348455 },
        { lat: 36.10370795896673, lng: 120.42162977768736 },
        { lat: 36.10411490190429, lng: 120.42166901055167 },
        { lat: 36.104232027406695, lng: 120.42185015059275 },
        { lat: 36.10425620255758, lng: 120.42202022562539 },
        { lat: 36.104265908631284, lng: 120.42208225102176 },
        { lat: 36.104399968669526, lng: 120.42187425183421 },
        { lat: 36.10452708476511, lng: 120.42076268466177 },
        { lat: 36.10480132817409, lng: 120.4196557913201 },
        { lat: 36.10560773716036, lng: 120.418951386886 },
        { lat: 36.10621159088823, lng: 120.41900182905378 },
        { lat: 36.1064641068988, lng: 120.41992809616544 },
        { lat: 36.10679444086644, lng: 120.42102125032955 },
        { lat: 36.107010189089046, lng: 120.42182982905027 },
        { lat: 36.107014665948654, lng: 120.42193587265254 },
        { lng: 120.42201589513277, lat: 36.10700627324672 },
        { lng: 120.42236704579075, lat: 36.10708566579729 },
        { lng: 120.42269817692573, lat: 36.107201270041955 },
        { lng: 120.42239277578172, lat: 36.10812797579566 },
        { lng: 120.42175457671763, lat: 36.10947659586882 },
        { lng: 120.42144906678747, lat: 36.11028554037044 },
        { lng: 120.4213722360578, lat: 36.110547069787465 },
        { lng: 120.42134433787885, lat: 36.110691285540966 },
        { lng: 120.42234193234574, lat: 36.110931417305515 },
        { lng: 120.42374305054953, lat: 36.11109804633305 },
        { lng: 120.42478859440246, lat: 36.111102173671576 },
        { lng: 120.42606467439863, lat: 36.11129314178323 },
        { lng: 120.4274220550685, lat: 36.11148065963647 },
        { lng: 120.42831965719076, lat: 36.111638311669736 },
        { lng: 120.42839951065358, lat: 36.11164240198062 },
        { lng: 120.42869196887202, lat: 36.1116737914188 },
        { lng: 120.43031048017785, lat: 36.11190642360766 },
        { lng: 120.43239173942534, lat: 36.11229570404404 },
        { lng: 120.43368467575368, lat: 36.11281195352835 },
        { lng: 120.43371757862009, lat: 36.11284016439977 },
        { lng: 120.43379230066179, lat: 36.11284161798212 },
        { lng: 120.43441423254144, lat: 36.113205746094536 },
        { lng: 120.43549342023326, lat: 36.11391074053337 },
        { lng: 120.43637497341942, lat: 36.11441797319607 },
        { lng: 120.4365024200745, lat: 36.11445405475196 },
        { lng: 120.43670459776231, lat: 36.11458083085174 },
        { lng: 120.43745246924915, lat: 36.11507070008782 },
        { lng: 120.43821097991501, lat: 36.115416050767585 },
        { lng: 120.43823585473245, lat: 36.11541929557907 },
        { lng: 120.43859812511984, lat: 36.115583971494395 },
        { lng: 120.43901701857004, lat: 36.115714318017346 },
        { lng: 120.43928467292172, lat: 36.11582517772885 },
        { lng: 120.43959708522435, lat: 36.115963587312805 },
        { lng: 120.43986466921422, lat: 36.116047547858166 },
        { lng: 120.44007952157578, lat: 36.11611896447754 },
        { lng: 120.440167025596, lat: 36.11612294605039 },
        { lng: 120.44024360205321, lat: 36.116138815526504 },
        { lng: 120.44026150723737, lat: 36.11614702160796 },
        { lng: 120.44027344364953, lat: 36.11615215895656 },
        { lng: 120.44028836484941, lat: 36.1161593311561 },
        { lng: 120.44034209724579, lat: 36.116201960713745 },
        { lng: 120.44048233691922, lat: 36.116254585044935 },
        { lng: 120.4405738257871, lat: 36.116276646228826 },
        { lng: 120.44073595695149, lat: 36.11635856195875 },
        { lng: 120.44115463412841, lat: 36.11652357056175 },
        { lng: 120.44118546544034, lat: 36.11653994619434 },
        { lng: 120.44121529948468, lat: 36.1165533090833 },
      ],

      myIcon: "https://www.picb.cc/image/iy7YSK",
      drivingPoint: "",
      terminalPoint: "",
      interval: null,
      carMk: "",
    };
  },
  methods: {
    // 初始化地图
    initMap() {
      // 一、创建Map实例
      this.map = new BMapGL.Map("bd_map_d"); // 创建Map实例
      this.map.centerAndZoom(new BMapGL.Point(120.422138, 36.102203), 18);
      this.map.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
      // this.map.setHeading(this.setHeading); // 设置地图旋转角度
      // this.map.setTilt(this.setTilt); // 设置地图倾斜角度
      // 二、添加城市列表控件
      const cityCtrl = new BMapGL.CityListControl("this.map");
      this.map.addControl(cityCtrl);
      // 三、添加比例尺控件
      const scaleCtrl = new BMapGL.ScaleControl();
      this.map.addControl(scaleCtrl);
      // 四、添加缩放控件并放到右上角
      const zoomCtrl = new BMapGL.ZoomControl({
        anchor: BMAP_ANCHOR_TOP_RIGHT,
        offset: new BMapGL.Size(13, 105),
      });
      this.map.addControl(zoomCtrl);
      // 五、添加3D控件
      const navi3DCtrl = new BMapGL.NavigationControl3D({
        offset: new BMapGL.Size(0, 5),
      });
      this.map.addControl(navi3DCtrl);
      // 六、添加定位控件
      const localCtrl = new BMapGL.LocationControl();
      this.map.addControl(localCtrl);
      this.carDrawFn();
    },
    carDrawFn() {
      // 第一条线路
      var i = 0;
      this.interval = setInterval(() => {
        if (i >= this.PointArr.length) {
          clearInterval(this.interval);
          return;
        }
        this.drowLine(this.map, this.PointArr[i], this.PointArr[i + 1]); //画线调用
        // this.drowLine(this.map, this.PointArr1[i], this.PointArr1[i + 1]); //画线调用
        i = i + 1;
      }, 1000);

    },
    // 第一条 划线
    drowLine(map, PointArr, PointArrNext) {
      this.drivingPoint = new BMapGL.Icon(
        // "@/assets/bus/car.png",
        require("@/assets/bus/bus1.png"),
        new BMapGL.Size(52, 26),
        {
          anchor: new BMapGL.Size(27, 13),
          imageSize: new BMapGL.Size(70, 35),
        }
      );
      //终点图标
      this.terminalPoint = new BMapGL.Icon(
        require("@/assets/bus/end.png"),
        new BMapGL.Size(45, 45),
        {
          anchor: new BMapGL.Size(20, 45),
          imageSize: new BMapGL.Size(45, 45),
        }
      );
      if (PointArrNext != undefined) {
        var polyline = new BMapGL.Polyline(
          [
            new BMapGL.Point(PointArr.lng, PointArr.lat),
            new BMapGL.Point(PointArrNext.lng, PointArrNext.lat),
          ],
          {
            strokeColor: "red",
            strokeWeight: 7,
            strokeOpacity: 1,
          }
        ); //创建折线
        map.addOverlay(polyline);
        this.addMarkerEnd(
          new BMapGL.Point(PointArrNext.lng, PointArrNext.lat),
          "小车行驶",
          map,
          PointArrNext,
          new BMapGL.Point(PointArr.lng, PointArr.lat)
        ); //添加图标
      } else {
        return;
      }
    },
    // 第一条 添加行驶和终点图标
    addMarkerEnd(point, name, mapInit, trackUnit, prePoint) {
      if (name == "小车行驶") {
        if (this.carMk) {
          mapInit.removeOverlay(this.carMk);
        }
        // debugger;
        this.carMk = new BMapGL.Marker(point, { icon: this.drivingPoint }); // 创建标注
        this.carMk.setRotation(trackUnit.route); //trackUnit.route
        this.carMk.setRotation(this.getAngle(point, prePoint) - 90); // 旋转的角度
        this.map.addOverlay(this.carMk); // 将标注添加到地图中
      } else {
        mapInit.removeOverlay(this.carMk);
        this.carMk = new BMapGL.Marker(point, { icon: this.terminalPoint }); // 创建标注
        mapInit.addOverlay(this.carMk);
      }
    },


    //获得角度的函数
    getAngle(n, next) {
      var ret;
      var w1 = (n.lat / 180) * Math.PI;
      var j1 = (n.lng / 180) * Math.PI;
      var w2 = (next.lat / 180) * Math.PI;
      var j2 = (next.lng / 180) * Math.PI;
      ret =
        4 * Math.pow(Math.sin((w1 - w2) / 2), 2) -
        Math.pow(Math.sin((j1 - j2) / 2) * (Math.cos(w1) - Math.cos(w2)), 2);
      ret = Math.sqrt(ret);
      var temp = Math.sin((j1 - j2) / 2) * (Math.cos(w1) + Math.cos(w2));
      ret = ret / temp;
      ret = (Math.atan(ret) / Math.PI) * 180;
      ret += 90;
      if (j1 - j2 < 0) {
        if (w1 - w2 < 0) {
          ret;
        } else {
          ret = -ret + 180;
        }
      } else {
        if (w1 - w2 < 0) {
          ret = 180 + ret;
        } else {
          ret = -ret;
        }
      }
      return ret;
    },
  },
  mounted() {
    this.initMap();
  },
  beforeDestroy() {
    clearInterval(this.interval);
  },
};
</script>
<style lang="scss" scoped>
.demo1 {
  height: 600px;
  #bd_map_d {
    height: 100%;
    width: 1200px;
  }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1291795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python+pytest接口自动化(10)-session会话保持

在接口测试的过程中&#xff0c;经常会遇到有些接口需要在登录的状态下才能请求&#xff0c;否则会提示请登录&#xff0c;那么怎样解决呢&#xff1f; 上一篇文章我们介绍了Cookie绕过登录&#xff0c;其实这就是保持登录状态的方法之一。 另外一种方式则是通过session进行会…

轻松掌握接口测试!丰富你的测试技能!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 简答的说就是通过URL像服务器或者其他模块等&…

dfs图遍历 LeetCode1466. 重新规划路线

n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以改变交通拥堵的状况。 路…

阿里云效部署前后端

静态站点到OSS 阿里云-云效&#xff0c;阿里云企业级一站式 DevOps&#xff0c;可以免费使用&#xff08;会限制人数、流水线数量等&#xff0c;个人项目够用了&#xff09;。相关文章 CI 持续集成 - 阿里云云效 OSS 是对象存储的意思&#xff0c;一般一个项目对应一个 Bucke…

UE5像素流实现

1.下载像素流插件(Pixel Streaming),勾选之后重启UE 2.设置额外启动参数&#xff08;-AudioMixer -PixelStreamingIPlocalhost -PixelStreamingPort8888&#xff09; 3.项目打包 4.创建项目启动快捷方式(Alt鼠标左键按住XXX.exe文件拖动) 5.快捷方式文件 配置项目运行文件参数(…

DC电源模块在新能源产业中的应用前景

BOSHIDA DC电源模块在新能源产业中的应用前景 随着新能源产业的不断发展&#xff0c;DC电源模块的应用前景越来越广泛。BOSHIDA DC电源模块是一种具有稳定、高效、可靠的电源输出的电源模块&#xff0c;它能够将电源输入电压转换为可靠的直流电源输出&#xff0c;广泛应用于太…

学习Python能给我们带来什么?有什么帮助?

文章目录 前言学习Python能做什么1、抓取各类数据、文本等信息2、批量清洗和处理数据3、提供可视化工具4、进行深度学习 Python的用途有哪些普通人学习python有什么好处关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python…

【LeetCode】2621. 睡眠函数

睡眠函数 Promise异步 题目题解 题目 请你编写一个异步函数&#xff0c;它接收一个正整数参数 millis &#xff0c;并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1&#xff1a; 输入&#xff1a;millis 100 输出&#xff1a;100 解释&#xff1a; 在 100ms 后此异步…

C语言实现植物大战僵尸(完整版)

实现这个游戏需要Easy_X 这个在我前面一篇C之番外篇爱心代码有程序教你怎么下载&#xff0c;大家可自行查看 然后就是需要植物大战僵尸的素材和音乐&#xff0c;需要的可以在评论区 首先是main.cpp //开发日志 //1导入素材 //2实现最开始的游戏场景 //3实现游戏顶部的工具栏…

20、XSS——XSS跨站脚本

文章目录 一、XSS漏洞概述1.1 XSS简介 二、XSS漏洞分类2.1 反射型XSS2.2 存储型XSS2.3 DOM型XSS 三、XSS payload构造以及变形3.1 XSS payload构造3.2 XSS payload 变形 一、XSS漏洞概述 1.1 XSS简介 XSS被称为跨站脚本攻击&#xff08;Cross-site scripting&#xff09;&…

Chrome浏览器禁止更新策略

在做爬虫过程中&#xff0c;需要用到Selenium驱动浏览器去做动态爬虫 这里我一般用到的是Chrome谷歌浏览器进行爬虫 但是&#xff0c;目前python和Chrome浏览器适配最好的是110.版本 尽管我用了很多种方法 去取消浏览器自动更新 但是 过一段时间 浏览器总是会自动更新到最新…

【分享】拖拽式表单的优点有哪些?

如果说想要提升办公效率&#xff0c;那么就可以试试拖拽式表单了。它拥有可视化、拖拽式操作、易维护等优势&#xff0c;可以在现代化办公操作中帮助企业节省人工成本费用&#xff0c;提高办公效率&#xff0c;真正实现办公流程化应用&#xff0c;让数字化转型升级的梦想早日实…

pandas详细笔记

一&#xff1a;什么是Pandas from matplotlib import pyplot import numpy as np import pandas as pdarange np.arange(1, 10, 2) series pd.Series(arange,indexlist("ABCDE")) print(series)二&#xff1a;索引 三&#xff1a;切片 位置索引切片&#xff08;左闭…

Qt之基于QMediaPlayer的音视频播放器(支持常见音视频格式)

Qt自带了一个Media Player的例子,如下图所示: 但是运行这个例子机会发现,连最基本的MP4格式视频都播放不了。因为QMediaPlayer是个壳(也可以叫框架),依赖本地解码器,视频这块默认基本上就播放个MP4,甚至连MP4都不能播放,如果要支持其他格式需要下载k-lite或者LAVFilte…

软件开发安全指南

2.1.应用系统架构安全设计要求 2.2.应用系统软件功能安全设计要求 2.3.应用系统存储安全设计要求 2.4.应用系统通讯安全设计要求 2.5.应用系统数据库安全设计要求 2.6.应用系统数据安全设计要求 软件开发全资料获取&#xff1a;点我获取

彻底解决org.gradle.api.artifacts

需求背景 最近在使用android studio导入hbuilder的HBuilder-Integrate-AS工程时候报错&#xff0c;错误消息如下两种。 错误描述 第一种 Failed to notify dependency resolution listener. void org.gradle.api.artifacts.DependencySubstitutions$Substitution.with(org.g…

富时中国A50指数暴跌

近年来&#xff0c;中国股市的波动一直备受关注&#xff0c;而富时中国A50指数更是其中一项备受瞩目的指标之一。然而&#xff0c;近期却出现了一场引人瞩目的暴跌&#xff0c;引发了广泛的关注和讨论。 富时中国A50指数简介 富时中国A50指数&#xff0c;作为富时罗素指数系列…

OpenCV交叉编译

1.下载代码解压 tar -zxvf opencv-4.8.1.tar.gz cd cd opencv-4.8.1 sudo mkdir chmod 777 build cd build 2.配置交叉编译工具 根据自己的板子进行修改 -D CMAKE_C_COMPILERaarch64-mix210-linux-gcc -D CMAKE_CXX_COMPILERaarch64-mix210-linux-g 3.cmake生成makefi…

算法初阶双指针+C语言期末考试之编程题加强训练

双指针 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&#xff0c;⼀种是左右指针。 对撞指针&#xff1a;⼀般⽤于顺序结构中&#xff0c;也称左右指针。 • 对撞指针从两端向中间移动。⼀个指针从最左端开始&#xff0c;另⼀个从最右端开始&#xff0c;然后逐渐往中间逼…

python学习之JSON数据处理在Python中的应用:从解析到生成

JSON文件是一种轻量级的数据交换格式&#xff0c;它采用了一种类似于JavaScript语法的结构&#xff0c;可以方便地在不同平台和编程语言之间进行数据交换。在Python中&#xff0c;我们可以使用内置的json模块来读取和写入JSON文件。 下面是一个简单的示例&#xff0c;展示了如…