From d0f5933cb7fe9196ca0250252efc820a1a9d947e Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期三, 08 五月 2024 22:47:30 +0800
Subject: [PATCH] 新增历史轨迹菜单

---
 src/utils/map/util.js                             |   17 ++
 src/utils/map/animation.js                        |   26 +++-
 src/views/historymode/HistoryMode.vue             |   18 ++
 src/components.d.ts                               |    2 
 src/components/animation/HistoricalTrajectory.vue |   86 ++++++++++++++
 src/utils/map/3dLayer.js                          |  164 +++++++++++++-------------
 src/components/BaseCard.vue                       |    2 
 src/assets/3dmap.css                              |    1 
 8 files changed, 223 insertions(+), 93 deletions(-)

diff --git a/src/assets/3dmap.css b/src/assets/3dmap.css
index 8f4779b..fdf6a2e 100644
--- a/src/assets/3dmap.css
+++ b/src/assets/3dmap.css
@@ -247,6 +247,7 @@
 
 .btn-search {
     cursor: pointer;
+    padding: 4px 0;
 }
 
 .map-btn-group .btn-search {
diff --git a/src/components.d.ts b/src/components.d.ts
index a01e48b..008a148 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -12,7 +12,6 @@
     CardButton: typeof import('./components/CardButton.vue')['default']
     CoreHeader: typeof import('./components/core/CoreHeader.vue')['default']
     CoreMenu: typeof import('./components/core/CoreMenu.vue')['default']
-    DataStatistic: typeof import('./components/monitor/DataStatistic.vue')['default']
     DataSummary: typeof import('./components/monitor/DataSummary.vue')['default']
     DataTable: typeof import('./components/monitor/DataTable.vue')['default']
     ElButton: typeof import('element-plus/es')['ElButton']
@@ -40,6 +39,7 @@
     FactorCheckbox: typeof import('./components/monitor/FactorCheckbox.vue')['default']
     FactorLegend: typeof import('./components/monitor/FactorLegend.vue')['default']
     FactorRadio: typeof import('./components/monitor/FactorRadio.vue')['default']
+    HistoricalTrajectory: typeof import('./components/animation/HistoricalTrajectory.vue')['default']
     LineChart: typeof import('./components/monitor/LineChart.vue')['default']
     MapToolbox: typeof import('./components/map/MapToolbox.vue')['default']
     OptionDevice: typeof import('./components/search/OptionDevice.vue')['default']
diff --git a/src/components/BaseCard.vue b/src/components/BaseCard.vue
index 76d1305..baf7fd2 100644
--- a/src/components/BaseCard.vue
+++ b/src/components/BaseCard.vue
@@ -9,7 +9,7 @@
     <div class="ff-footer">
       <slot name="footer"></slot>
     </div>
-    <div v-if="type == 'content' && size != 'small'" class="ff-triangle">
+    <div v-if="type == 'content' && size == 'medium'" class="ff-triangle">
       <div class="ff-triangle-border"></div>
     </div>
   </div>
diff --git a/src/components/animation/HistoricalTrajectory.vue b/src/components/animation/HistoricalTrajectory.vue
new file mode 100644
index 0000000..e2e50bf
--- /dev/null
+++ b/src/components/animation/HistoricalTrajectory.vue
@@ -0,0 +1,86 @@
+<template>
+  <BaseCard size="middle-s" direction="up">
+    <template #content>
+      <el-row align="middle" style="gap: 6px">
+        <div>鍘嗗彶杞ㄨ抗</div>
+        <div class="map-btn-group">
+          <font-awesome-icon
+            :icon="btnStop.icon"
+            :class="'btn-search m-r-2 ' + btnStop.clz"
+            @click="handleStop"
+          />
+          <font-awesome-icon
+            :icon="btnPlay.icon"
+            class="btn-search"
+            @click="handlePlayOrPause"
+          />
+        </div>
+        <div class="label-date margin-left-2">
+          <span class="label-date-title">鍊嶉��</span>
+          <el-select v-model="speed" size="small" class="w-80">
+            <el-option label="1.0X" :value="1" />
+            <el-option label="4.0X" :value="4" />
+            <el-option label="8.0X" :value="8" />
+            <el-option label="16X" :value="16" />
+          </el-select>
+        </div>
+      </el-row>
+    </template>
+  </BaseCard>
+</template>
+<script>
+export default {
+  props: {},
+  emits: ['change'],
+  data() {
+    return {
+      speed: 1,
+      // 鍔ㄧ敾鐘舵�侊紝0锛氬仠姝紱1锛氭挱鏀撅紱2锛氭殏鍋�
+      status: 0
+    };
+  },
+  computed: {
+    btnStop() {
+      return {
+        icon: 'fa fa-stop',
+        clz: this.status == 0 ? 'btn-disable' : 'btn-able'
+      };
+    },
+    btnPlay() {
+      return {
+        icon: this.status == 1 ? 'fa fa-pause' : 'fa fa-play'
+      };
+    }
+  },
+  methods: {
+    handleStop() {
+      if (this.status != 0) {
+        this.status = 0;
+        this.handleChange();
+      }
+    },
+    handlePlayOrPause() {
+      if (this.status == 1) {
+        this.status = 2;
+      } else {
+        this.status = 1;
+      }
+      this.handleChange();
+    },
+    handleChange() {
+      console.log(this.status);
+      this.$emit('change', this.status);
+    }
+  },
+  mounted() {}
+};
+</script>
+<style scoped>
+.btn-able {
+  color: red;
+}
+
+.btn-disable {
+  color: gray;
+}
+</style>
diff --git a/src/utils/map/3dLayer.js b/src/utils/map/3dLayer.js
index 9ba66bd..af6ff34 100644
--- a/src/utils/map/3dLayer.js
+++ b/src/utils/map/3dLayer.js
@@ -87,88 +87,90 @@
   return scale;
 }
 
