From c110295e9d7e87ec5012e37ad5ba2b38f745ccd3 Mon Sep 17 00:00:00 2001
From: jihongshun <1151753686@qq.com>
Date: 星期五, 15 八月 2025 15:40:08 +0800
Subject: [PATCH] 优化线的逻辑

---
 src/utils/components/init-map.vue |  232 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 219 insertions(+), 13 deletions(-)

diff --git a/src/utils/components/init-map.vue b/src/utils/components/init-map.vue
index 245944d..09fcf3b 100644
--- a/src/utils/components/init-map.vue
+++ b/src/utils/components/init-map.vue
@@ -27,11 +27,13 @@
     </div>
 
       <!-- 宸︿笅瑙掑�嶇巼淇℃伅 -->
-      <div class="zoom-info">
-        <el-tag type="success">鍊嶇巼: {{ zoomRatio.toFixed(1) }}X</el-tag>
-      </div>
+      
     </div>
-
+    <div class="zoom-info">
+        <el-tag type="success">鍊嶇巼: {{ zoomRatio.toFixed(1) }}X</el-tag><br>
+        <el-tag type="success">璺濈: {{ betweenDistance.toFixed(1) }}绫�</el-tag><br>
+        <el-tag type="success">P: {{ cameraP }}&nbsp;&nbsp;T: {{ cameraT }} </el-tag>
+    </div>
     
     
     <!-- botton -->
@@ -172,7 +174,13 @@
           14: '14X',
           28: '28X',
           56: '56X'
-        }
+        },
+        betweenDistance:0,
+        cameraP:0.0,
+        cameraT:0.0,
+        pointGround: { lon: 0, lat: 0, height: 0 },
+        pointFly: { lon: 0, lat: 0, height: 0 },
+        rowData:null
     }
   },
   mounted(){
@@ -315,6 +323,7 @@
     creatPin(id, position, font, color, viewer) {
       let pinBuilder = new Cesium.PinBuilder();
       let addPin = viewer.entities.getById(id);
+      console.log(addPin)
       if (addPin == undefined) {
         viewer.entities.add({
           id: id,
@@ -377,20 +386,41 @@
                 //鏇存柊閿洏浜嬩欢
                 _this.updateCameraMovement();
                 //褰撳墠閫夋嫨鐨刬d
-                chooseId = crypto.randomUUID()
+                // chooseId = crypto.randomUUID()
+                chooseId = _this.genId()
                 //鍒涘缓瑙嗛敟浣�
                 let data = {
                     "altitude":  Cesium.Cartographic.fromCartesian(tagert).height,
                     "id": chooseId,
+                    'name':`绌轰腑鐐�${counter}`,
                     "latitude": Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude),
                     "longitude":  Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude),
                 }
+                const lookPoint = Cesium.Cartesian3.fromDegrees(longitude, latitude)
+                const watchPoint = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude), Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude))
+                const betweenDistanceWatch = Cesium.Cartesian3.distance(lookPoint, watchPoint)
+                _this.betweenDistance = betweenDistanceWatch
+                console.log(lookPoint)
+                console.log(watchPoint)
+                // const guanPoint1 = Cesium.Cartesian3.fromDegrees(longitude, latitude)
+                console.log(viewerM.entities.getById('groundPoiId0'))
                 //濉旂殑璺濈鍜岃娴嬬偣鐨勮窛绂�
                 console.log(_this.deviceData)
                 const point1 = Cesium.Cartesian3.fromDegrees(0, 0, _this.deviceData?.modelHeight || 45);
+                _this.pointGround = {
+                  lon:longitude,
+                  lat:latitude,
+                  height:height
+                }
                 // const point1 = Cesium.Cartesian3.fromDegrees(0, 0, 45);
                 const point2 = Cesium.Cartesian3.fromDegrees(Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude), Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude), Cesium.Cartographic.fromCartesian(tagert).height);
