From aef7a66e9568004d3e8bb9930db5866d82ed96c6 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期一, 29 四月 2024 22:32:46 +0800
Subject: [PATCH] 新增绘制3d走航图功能

---
 src/views/historymode/HistoryMode.vue  |    4 +
 src/components/monitor/FactorRadio.vue |   18 +++++
 src/assets/border.css                  |    1 
 src/components.d.ts                    |    2 
 src/utils/map/3dLayer.js               |   88 +++++++++++++++++++++++++++++
 src/assets/3dmap.css                   |   11 ---
 6 files changed, 110 insertions(+), 14 deletions(-)

diff --git a/src/assets/3dmap.css b/src/assets/3dmap.css
index a4523ba..0ddf6ed 100644
--- a/src/assets/3dmap.css
+++ b/src/assets/3dmap.css
@@ -66,19 +66,10 @@
 }
 
 .map-factor-selector {
-    /* background-color: rgb(223, 223, 223); */
     position: absolute;
     left: 1px;
-    /* left: 10px; */
-    top: 120px;
+    top: 64px;
     z-index: 100px;
-    /* display: flex;
-      align-items: flex-start;
-      flex-wrap: wrap-reverse;
-      flex-direction: column; */
-    /* background-color: #ffffffb0; */
-    /* min-height: 200px; */
-    /* max-height: 50vh; */
 }
 
 .factorbox {
diff --git a/src/assets/border.css b/src/assets/border.css
index 44f8112..11ac6b5 100644
--- a/src/assets/border.css
+++ b/src/assets/border.css
@@ -366,6 +366,7 @@
 /* 鍐呭 */
 .ff-content {
     position: relative;
+    display: inline-block;
 }
 
 /* .ff-content .ff-border-top {
diff --git a/src/components.d.ts b/src/components.d.ts
index 4d59aea..efd3d0d 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -17,6 +17,8 @@
     ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
     ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
     ElIcon: typeof import('element-plus/es')['ElIcon']
+    ElRadio: typeof import('element-plus/es')['ElRadio']
+    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     FactorRadio: typeof import('./components/monitor/FactorRadio.vue')['default']
     MapToolbox: typeof import('./components/map/MapToolbox.vue')['default']
     RouterLink: typeof import('vue-router')['RouterLink']
diff --git a/src/components/monitor/FactorRadio.vue b/src/components/monitor/FactorRadio.vue
index f77cf2f..a5ebb94 100644
--- a/src/components/monitor/FactorRadio.vue
+++ b/src/components/monitor/FactorRadio.vue
@@ -1,7 +1,7 @@
 <template>
-  <BaseCard>
+  <BaseCard class="map-factor-selector">
     <template #content>
-      <el-radio-group v-model="radio">
+      <el-radio-group v-model="radio" size="default" @change="handleChange">
         <el-radio v-for="(item, i) in options" :key="i" :value="item.value">{{
           item.label
         }}</el-radio>
@@ -14,11 +14,25 @@
 // 鐩戞祴鍥犲瓙鍗曢�夋
 import { radioOptions } from '@/constant/radio-options';
 export default {
+  emits:['change'],
   data() {
     return {
       radio: radioOptions.type0[0].value,
       options: radioOptions.type0
     };
+  },
+  method:{
+    handleChange(value) {
+      this.$emit('change', value)
+      // todo 鍦板浘3d鍥惧儚鍒囨崲灞曠ず鐩戞祴鍥犲瓙
+    }
   }
 };
 </script>
+<style scoped>
+.el-radio {
+  --el-radio-text-color: white;
+  margin-right: 10px;
+  height: initial;
+}
+</style>
diff --git a/src/utils/map/3dLayer.js b/src/utils/map/3dLayer.js
index fef02a0..d0ad682 100644
--- a/src/utils/map/3dLayer.js
+++ b/src/utils/map/3dLayer.js
@@ -1 +1,87 @@
-import { object3Dlayer } from '../map';
+import { map, object3Dlayer } from './index_old';
+
+// 3d鍥惧舰
+var _cylinder = undefined,
+  // 褰撳墠缁樺埗鐨勫浘褰腑鐨勬渶灏忛珮搴�
+  _minH = -1,
+  // 褰撳墠缁樺埗鐨勫浘褰腑鐨勬渶澶ч珮搴�
+  _maxH = -1;
+
+//鐩戞祴鏁版嵁
+var _factorDatas = {
+    lnglats: [],
+    heights: [],
+    type: ''
+  },
+  //褰撳墠閫変腑鐨勭洃娴嬪洜瀛愭暟鎹�
+  _factor = {},
+  _zoomFirst = true;
+
+function onMapZoom() {
+  // 棣栨鍦板浘缂╂斁鐩戝惉涓嶆墽琛岋紙鍥犱负璁惧畾鐩戝惉鍑芥暟鍚庝細绔嬪嵆鎵ц涓�娆★紝鍙兘瀹樻柟鍑芥暟鏈夌浉鍏冲弬鏁帮紝鍚庣画寰呬慨鏀癸級
+  if (_zoomFirst) {
+    _zoomFirst = false;
+    return;
+  }
+  const fDatas = _factorDatas;
+  const factor = _factor;
+  // MapUtil._object3Dlayer.clear()
+  // MapUtil.drawMesh(f.lnglats, f.heights, f.type, false)
+  MapUtil.drawMesh2(fDatas, factor);
+  MapUtil.drawMarker();
+}
+
+export default {
+  /**
+   * 缁樺埗3D璧拌璺嚎鍥�
+   * @param fDatas 瀹屾暣鐩戞祴鏁版嵁
+   * @param factor 褰撳墠灞曠ず鐨勭洃娴嬪洜瀛愮殑鍊紇alue
+   * @param merge 鏄惁鍜屼箣鍓嶇粯鍒剁殑鍥惧舰鍚堝苟
+   * @param setCenter 闀滃ご鏄惁鑷姩绉诲姩鑷冲浘褰腑蹇�
+   */
+  drawRoadMap(fDatas, factor, merge, setCenter) {
+    const lnglats_GD = fDatas.lnglats_GD;
+    const heights = factor.heights;
+
+    // 1.鍏抽棴鍦板浘缂╂斁鐩戝惉
+    map.off('zoomend', this._onMapZoom);
+
+    // 2.璁$畻缁樺浘楂樺害鐨勮竟鐣屽��
+    if (merge != true) {
+      var minH = _minH < 0 ? heights[0] : _minH;
+      var maxH = _maxH < 0 ? heights[0] : _maxH;
+      for (let i = 0; i < heights.length; i++) {
+        const h = heights[i];
+        minH = Math.min(minH, h);
+        maxH = Math.max(maxH, h);
+      }
+      _minH = minH;
+      _maxH = maxH;
+    }
+
+    // 3.纭畾瀹氫綅鍧愭爣鐐�
+    var center;
+    if (setCenter && lnglats_GD.length > 0) {
+      var p = lnglats_GD[0];
+      for (let i = 0; i < lnglats_GD.length; i++) {
+        const e = lnglats_GD[i];
+        if (e[0] != 0) {
+          p = e;
+          break;
+        }
+      }
+      center = new AMap.LngLat(...p);
+    }
+
+    // 5.缁樺埗3D鍥惧舰
+    drawMesh2(fDatas, factor, center, merge);
+
+    // 缂╂斁鍦板浘鍒板悎閫傜殑瑙嗛噹绾у埆
+    // map.setFitView()
+
+    // 6.寮�鍚湴鍥剧缉鏀剧洃鍚�
+    if (lnglats_GD.length > 0) {
+      map.on('zoomend', this._onMapZoom);
+    }
+  }
+};
diff --git a/src/views/historymode/HistoryMode.vue b/src/views/historymode/HistoryMode.vue
index b718675..a6576bf 100644
--- a/src/views/historymode/HistoryMode.vue
+++ b/src/views/historymode/HistoryMode.vue
@@ -1,5 +1,7 @@
 <template>
-  <div class="fy-container">HomePage</div>
+  <div class="fy-container">
+    <FactorRadio></FactorRadio>
+  </div>
 </template>
 
 <script>

--
Gitblit v1.9.3