From 1b179a0ac410e77b7ec3d187f7ca5fb4af23a997 Mon Sep 17 00:00:00 2001
From: jihongshun <1151753686@qq.com>
Date: 星期三, 24 九月 2025 11:51:57 +0800
Subject: [PATCH] 解决读取kmz问题

---
 src/views/system/flightRouteSimulation/index.vue |  114 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 103 insertions(+), 11 deletions(-)

diff --git a/src/views/system/flightRouteSimulation/index.vue b/src/views/system/flightRouteSimulation/index.vue
index b7eac18..dfc3fb9 100644
--- a/src/views/system/flightRouteSimulation/index.vue
+++ b/src/views/system/flightRouteSimulation/index.vue
@@ -237,9 +237,63 @@
         reader.readAsArrayBuffer(file);
       });
     },
+    azimuthtwopoi(x1, y1, x2, y2) {
+      let result;
+      let a = Math.abs(Math.atan((y2 - y1) / (x2 - x1))) * 180 / Math.PI;
+      if ((x2 - x1) < 0) {
+        if ((y2 - y1) > 0) {
+          result = a + 270;
+        } else {
+          result = 90 - a + 180;
+        }
+      } else {
+        if ((y2 - y1) > 0) {
+          result = 90 - a;
+        } else {
+          result = a + 90;
+        }
+      }
+      return result;
+    },
+    dealdDirection(x1, y1, x2, y2){
+      // 瀹氫箟鐐�1鍜岀偣2鐨勭粡绾害锛堝崟浣嶏細搴︼級
+      const point1 = Cesium.Cartesian3.fromDegrees(x1,y1); // 渚嬪锛氱偣1鐨勭粡绾害
+      const point2 = Cesium.Cartesian3.fromDegrees(x2, y2);      // 渚嬪锛氱偣2鐨勭粡绾害
 
+      // 璁$畻鏂瑰悜鍚戦噺
+      const direction = Cesium.Cartesian3.subtract(point2, point1, new Cesium.Cartesian3());
+
+      // 褰掍竴鍖栨柟鍚戝悜閲�
+      Cesium.Cartesian3.normalize(direction, direction);
+
+      // 璁$畻鑸悜銆佷刊浠板拰婊氳浆瑙�
+      const headingPitchRoll = Cesium.HeadingPitchRoll.fromCartesian3(direction);
+
+      // 鏄剧ず缁撴灉
+      console.log('Heading:', Cesium.Math.toDegrees(headingPitchRoll.heading));
+      console.log('Pitch:', Cesium.Math.toDegrees(headingPitchRoll.pitch));
+      console.log('Roll:', Cesium.Math.toDegrees(headingPitchRoll.roll));
+    },
+    Bearing(from, to){
+      from = Cesium.Cartographic.fromCartesian(from)
+      to = Cesium.Cartographic.fromCartesian(to)
+
+      let lat1 = from.latitude
+      let lon1 = from.longitude
+      let lat2 = to.latitude
+      let lon2 = to.longitude
+      let angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2))
+      if (angle < 0) {
+        angle += Math.PI * 2.0
+      }
+      let degreesPerRadian = 180.0 / Math.PI // 寮у害杞寲涓鸿搴�
+
+      angle = angle * degreesPerRadian // 瑙掑害
+      return angle
+    },
     // 瑙f瀽KMZ鏂囦欢
     async parseKMZ(kmzData) {
+
       // 鈿狅笍 杩欓噷鐩存帴浣跨敤鍏ㄥ眬 JSZip 鍜� xml2js锛堥�氳繃CDN寮曞叆锛�
       const zip = await JSZip.loadAsync(kmzData);
       const kmlFile = Object.keys(zip.files).find(name =>
@@ -259,9 +313,39 @@
         result.kml.Document[0].Folder[0].Placemark || [];
       const points = [];
       var  lastZoom =1
-      placemarks.forEach(placemark => {
-        const coords = placemark.Point?.[0]?.coordinates?.[0];
-        const height = placemark["wpml:height"]?.[0];
+      let lastHeading = 0
+      for(let i=0;i<placemarks.length;i++){
+        const coords = placemarks[i].Point?.[0]?.coordinates?.[0];
+        const height = placemarks[i]["wpml:height"]?.[0];
+        if(i<placemarks.length-1){
+          // console.log(placemarks[i])
+          console.log( placemarks[i].Point?.[0]?.coordinates?.[0].split(',')[0])
+          console.log( placemarks[i].Point?.[0]?.coordinates?.[0].split(',')[1])
+          console.log( placemarks[i+1].Point?.[0]?.coordinates?.[0].split(',')[0])
+          console.log( placemarks[i+1].Point?.[0]?.coordinates?.[0].split(',')[1])
+          let lon1 = placemarks[i].Point?.[0]?.coordinates?.[0].split(',')[0]
+          let lat1 = placemarks[i].Point?.[0]?.coordinates?.[0].split(',')[1]
+          let lon2 = placemarks[i+1].Point?.[0]?.coordinates?.[0].split(',')[0]
+          let lat2 = placemarks[i+1].Point?.[0]?.coordinates?.[0].split(',')[1]
+          // console.log(this.azimuthtwopoi(lon1,lat1,lon2,lat2))
+          // lastHeading =  this.azimuthtwopoi(lon1,lat1,lon2,lat2)
+          var nowHeading = this.azimuthtwopoi(lon1,lat1,lon2,lat2)
+          if(!nowHeading){
+            nowHeading = lastHeading
+          }else {
+            let p1 = {"lng": lon1, "lat": lat1, "alt": height};
+
+            let p2 = {"lng": lon2, "lat": lat2, "alt": height};
+
+          let c1 = Cesium.Cartesian3.fromDegrees(p1.lng,p1.lat,p1.height);
+          let c2 = Cesium.Cartesian3.fromDegrees(p2.lng,p2.lat,p2.height);
+          lastHeading = this.Bearing(c1, c2);
+            // lastHeading = this.azimuthtwopoi(lon1,lat1,lon2,lat2)
+          }
+       
+          console.log(lastHeading)
+            console.log('+++++++++++++++++++++++++')
+        }
         // 鎻愬彇 aircraftHeading
         // 鎻愬彇 action 閲岀殑鍙傛暟
         // 鍒濆鍖� Pitch, Roll 鍜� Heading
@@ -269,24 +353,31 @@
         let totalRoll = 0;
         let totalHeading = 0;
         let flyHeadingData = 0;
-        if (placemark["wpml:actionGroup"]?.[0]?.["wpml:action"]) {
-          placemark["wpml:actionGroup"][0]["wpml:action"].forEach(action => {
+        if (placemarks[i]["wpml:actionGroup"]?.[0]?.["wpml:action"]) {
+          placemarks[i]["wpml:actionGroup"][0]["wpml:action"].forEach(action => {
             // 澶勭悊 gimbalRotate 鍜� rotateYaw 鍑芥暟
             if (action['wpml:actionActuatorFunc'].includes("gimbalRotate")) {
                 // 鑾峰彇姣忎釜瑙掑害鍊�
                 const gimbalPitch = parseFloat(action['wpml:actionActuatorFuncParam'][0]["wpml:gimbalPitchRotateAngle"][0]);
                 const gimbalRoll = parseFloat(action['wpml:actionActuatorFuncParam'][0]["wpml:gimbalRollRotateAngle"][0]);
                 const gimbalYaw = parseFloat(action['wpml:actionActuatorFuncParam'][0]["wpml:gimbalYawRotateAngle"][0]);
-
+                if(gimbalYaw < 0 ){   
+                  gimbalYaw += 360
+                }
                 // 绱姞 Pitch, Roll 鍜� Heading
                 totalPitch += gimbalPitch;
                 totalRoll += gimbalRoll;
-                totalHeading += gimbalYaw;
+                // totalHeading += gimbalYaw;
+                
             }
             // 澶勭悊 rotateYaw 鍑芥暟
             if (action['wpml:actionActuatorFunc'].includes("rotateYaw")) {
                 // 鑾峰彇 aircraftHeading
-                const aircraftHeading = parseFloat(action['wpml:actionActuatorFuncParam'][0]["wpml:aircraftHeading"][0]);
+                var aircraftHeading = parseFloat(action['wpml:actionActuatorFuncParam'][0]["wpml:aircraftHeading"][0]);
+                
+                if(aircraftHeading <0) {
+                  aircraftHeading+=360
+                }
                 flyHeadingData = aircraftHeading
                 // 灏� aircraftHeading 绱姞鍒� totalHeading
                 totalHeading += aircraftHeading;
@@ -302,11 +393,11 @@
         if (coords) {
           coords.trim().split(" ").forEach(coord => {
             const [lng, lat] = coord.split(",").map(Number);
-            points.push({ lng, lat, alt: height,heading:totalHeading  || 0,pitch:totalPitch || 0,roll:totalRoll|| 0 ,flyHeading:flyHeadingData,zoom :lastZoom});
+            points.push({ lng, lat, alt: height,heading:totalHeading ?totalHeading:lastHeading ,pitch:totalPitch || 0,roll:totalRoll|| 0 ,flyHeading:flyHeadingData,zoom :lastZoom});
           });
         }
-      });
-
+      }
+      console.log(points)
       if (points.length === 0) throw new Error("鏈壘鍒版湁鏁堣埅鐐�");
       return points;
     },
@@ -582,6 +673,7 @@
         const holderYtHeading = this.holderHeadingProperty.getValue(currentTime)
         const holderYtPitch = this.holderPitchProperty.getValue(currentTime)
         const holderYtRoll = this.holderRollProperty.getValue(currentTime)
+        console.log(holderYtHeading)
         if(holderYtHeading) {
           this.heading = holderYtHeading
           this.pitch = holderYtPitch

--
Gitblit v1.9.3