-
+                _this.pointFly = {
+                  lon:Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).longitude),
+                  lat:Cesium.Math.toDegrees(Cesium.Cartographic.fromCartesian(tagert).latitude),
+                  height:Cesium.Cartographic.fromCartesian(tagert).height
+                }
+                _this.createDashedLine()
+                _this.createBillboard()
                 // 璁$畻璺濈锛堝崟浣嶏細绫筹級
                 const distanceCalculate = Cesium.Cartesian3.distance(point1, point2)
                 data.distance = distanceCalculate
@@ -400,8 +430,8 @@
                 setTimeout(() => {
                   viewerC.camera.changed.addEventListener(_this.onCameraChange)
                 }, 100);
-                
-
+                //宸︿晶鏍戠粨鏋勮仈鍔�
+                _this.dealTree()
                 //缁撴潫鍙抽敭鐩戝惉
                 createPinHandler.destroy();
                 //缁撴潫涓诲浘鑱斿姩楣扮溂鐩戝惉
@@ -412,6 +442,48 @@
             }
             console.log('鍙抽敭鐐瑰嚮鐩戝惉宸插仠姝�');
         }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);  // 鐩戝惉鍙抽敭鐐瑰嚮
+    },
+    createDashedLine() {
+      this.lineEntity = viewerM.entities.add({
+        polyline: {
+          positions: new Cesium.CallbackProperty(() => {
+            return Cesium.Cartesian3.fromDegreesArrayHeights([
+              this.pointGround.lon, this.pointGround.lat, this.pointGround.height,
+              this.pointFly.lon, this.pointFly.lat, this.pointFly.height,
+            ]);
+          }, false),
+          width: 3,
+          material: new Cesium.PolylineDashMaterialProperty({
+            color: Cesium.Color.RED,
+          }),
+        },
+      });
+    },
+    createBillboard() {
+      // Billboard 涓偣璁$畻
+      viewerM.entities.add({
+        position: new Cesium.CallbackProperty(() => {
+          const midLon = (this.pointGround.lon + this.pointFly.lon) / 2;
+          const midLat = (this.pointGround.lat + this.pointFly.lat) / 2;
+          const midHeight = (this.pointGround.height + this.pointFly.height) / 2;
+          return Cesium.Cartesian3.fromDegrees(midLon, midLat, midHeight);
+        }, false),
+        label: {
+          text: new Cesium.CallbackProperty(() => {
+            return `璺濈: ${this.betweenDistance.toFixed(1)} m\nP: ${this.cameraP}\nT:${this.cameraT}`;
+          }, false),
+          font: "16px sans-serif",
+          fillColor: Cesium.Color.BLACK,
+          outlineColor: Cesium.Color.WHITE,
+          outlineWidth: 2,
+          style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+          horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
+          pixelOffset: new Cesium.Cartesian2(0, -20), // 鍚戜笂鍋忕Щ
+          showBackground: true,
+          backgroundColor: new Cesium.Color(1, 1, 1, 0.7),
+        },
+      });
     },
     azimuthtwopoi(x1, y1, x2, y2) {
       let result;
@@ -508,6 +580,7 @@
       }
     },
     onKeyUp(event) {
+      console.log()
       //閿洏鎶捣杩涜鏇存柊宸︿晶绌轰腑鐐筽in
       //鑾峰彇鍙充晶鐩告満
       if(rightKeyMove){
@@ -533,6 +606,32 @@
         } else {
           groupEntity.position = position;
         }
+        //璁$畻涓や釜鐐硅窛绂�
+        console.log(viewerM.entities)
+        const groupEntityGround = viewerM.entities.getById("groundPoiId"+(counter-1));
+        const groupPosition  = groupEntityGround.position.getValue(Cesium.JulianDate.now());
+        if (groupPosition) {
+            const cartographic = Cesium.Cartographic.fromCartesian(groupPosition);
+            const longitude = Cesium.Math.toDegrees(cartographic.longitude);
+            const latitude = Cesium.Math.toDegrees(cartographic.latitude);
+            const point1 = Cesium.Cartesian3.fromDegrees(lon, lat);
+            const point2 = Cesium.Cartesian3.fromDegrees(longitude, latitude);
+            const gure = Cesium.Cartesian3.distance(point1, point2)
+            this.betweenDistance  = gure
+        }
+        if(this.rowData) {
+          this.pointGround = {
+            lon:this.rowData.longitude,
+            lat:this.rowData.latitude,
+            height:this.rowData.height
+          }
+        }
+        this.pointFly = { 
+          lon: lon, 
+          lat: lat, 
+          height: height 
+        }
+        this.dealTree()
       }
       const key = event.key;
       const lower = key.toLowerCase();
