From 307db148645230afc780a3d5d16ffb97aa32c189 Mon Sep 17 00:00:00 2001
From: jihongshun <1151753686@qq.com>
Date: 星期四, 03 七月 2025 16:38:58 +0800
Subject: [PATCH] 模型 && 设备相关

---
 src/views/system/shootPoint/components/shootPointDialog.vue |  506 +++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 391 insertions(+), 115 deletions(-)

diff --git a/src/views/system/shootPoint/components/shootPointDialog.vue b/src/views/system/shootPoint/components/shootPointDialog.vue
index 621e5d8..937466f 100644
--- a/src/views/system/shootPoint/components/shootPointDialog.vue
+++ b/src/views/system/shootPoint/components/shootPointDialog.vue
@@ -34,60 +34,12 @@
               </el-card>
           </el-col>
           <el-col :span="20">
-              <!-- <el-card class="noScroll"> -->
-                  <InitMap v-if="showMap" @mergePoint="mergePoint"></InitMap>
-              <!-- </el-card> -->
+              <InitMap v-if="showMap" @mergePoint="mergePoint" @renderData="renderData" :towerUrl="towerUrl"></InitMap>
           </el-col>
-          <!-- <el-col :span="8">
-                <div>
-                  <div class="cameraView">
-                    <a>鐩告満瑙嗚</a>
-                  </div>
-                  <div class="uavView">
-                    <a>鏃犱汉鏈鸿瑙�</a>
-                  </div>
-                  <div class="operationControl">
-                    <a>鎿嶆帶鐩稿叧(浣跨敤浠ヤ笅閿帶鍒剁浉鏈鸿瑙�)</a>
-                    <div>
-                      <el-button type="primary">鍦伴潰鐐�</el-button>
-                      <el-button type="primary">绌轰腑鐐�</el-button>
-                      <el-button type="primary">鎮仠鏃堕棿</el-button>
-                    </div>
-                    <div>
-                       <div  class="container">
-                          <div class="keypad">
-                            <div class="row">
-                              <div class="key">Q-涓婂崌</div>
-                              <div class="key">W-鍚戝墠</div>
-                              <div class="key">E-涓嬮檷</div>
-                            </div>
-                            <div class="row">
-                              <div class="key">A- 鍚戝乏</div>
-                              <div class="key">S- 鍚戝悗</div>
-                              <div class="key">D- 鍚戝彸</div>
-                            </div>
-                          </div>
-                          <div class="arrow-pad">
-                            <div class="arrow-row">
-                              <div class="arrow empty"></div>
-                              <div class="arrow">鈫� - 鍚戜笂鐪�</div>
-                              <div class="arrow empty"></div>
-                            </div>
-                            <div class="arrow-row">
-                              <div class="arrow">鈫� - 鍚戝乏杞�</div>
-                              <div class="arrow">鈫� - 鍚戜笅鐪�</div>
-                              <div class="arrow">鈫� - 鍚戝彸杞�</div>
-                            </div>
-                          </div>
-                        </div>
-                    </div>
-                  </div>
-                </div>
-          </el-col> -->
       </el-row>
       <span slot="footer" class="dialog-footer">
         <el-button @click="closeModal">鍙� 娑�</el-button>
-        <el-button type="primary" @click="dialogVisible = false">纭� 瀹�</el-button>
+        <el-button type="primary" @click="submit()" >纭� 瀹�</el-button>
       </span>
     </el-dialog>
     <ChooseModelDialog v-if="showModel" @cancel ='cancel' @getRowData="getRowData" ></ChooseModelDialog>
@@ -97,7 +49,13 @@
 import CesiumMap from "../../../../utils/components/cesium-map.vue";
 import InitMap from "../../../../utils/components/init-map.vue";
 import ChooseModelDialog from './chooseModelDialog.vue';
+// const centerCartesian = Cesium.Cartesian3.fromDegrees(0,0, 236)
+// const centerCartesian = Cesium.Cartesian3.fromDegrees(125.1949, 46.5143, 0)
+ let globalon  = 125.1949
+let globalat = 46.5143
+const centerCartesian = Cesium.Cartesian3.fromDegrees(globalon,globalat , 236)
 