+/**
+ * 缁樺浘
+ */
+function drawMesh(fDatas, factor, center, merge) {
+  const lnglats_GD = fDatas.lnglats_GD;
+  const coors = fDatas.coors_GD;
+  const heights = factor.heights;
+  const colors = factor.colors;
+  const bColor = factor.bottomColor;
+  if (center) {
+    map.setZoomAndCenter(16, center);
+  }
+
+  // eslint-disable-next-line no-undef
+  var cylinder = new AMap.Object3D.Mesh();
+  cylinder.backOrFront = 'both';
+  cylinder.transparent = true;
+
+  var geometry = cylinder.geometry;
+
+  const scale = _getScale(_minH, _maxH);
+  for (let i = 0; i < coors.length; i++) {
+    var r = lnglats_GD[i];
+    var lastP = lnglats_GD[i - 1];
+    var p = coors[i];
+    var h = (heights[i] - _minH) * scale + _minHeight;
+    if (heights[i] == -1) {
+      h = -1;
+    }
+
+    geometry.vertices.push(p.x, p.y, 0); //搴曢儴椤剁偣
+    geometry.vertices.push(p.x, p.y, 0 - h); //椤堕儴椤剁偣
+
+    if (i > 0) {
+      // eslint-disable-next-line no-undef
+      var distance = AMap.GeometryUtil.distance(r, lastP);
+      //涓や釜鏁版嵁鐐规渶灏忛棿闅旀椂闂翠负4s锛屽亣璁捐溅閫熸寜鐓�120km/h璁$畻锛�4s琛岄┒鏈�澶ц窛绂讳綔涓�132绫筹紝
+      //璁惧畾瓒呰繃1鍒嗛挓鐨勬暟鎹粯鍒剁壒娈婄殑杩炵嚎
+      if (distance <= 500 && h != -1) {
+        var bottomIndex = i * 2;
+        var topIndex = bottomIndex + 1;
+        var lastBottomIndex = bottomIndex - 2;
+        var lastTopIndex = bottomIndex - 1;
+        geometry.faces.push(bottomIndex, topIndex, lastTopIndex);
+        geometry.faces.push(bottomIndex, lastBottomIndex, lastTopIndex);
+      }
+    }
+
+    // var bColor = bColor
+    var tColor = colors[i];
+    geometry.vertexColors.push.apply(geometry.vertexColors, bColor); //搴曢儴椤剁偣棰滆壊
+    geometry.vertexColors.push.apply(geometry.vertexColors, tColor); //椤堕儴椤剁偣棰滆壊
+  }
+
+  // 7.鏍规嵁鍚堝苟閫夐」閲嶇疆鎴栨柊澧炲綋鍓嶇紦瀛樻暟鎹�
+  if (merge != true) {
+    _factorDatas = fDatas;
+    _factor = factor;
+    if (_cylinder != undefined) {
+      object3Dlayer.remove(_cylinder);
+    }
+  } else {
+    // _factorDatas.lnglats.push.apply(
+    //   _factorDatas.lnglats,
+    //   lnglats_GD
+    // );
+    // _factorDatas.coors.push.apply(_factorDatas.coors, coors);
+    // _factorDatas.heights.push.apply(_factorDatas.heights, heights);
+    // _factorDatas.colors.push.apply(_factorDatas.colors, colors);
+    // _factorDatas.bottomColor = bColor;
+  }
+  object3Dlayer.add(cylinder);
+  /**************test ****************/
+  // object3Dlayer.on('mouseover', function (e) {
+  //   console.log(
+  //     `榧犳爣绉诲叆瑕嗙洊鐗�! [${e.lnglat.getlng()}, ${e.lnglat.getLat()}]`
+  //   );
+  // });
+  /**************test ****************/
+  _cylinder = cylinder;
+}
+
 export default {
-  /**
-   * 缁樺浘
-   */
-  drawMesh(fDatas, factor, center, merge) {
-    const lnglats_GD = fDatas.lnglats_GD;
-    const coors = fDatas.coors_GD;
-    const heights = factor.heights;
-    const colors = factor.colors;
-    const bColor = factor.bottomColor;
-    if (center) {
-      map.setZoomAndCenter(16, center);
-    }
-
-    // eslint-disable-next-line no-undef
-    var cylinder = new AMap.Object3D.Mesh();
-    cylinder.backOrFront = 'both';
-    cylinder.transparent = true;
-
-    var geometry = cylinder.geometry;
-
-    const scale = _getScale(_minH, _maxH);
-    for (let i = 0; i < coors.length; i++) {
-      var r = lnglats_GD[i];
-      var lastP = lnglats_GD[i - 1];
-      var p = coors[i];
-      var h = (heights[i] - _minH) * scale + _minHeight;
-      if (heights[i] == -1) {
-        h = -1;
-      }
-
-      geometry.vertices.push(p.x, p.y, 0); //搴曢儴椤剁偣
-      geometry.vertices.push(p.x, p.y, 0 - h); //椤堕儴椤剁偣
-
-      if (i > 0) {
-        // eslint-disable-next-line no-undef
-        var distance = AMap.GeometryUtil.distance(r, lastP);
-        //涓や釜鏁版嵁鐐规渶灏忛棿闅旀椂闂翠负4s锛屽亣璁捐溅閫熸寜鐓�120km/h璁$畻锛�4s琛岄┒鏈�澶ц窛绂讳綔涓�132绫筹紝
-        //璁惧畾瓒呰繃1鍒嗛挓鐨勬暟鎹粯鍒剁壒娈婄殑杩炵嚎
-        if (distance <= 500 && h != -1) {
-          var bottomIndex = i * 2;
-          var topIndex = bottomIndex + 1;
-          var lastBottomIndex = bottomIndex - 2;
-          var lastTopIndex = bottomIndex - 1;
-          geometry.faces.push(bottomIndex, topIndex, lastTopIndex);
-          geometry.faces.push(bottomIndex, lastBottomIndex, lastTopIndex);
-        }
-      }
-
-      // var bColor = bColor
-      var tColor = colors[i];
-      geometry.vertexColors.push.apply(geometry.vertexColors, bColor); //搴曢儴椤剁偣棰滆壊
-      geometry.vertexColors.push.apply(geometry.vertexColors, tColor); //椤堕儴椤剁偣棰滆壊
-    }
-
-    // 7.鏍规嵁鍚堝苟閫夐」閲嶇疆鎴栨柊澧炲綋鍓嶇紦瀛樻暟鎹�
-    if (merge != true) {
-      _factorDatas = fDatas;
-      _factor = factor;
-      if (_cylinder != undefined) {
-        object3Dlayer.remove(_cylinder);
-      }
-    } else {
-      // _factorDatas.lnglats.push.apply(
-      //   _factorDatas.lnglats,
-      //   lnglats_GD
-      // );
-      // _factorDatas.coors.push.apply(_factorDatas.coors, coors);
-      // _factorDatas.heights.push.apply(_factorDatas.heights, heights);
-      // _factorDatas.colors.push.apply(_factorDatas.colors, colors);
-      // _factorDatas.bottomColor = bColor;
-    }
-    object3Dlayer.add(cylinder);
-    /**************test ****************/
-    // object3Dlayer.on('mouseover', function (e) {
-    //   console.log(
-    //     `榧犳爣绉诲叆瑕嗙洊鐗�! [${e.lnglat.getlng()}, ${e.lnglat.getLat()}]`
-    //   );
-    // });
-    /**************test ****************/
-    _cylinder = cylinder;
-  },
+  drawMesh: drawMesh,
   /**
    * 缁樺埗3D璧拌璺嚎鍥�
    * @param fDatas 瀹屾暣鐩戞祴鏁版嵁
diff --git a/src/utils/map/animation.js b/src/utils/map/animation.js
index 551b3bb..ab13719 100644
--- a/src/utils/map/animation.js
+++ b/src/utils/map/animation.js
@@ -2,7 +2,10 @@
 import calculate from '@/utils/map/calculate';
 import Layer from '@/utils/map/3dLayer';
 import sector from '@/utils/map/sector';
-import map from '@/utils/map/index_old';
+import { map } from '@/utils/map/index_old';
+import util from "@/utils/map/util";
+import car_driving from '@/assets/mipmap/car_driving.png';
+import boat_driving from '@/assets/mipmap/boat_driving.png';
 
 function MapAnimation() {
   // 闈炶繛缁潗鏍囩偣鏈�澶ц窛绂�(绫�)
@@ -264,16 +267,16 @@
       var url;
       switch (this.vehicleType) {
         case 0:
-          url = './asset/mipmap/car_driving.png';
+          url = car_driving;
           break;
         case 1:
-          url = './asset/mipmap/car_driving.png';
+          url = car_driving;
           break;
         case 2:
-          url = './asset/mipmap/boat_driving.png';
+          url = boat_driving;
           break;
         default:
-          url = './asset/mipmap/car_driving.png';
+          url = car_driving;
           break;
       }
       // var url = "./asset/mipmap/car_offline.png";
@@ -292,26 +295,33 @@
       //     break;
       // }
 
+      // eslint-disable-next-line no-undef
       var icon = new AMap.Icon({
+        // eslint-disable-next-line no-undef
         size: new AMap.Size(60, 30),
+        // eslint-disable-next-line no-undef
         imageSize: new AMap.Size(54, 21),
         image: url
         // imageOffset: new AMap.Pixel(-16, -16) // 鐩稿浜庡熀鐐圭殑鍋忕Щ浣嶇疆
       });
 
+      // eslint-disable-next-line no-undef
       var car = new AMap.Marker({
         icon: icon,
         position: lnglat, // 鍩虹偣浣嶇疆
+        // eslint-disable-next-line no-undef
         offset: new AMap.Pixel(-20, -15) // 鐩稿浜庡熀鐐圭殑鍋忕Щ浣嶇疆
       });
 
-      MapUtil._map.add(car);
+      map.add(car);
       this.moveViews['car'] = car;
 
       // 鏃堕棿
+      // eslint-disable-next-line no-undef
       var text = new AMap.Text({
         text: time,
         position: lnglat,
+        // eslint-disable-next-line no-undef
         offset: new AMap.Pixel(5, 20),
         style: {
           'font-size': '13px',
@@ -324,10 +334,10 @@
           padding: '0 4px'
         }
       });
-      MapUtil._map.add(text);
+      map.add(text);
       this.moveViews['text'] = text;
     } else {
-      MapUtil.setCenter(lnglat);
+      util.setCenter(lnglat);
       this.moveViews['car'].setPosition(lnglat);
       this.moveViews['text'].setPosition(lnglat);
       this.moveViews['text'].setText(time);
diff --git a/src/utils/map/util.js b/src/utils/map/util.js
new file mode 100644
index 0000000..3da926d
--- /dev/null
+++ b/src/utils/map/util.js
@@ -0,0 +1,17 @@
+import { map, isDragging } from '@/utils/map/index_old';
+
+export default {
+  setCenter(lnglat) {
+    if (isDragging) {
+      return;
+    }
+    var now = new Date();
+    if (
+      this.lasttime == undefined ||
+      now.getTime() - this.lasttime.getTime() >= 1000
+    ) {
+      map.setCenter(lnglat);
+      this.lasttime = now;
+    }
+  }
+};
diff --git a/src/views/historymode/HistoryMode.vue b/src/views/historymode/HistoryMode.vue
index 817a150..f9b89f9 100644
--- a/src/views/historymode/HistoryMode.vue
+++ b/src/views/historymode/HistoryMode.vue
@@ -1,6 +1,6 @@
 <template>
   <div class="p-events-none m-t-2">
-    <el-row justify="center">
+    <el-row v-show="status == 0" justify="center">
       <SearchBar
         :search-time="searchTime"
         @search="fetchHistroyData"
@@ -32,6 +32,11 @@
       :factor-datas="factorDatas"
       :device-type="deviceType"
     ></DataSheet>
+    <el-row class="historical" justify="center">
+      <HistoricalTrajectory
+        @change="(e) => (status = e)"
+      ></HistoricalTrajectory>
+    </el-row>
   </div>
 </template>
 
@@ -70,7 +75,9 @@
       drawMode: 0,
       searchTime: [],
       // 褰撳墠閫変腑楂樹寒鐨勬暟鎹偣绱㈠紩
-      locateIndex: undefined
+      locateIndex: undefined,
+      // 杞ㄨ抗鍔ㄧ敾鐘舵��
+      status: 0
     };
   },
   watch: {
@@ -192,4 +199,11 @@
   right: 0;
   top: 0;
 }
+
+.historical {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
 </style>

--
Gitblit v1.9.3