@@ -699,6 +798,46 @@
       // Fly back to the initial view (home) in 1 second
       viewerC.camera.flyHome(1.0);
     },
+    dealTree(){
+      let allEntities = viewerM.entities.values; // 鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍
+      const grouped = {};
+      //鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍杞崲鎴愬乏渚ф爲闇�瑕佺殑鏍煎紡
+      allEntities.forEach(item => {
+        const match = item.id.match(/(groundPoiId|aerialPoiId)(\d+)/);
+        if (match) {
+          const type = match[1]; // groundPoiId or aerialPoiId
+          const index = match[2];
+          if (!grouped[index]) grouped[index] = {};
+          grouped[index][type] = item.position;
+        }
+      })
+      const result = Object.keys(grouped).map((key, idx) => {
+        const group = grouped[key];
+        const positionGround = group.groundPoiId.getValue(Cesium.JulianDate.now())
+        const positionAerialPo = group.aerialPoiId.getValue(Cesium.JulianDate.now())
+        const groundPos = Cesium.Cartographic.fromCartesian(positionGround);
+        const aerialPos = Cesium.Cartographic.fromCartesian(positionAerialPo);
+        return {
+          id: this.genId(),
+          label: `鍦伴潰鐐�${idx}`,
+          longitude: Cesium.Math.toDegrees(groundPos.longitude),
+          latitude: Cesium.Math.toDegrees(groundPos.latitude),
+          height: groundPos.height,
+          children: [
+            {
+              id: this.genId(),
+              label: `绌轰腑鐐�${idx}`,
+              longitude: Cesium.Math.toDegrees(aerialPos.longitude),
+              latitude: Cesium.Math.toDegrees(aerialPos.latitude),
+              height: aerialPos.height,
+              heading:Cesium.Math.toDegrees(viewerC.camera.heading),
+              pitch:Cesium.Math.toDegrees(viewerC.camera.pitch)
+            }
+          ]
+        };
+      });
+      this.$emit('dealTreeData',result)
+    },
     mergePoint(){
       let allEntities = viewerM.entities.values; // 鎵�鏈夊疄浣撳璞$粍鎴愮殑鏁扮粍
       const grouped = {};
@@ -832,6 +971,7 @@
         // viewer.scene.primitives.add(cameraVideo);
         let pmObj = {};
         pmObj.id = data.id;
+        pmObj.name = data.name;
         pmObj.primitive = cameraVideo;
         viewerM.scene.primitives.add(cameraVideo);
         preVideoScopePrimitiveArrTie.push(pmObj);
@@ -922,10 +1062,12 @@
         ',' +
         roll.toFixed(1) +
         '\u00B0';
+        console.log(heading)
+      this.cameraP = heading.toFixed(2)
+      this.cameraT = pitch.toFixed(2)
       document.getElementById('cammoveResultCon').innerHTML = camResult;
       // 璁$畻璺濈锛堝崟浣嶏細绫筹級
       const distanceBetween = Cesium.Cartesian3.distance(point1, point2)
-      console.log(preVideoScopePrimitiveArrTie)
       preVideoScopePrimitiveArrTie.map((item)=>{
         if(item.id == chooseId){
           let obj = this.updateSZScope(Cesium.Math.toDegrees(position.longitude),Cesium.Math.toDegrees(position.latitude),position.height,heading,pitch,roll,this.zoomRatio,distanceBetween)
@@ -973,6 +1115,70 @@
     },
     onSliderInput(val) {
       this.zoomRatio = val;
+    },
+    // 璁$畻 heading锛堝亸鑸锛�
+    computeHeading(fromCartesian, toCartesian) {
+      const transform = Cesium.Transforms.eastNorthUpToFixedFrame(fromCartesian);
+      const direction = Cesium.Cartesian3.subtract(
+        toCartesian,
+        fromCartesian,
+        new Cesium.Cartesian3()
+      );
+      const directionLocal = Cesium.Matrix4.multiplyByPointAsVector(
+        Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4()),
+        direction,
+        new Cesium.Cartesian3()
+      );
+      Cesium.Cartesian3.normalize(directionLocal, directionLocal);
+      return Math.atan2(directionLocal.x, directionLocal.y);
+    },
+
+    // 璁$畻 pitch锛堜刊浠拌锛�
+    computePitch(fromCartesian, toCartesian) {
+      const transform = Cesium.Transforms.eastNorthUpToFixedFrame(fromCartesian);
+      const direction = Cesium.Cartesian3.subtract(
+        toCartesian,
+        fromCartesian,
+        new Cesium.Cartesian3()
+      );
+      const directionLocal = Cesium.Matrix4.multiplyByPointAsVector(
+        Cesium.Matrix4.inverseTransformation(transform, new Cesium.Matrix4()),
+        direction,
+        new Cesium.Cartesian3()
+      );
+      Cesium.Cartesian3.normalize(directionLocal, directionLocal);
+      return Math.asin(directionLocal.z); // z杞村悜涓�
+    },
+    DealVisualCone(data,node){
+      this.rowData = data
+      console.log(data)
+      this.pointGround = {
+        lon:data.children[0].longitude,
+        lat:data.children[0].latitude,
+        height:data.children[0].height
+      }
+      this.pointFly = {
+        lon:data.longitude,
+        lat:data.latitude,
+        height:data.height
+      }
+      if(data.children && data.children?.length > 0) {
+        preVideoScopePrimitiveArrTie.map((item)=>{
+          if(item.name != data.children[0].label){
+            item.primitive.show = false
+          }else{
+             item.primitive.show = true
+          }
+        })
+      }else {
+        preVideoScopePrimitiveArrTie.map((item)=>{
+          if(item.name != data.label){
+            item.primitive.show = false
+          }else {
+            item.primitive.show = true
+          }
+        })
+      }
     }
   }
 }
@@ -1024,7 +1230,7 @@
 }
 .moveResult{position:absolute;z-index:2;background-color:rgba(47,53,60,1);padding:0 5px;right:50%;bottom:30px;
     border:1px solid rgba(255,255,255,.1);box-sizing:content-box;width:220px;height:30px;font-size:14px;text-align:center}
-.cammoveResult{position:absolute;z-index:2;background-color:rgba(47,53,60,1);padding:0 5px;right:calc(50% - 40px);bottom:30px;
+.cammoveResult{position:absolute;z-index:2;background-color:rgba(47,53,60,1);padding:0 5px;right:calc(50% - 140px);bottom:35px;
     border:1px solid rgba(255,255,255,.1);box-sizing:content-box;width:400px;height:30px;font-size:14px;text-align:center}
 .moveResultCon{margin-top:4px}
 .cammoveResultCon{margin-top:4px;color: white;}
@@ -1113,8 +1319,8 @@
 /* 宸︿笅瑙掑�嶇巼鏍囩 */
 .zoom-info {
   position: absolute;
-  bottom: 20px;
-  left: 20px;
+  bottom: 35px;
+  left: 340px;
 }
 
 </style>

--
Gitblit v1.9.3