+let relativeData 
 export default{
   name:'shootPointDialog',
    components: {
@@ -109,28 +67,6 @@
     return{
       dialogVisible :true,
       showModel:false,
-      //  treeData: [{
-      //     id: 1,
-      //     label: '涓�绾� 1',
-      //     children: [{
-      //       id: 4,
-      //       label: '浜岀骇 1-1',
-      //     }]
-      //   }, {
-      //     id: 2,
-      //     label: '涓�绾� 2',
-      //     children: [{
-      //       id: 5,
-      //       label: '浜岀骇 2-1'
-      //     }]
-      //   }, {
-      //     id: 3,
-      //     label: '涓�绾� 3',
-      //     children: [{
-      //       id: 7,
-      //       label: '浜岀骇 3-1'
-      //     }]
-      //   }],
         treeData:[],
         defaultProps: {
           children: 'children',
@@ -140,10 +76,294 @@
         initialCameraPosition: null,
         initialCameraOrientation: null,
         animationFrameId: null,
-        showMap:false
+        showMap:false,
+        towerUrl:null,
+        chooseModelId:null
     }
   },
+  mounted(){
+  },  
   methods:{
+    renderRelativePoints(viewer, data) {
+      const airPoints = [];
+
+      data.forEach(item => {
+        const groundRel = item.relativePosition;
+        const groundPos = Cesium.Cartesian3.add(
+          centerCartesian,
+          new Cesium.Cartesian3(groundRel.x, groundRel.y, groundRel.z),
+          new Cesium.Cartesian3()
+        );
+        this.addPoint(viewer, groundPos, Cesium.Color.BLUE, item.label);
+
+        item.children?.forEach(child => {
+          const airRel = child.relativePosition;
+          const airPos = Cesium.Cartesian3.add(
+            centerCartesian,
+            new Cesium.Cartesian3(airRel.x, airRel.y, airRel.z),
+            new Cesium.Cartesian3()
+          );
+          this.addPoint(viewer, airPos, Cesium.Color.YELLOW, child.label);
+
+          // 鍦伴潰鐐瑰埌绌轰腑鐐圭敤铏氱嚎
+          this.drawLine(viewer, [groundPos, airPos], Cesium.Color.GRAY, true);
+
+          airPoints.push(airPos);
+        });
+      });
+
+      // 绌轰腑鐐逛箣闂磋繛榛勭嚎
+      if (airPoints.length > 1) {
+        this.drawLine(viewer, airPoints, Cesium.Color.YELLOW);
+      }
+    },
+    addPoint(viewer, position, color, label) {
+      viewer.entities.add({
+        name: label,
+        position,
+        point: {
+          pixelSize: 10,
+          color: color,
+          heightReference: Cesium.HeightReference.NONE
+        },
+        label: {
+          text: label,
+          font: '12px sans-serif',
+          pixelOffset: new Cesium.Cartesian2(10, -10),
+          style: Cesium.LabelStyle.FILL,
+          fillColor: color,
+          showBackground: true,
+        }
+      });
+    },
+    drawLine(viewer, positions, color, dashed = false) {
+      viewer.entities.add({
+        polyline: {
+          positions,
+          width: 2,
+          material: dashed
+            ? new Cesium.PolylineDashMaterialProperty({
+                color: color,
+                dashLength: 8,
+              })
+            : color,
+        }
+      });
+    },
+    //绌洪棿鍧愭爣鍙嶆覆鏌�
+    renderData(viewerM){
+      let data = [
+    {
+        "id": "197ced8ed37d58af",
+        "label": "鍦伴潰鐐�0",
+        "longitude": 125.15396706149502,
+        "latitude": 46.5542193007498,
+        "height": 110.34582699579633,
+        "children": [
+            {
+                "id": "197ced8ed37d12bf",
+                "label": "绌轰腑鐐�0",
+                "longitude": 125.15269101779384,
+                "latitude": 46.554404555297005,
+                "height": 110.34669117272557,
+                "relativePosition": {
+                    "x": 147.6013223491609,
+                    "y": -21.93333655036986,
+                    "z": -75.59047747310251
+                }
+            }
+        ],
+        "relativePosition": {
+            "x": 58.98418062273413,
+            "y": -66.05175063293427,
+            "z": -89.7526711942628
+        }
+    },
+    {
+        "id": "197ced8ed372ae58",
+        "label": "鍦伴潰鐐�1",
+        "longitude": 125.15396775899208,
+        "latitude": 46.55421205599431,
+        "height": 129.0598176992881,
+        "children": [
+            {
+                "id": "197ced8ed3796b97",
+                "label": "绌轰腑鐐�1",
+                "longitude": 125.15267500755259,
+                "latitude": 46.55432990371885,
+                "height": 129.06068032390132,
+                "relativePosition": {
+                    "x": 137.72684245044366,
+                    "y": -5.778328162617981,
+                    "z": -67.71026689186692
+                }
+            }
+        ],
+        "relativePosition": {
+            "x": 51.19412293517962,
+            "y": -55.08268230734393,
+            "z": -76.7196572907269
+        }
+    },
+    {
+        "id": "197ced8ed373aacd",
+        "label": "鍦伴潰鐐�2",
+        "longitude": 125.15398622045456,
+        "latitude": 46.55420774953827,
+        "height": 147.7039314240401,
+        "children": [
+            {
+                "id": "197ced8ed3744bed",
+                "label": "绌轰腑鐐�2",
+                "longitude": 125.15268854335208,
+                "latitude": 46.5542961263164,
+                "height": 147.70478259476405,
+                "relativePosition": {
+                    "x": 127.92680113529786,
+                    "y": 6.335606334730983,
+                    "z": -56.756238551810384
+                }
+            }
+        ],
+        "relativePosition": {
+            "x": 42.45445924857631,
+            "y": -45.13116115285084,
+            "z": -63.51276256516576
+        }
+    },
+    {
+        "id": "id_v5g7eyc8",
+        "label": "鍦伴潰鐐�2-鍔犻珮",
+        "longitude": 125.15398622045456,
+        "latitude": 46.55420774953827,
+        "height": 147.7039314240401,
+        "children": [
+            {
+                "id": "id_6w8bt6y5",
+                "label": "绌轰腑鐐�2-鍔犻珮",
+                "longitude": 125.15268854335208,
+                "latitude": 46.5542961263164,
+                "height": 197.70478259476405,
+                "relativePosition": {
+                    "x": 108.13033775659278,
+                    "y": 34.448136328253895,
+                    "z": -20.454920462332666
+                }
+            }
+        ],
+        "relativePosition": {
+            "x": 42.45445924857631,
+            "y": -45.13116115285084,
+            "z": -63.51276256516576
+        }
+    },
+    {
+        "id": "id_wztyoy7w",
+        "label": "鍦伴潰鐐�3",
+        "longitude": 125.15421307297069,
+        "latitude": 46.55421685854876,
+        "height": 148.48833812454288,
+        "children": [
+            {
+                "id": "id_cu78b9f1",
+                "label": "绌轰腑鐐�3-鍔犻珮",
+                "longitude": 125.15548763490776,
+                "latitude": 46.55440688016316,
+                "height": 198.48919020619783,
+                "relativePosition": {
+                    "x": -62.53922047605738,
+                    "y": -96.01450884295627,
+                    "z": -11.418861056677997
+                }
+            }
+        ],
+        "relativePosition": {
+            "x": 28.343377863056958,
+            "y": -55.307947248686105,
+            "z": -62.246930407360196
+        }
+    },
+    {
+        "id": "197ced8ed37d0c3c",
+        "label": "鍦伴潰鐐�3",
+        "longitude": 125.15421307297069,
+        "latitude": 46.55421685854876,
+        "height": 148.48833812454288,
+        "children": [
+            {
+                "id": "197ced8ed376225d",
+                "label": "绌轰腑鐐�3",
+                "longitude": 125.15548763490776,
+                "latitude": 46.55440688016316,
+                "height": 148.48919020619783,
+                "relativePosition": {
+                    "x": -42.741424133535475,
+                    "y": -124.12601430807263,
+                    "z": -47.72024560905993
+                }
+            }
+        ],
+        "relativePosition": {
+            "x": 28.343377863056958,
+            "y": -55.307947248686105,
+            "z": -62.246930407360196
+        }
+    },
+    {
+        "id": "197ced8ed378f22b",
+        "label": "鍦伴潰鐐�4",
+        "longitude": 125.15423241198647,
+        "latitude": 46.55421195661101,
+        "height": 129.07723014528972,
+        "children": [
+            {
+                "id": "197ced8ed37bbaff",
+                "label": "绌轰腑鐐�4",
+                "longitude": 125.1555253737729,
+                "latitude": 46.55432870085922,
+                "height": 129.07809286219634,
+                "relativePosition": {
+                    "x": -41.05480555212125,
+                    "y": -131.5471526850015,
+                    "z": -67.78957635723054
+                }
+            }
+        ],
+        "relativePosition": {
+            "x": 34.58874865854159,
+            "y": -66.75211867084727,
+            "z": -76.71461268886924
+        }
+    },
+    {
+        "id": "197ced8ed372f8ad",
+        "label": "鍦伴潰鐐�5",
+        "longitude": 125.15423571155253,
+        "latitude": 46.55422768619577,
+        "height": 111.12748104722147,
+        "children": [
+            {
+                "id": "197ced8ed373e993",
+                "label": "绌轰腑鐐�5",
+                "longitude": 125.15551594222936,
+                "latitude": 46.554398406019274,
+                "height": 112.12216624922397,
+                "relativePosition": {
+                    "x": -30.5103326481767,
+                    "y": -145.26342066843063,
+                    "z": -74.77150713000447
+                }
+            }
+        ],
+        "relativePosition": {
+            "x": 42.219932773150504,
+            "y": -78.02784454869106,
+            "z": -88.54415378533304
+        }
+    }
+]
+      this.renderRelativePoints(viewerM,data)
+    },
     handleClose(){
       this.dialogVisible = false
     },
@@ -158,15 +378,10 @@
     },
     mergePoint(arr,mergeNumber,viewer){
       this.treeData = arr
-      console.log(mergeNumber)
       const result = this.replaceCloseChildrenWithHighestPoint(this.treeData,mergeNumber);
-      console.log(result)
-      console.log(viewer)
-      console.log(window.viewer)
-      const updated = this.insertRaisedPoints(result, 125.1541, 46.5542, 236, 130);
+      // const updated = this.insertRaisedPoints(result, 0,0, 236, 130);
+      const updated = this.insertRaisedPoints(result, globalon, globalat, 236, 130);
       this.treeData = updated
-
-      console.log(updated)
       const airPoints = []
       this.treeData.forEach(item => {
         const ground = item
@@ -179,9 +394,9 @@
               ground.longitude, ground.latitude, ground.height,
               air.longitude, air.latitude, air.height
             ]),
-            width: 2,
+            width: 5,
             material: new Cesium.PolylineDashMaterialProperty({
-              color: Cesium.Color.WHITE,
+              color: Cesium.Color.RED,
               dashLength: 16.0
             })
           }
@@ -194,11 +409,14 @@
         viewer.entities.add({
           polyline: {
             positions: Cesium.Cartesian3.fromDegreesArrayHeights(positions),
-            width: 2,
-            material: Cesium.Color.YELLOW
+            width: 5,
+            material: Cesium.Color.RED
           }
         })
       }
+      console.log(this.treeData)
+      // this.conversionPosition()
+      this.dealData()
     },
     insertRaisedPoints(data, centerLon, centerLat, centerHeight, radius = 130) {
       const center = Cesium.Cartesian3.fromDegrees(centerLon, centerLat, centerHeight);
@@ -346,35 +564,12 @@
     },
     getRowData(row){
       console.log(row)
-      // //閫夋嫨濂芥ā鍨� 骞朵笖鑷姩椋炲埌妯″瀷浣嶇疆
-      // const position = Cesium.Cartesian3.fromDegrees(0, 0, 0);
-      // // 璁剧疆妯″瀷鏂瑰悜锛堝彲閫夛級
-      // // const heading = Cesium.Math.toRadians(135); // 鏈濅笢鍗楁柟鍚�
-      // let model = viewer.entities.getById("modelList");
-      // const heading = Cesium.Math.toRadians(120); // 鏈濅笢鍗楁柟鍚�
-      // const pitch = 0;
-      // const roll = 0;
-      // const orientation = Cesium.Transforms.headingPitchRollQuaternion(
-      //   position,
-      //   new Cesium.HeadingPitchRoll(heading, pitch, roll)
-      // );
-      // if(!model) {
-      //   // 鍔犺浇 glTF 妯″瀷
-      //   const entity = viewer.entities.add({
-      //     id: "modelList",
-      //     name: "modelList",
-      //     position: position,
-      //     orientation: orientation,
-      //     model: {
-      //       uri: "/Model/tower.glb", // 鏇挎崲鎴愪綘鐨勬ā鍨嬭矾寰�
-      //       scale: 1000,
-      //     },
-      //   });
-      //   viewer.flyTo(entity)
-      // }else {
-      //   model.orientation = orientation
-      // }
-      this.showMap = true
+      this.chooseModelId = row.id
+      this.showMap =false
+      this.$nextTick(()=>{
+        this.towerUrl = row.modelRoute
+        this.showMap = true
+      })
     },
     beforeDestroy() {
       // 娓呯悊 RAF 鍜屼簨浠�
@@ -407,8 +602,89 @@
     },
     handleDrop (draggingNode, dropNode, dropType, ev) {
       console.log('鎷栨嫿瀹屾垚', { draggingNode, dropNode, dropType })
-      // Element-UI 宸茬粡甯綘鎶� treeData 鐨勯『搴忚皟濂戒簡锛�
-      // 濡傛灉瑕佷繚瀛橀『搴忓埌鍚庣锛岄亶鍘� treeData 鍙戣姹傚嵆鍙�
+    },
+    toRelativePosition(lon, lat, height, centerCartesian) {
+      const worldPos = Cesium.Cartesian3.fromDegrees(lon, lat, height);
+      const relative = new Cesium.Cartesian3();
+      Cesium.Cartesian3.subtract(worldPos, centerCartesian, relative);
+      return relative;
+    },
+     wgs84ToCartesian(longitude, latitude, height) {
+      return Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
+    },
+    getOffsetFromTower(lon, lat, height, tower) {
+      const point = this.wgs84ToCartesian(lon, lat, height);
+      const towerPoint = this.wgs84ToCartesian(tower.longitude, tower.latitude, tower.height);
+
+      const offset = Cesium.Cartesian3.subtract(point, towerPoint, new Cesium.Cartesian3());
+      return {
+        x: offset.x,
+        y: offset.y,
+        z: offset.z
+      };
+    },
+    dealData(){
+      const rawData = this.treeData
+      let tower  ={
+        longitude:globalon,
+        latitude:globalat,
+        height:0
+      }
+      relativeData= rawData.forEach(item => {
+        item.offset = this.getOffsetFromTower(item.longitude, item.latitude, item.height, tower);
+
+        item.children?.forEach(child => {
+          child.offset = this.getOffsetFromTower(child.longitude, child.latitude, child.height, tower);
+        });
+      })
+      console.log(relativeData)
+    },
+    // conversionPosition(){
+    //   const rawData = this.treeData
+    //   // const centerCartesian = Cesium.Cartesian3.fromDegrees(0,0, 236);
+    //   const centerCartesian = Cesium.Cartesian3.fromDegrees(globalon, globalat, 236);
+    //   relativeData= rawData.map(ground => {
+    //     const relativeGround = this.toRelativePosition(
+    //       ground.longitude,
+    //       ground.latitude,
+    //       ground.height,
+    //       centerCartesian
+    //     );
+
+    //     const children = ground.children?.map(child => {
+    //       const relativeChild = this.toRelativePosition(
+    //         child.longitude,
+    //         child.latitude,
+    //         child.height,
+    //         centerCartesian
+    //       );
+    //       return {
+    //         ...child,
+    //         relativePosition: {
+    //           x: relativeChild.x,
+    //           y: relativeChild.y,
+    //           z: relativeChild.z,
+    //         }
+    //       };
+    //     });
+
+    //     return {
+    //       ...ground,
+    //       relativePosition: {
+    //         x: relativeGround.x,
+    //         y: relativeGround.y,
+    //         z: relativeGround.z,
+    //       },
+    //       children
+    //     };
+    //   });
+    //   console.log(relativeData)
+    // },
+    submit(){
+      // this.dialogVisible = false
+      this.$emit('close')
+      console.log(this.chooseModelId)
+      console.log(relativeData)
     }
   }
 }

--
Gitblit v1.9.3