From bcb67f336c2b352177884b8db6decc3fcf382bb0 Mon Sep 17 00:00:00 2001
From: jihongshun <1151753686@qq.com>
Date: 星期四, 11 九月 2025 16:58:13 +0800
Subject: [PATCH] 航线模拟  差视锥体的head值和时间轴

---
 src/views/system/flightRouteSimulation/index.vue |  157 ++++++++++++++++++++++------------------------------
 1 files changed, 66 insertions(+), 91 deletions(-)

diff --git a/src/views/system/flightRouteSimulation/index.vue b/src/views/system/flightRouteSimulation/index.vue
index c321ec2..743f851 100644
--- a/src/views/system/flightRouteSimulation/index.vue
+++ b/src/views/system/flightRouteSimulation/index.vue
@@ -1,6 +1,6 @@
 <template>
    <div class="app-container">
-    <el-button type="primary" @click="showGZ">涓昏鎸夐挳</el-button>
+    <el-button type="primary" @click="showGZ">鏄剧ず瑙嗛敟浣�</el-button>
     <input @change="handleKMZUpload" type="file" id="kmzFile" accept=".kmz" class="block w-full text-sm text-gray-500
     file:mr-4 file:py-2 file:px-4
     file:rounded-md file:border-0
@@ -93,36 +93,33 @@
 
       //   // 鏇村鐐�...
       // ],
-      trajectoryData:[],
-      c3Position:Cesium.Cartesian3.fromDegrees(125.14349012556997, 46.55684464616254,33.157873665937274),
-      enableChange:true,
+      trajectoryData:[],//鏁版嵁鏁扮粍
+      c3Position:Cesium.Cartesian3.fromDegrees(125.04159166971326, 46.63755601510411,33.13806141449017),//鍒濆鍖栦綅缃�
       camera: null,      // Cesium Camera 瀹炰緥
       frustumOutline: null, // 瑙嗛敟浣�
-      heading: 0,        // 鐩告満鐨� heading (鏈濆悜)
-      pitch: -90, // 鐩告満鐨� pitch (淇话)
+      heading: -90,        // 鐩告満鐨� heading (鏈濆悜)
+      pitch: 0, // 鐩告満鐨� pitch (淇话)
       roll: 0,           // 鐩告満鐨� roll (婊氳浆)
       aspectRatio: 1.0,  // 绾垫í姣�
       color: '#FF0000',  // 瑙嗛敟浣撻鑹�
       id: 'frustumOutline',
       positionProperty : new Cesium.SampledPositionProperty(),
-      orientation : new Cesium.SampledProperty(Cesium.Quaternion)
+      orientation : new Cesium.SampledProperty(Cesium.Quaternion),//鏃犱汉鏈烘湞鍚�
+      sztOrientation : new Cesium.SampledProperty(Cesium.Quaternion),//浜戝彴鏈濆悜
     }
   },
   mounted() {
-    console.log(window.viewer)
-    console.log(viewer)
-    // this.showGZ()
   },
   methods: {
     async handleKMZUpload(event) {
       const file = event.target.files[0];
       if (!file) return;
-
       try {
         const arrayBuffer = await this.readFileAsArrayBuffer(file);
         this.waypoints = await this.parseKMZ(arrayBuffer);
+        //鍔犵偣閫昏緫 姣斿鍚戠2-n-1涓彃鍏ュ厓绱�  缁忕含搴︿负褰撳墠鐨�  heading pitch roll 涓嬩竴涓殑
         const dealArr = [];
-        console.log(">> this.waypoints:", this.waypoints);
+        // console.log(">> this.waypoints:", this.waypoints);
         for (let i = 0; i < this.waypoints.length - 1; i++) {
             dealArr.push(this.waypoints[i]); // Push the current element
             const current = this.waypoints[i];
@@ -144,7 +141,7 @@
         dealArr.push(this.waypoints[this.waypoints.length - 1]);
 
         console.log(dealArr)
-        // this.waypoints = dealArr
+        this.waypoints = dealArr
         console.log(">> this.waypoints:", this.waypoints);
 
         this.fileInfo = `
@@ -157,9 +154,12 @@
         const speeds = [10, 10, 20, 30, 80, 100, 60, 50, 40, 30, 20, 10]; // 鑷畾涔夐�熷害
 
         // const result = this.waypoints.map((item, index) => {
+        console.log(result)
         const result = dealArr.map((item, index) => {
+        // const result = this.waypoints.map((item, index) => {
           // 姣忔鍔犱竴澶�
           const time = new Date(startDate.getTime() + index * 60 * 1000).toISOString();
+          // const time = Cesium.JulianDate.addSeconds(startDate, 3600, new Cesium.JulianDate());
           return {
             time,
             position: {
@@ -171,11 +171,12 @@
             pitch:item.pitch|| 0,
             roll:item.roll || 0,
             speed: speeds[index] || 0,
-            flyHeading:item.flyHeading
+            // flyHeading:item.flyHeading
           };
         });
         this.trajectoryData = result
-        console.log(result);
+        console.log(this.trajectoryData)
+        // console.log(result);
         this.loadTimeLine()
       } catch (error) {
         console.error(error);
@@ -199,7 +200,7 @@
       const kmlFile = Object.keys(zip.files).find(name =>
         name.endsWith(".kml")
       );
-      console.log(">> kmlFile:", kmlFile);
+      // console.log(">> kmlFile:", kmlFile);
       if (!kmlFile) throw new Error("鏈壘鍒癒ML鏂囦欢");
 
       const kmlContent = await zip.file(kmlFile).async("text");
@@ -238,35 +239,18 @@
                 totalPitch += gimbalPitch;
                 totalRoll += gimbalRoll;
                 totalHeading += gimbalYaw;
+                console.log('totalHeading閲岄潰寰幆' + totalHeading)
             }
             // 澶勭悊 rotateYaw 鍑芥暟
             if (action['wpml:actionActuatorFunc'].includes("rotateYaw")) {
                 // 鑾峰彇 aircraftHeading
                 const aircraftHeading = parseFloat(action['wpml:actionActuatorFuncParam'][0]["wpml:aircraftHeading"][0]);
+                console.log(aircraftHeading)
                 flyHeadingData = aircraftHeading
                 // 灏� aircraftHeading 绱姞鍒� totalHeading
                 totalHeading += aircraftHeading;
+                console.log('totalHeading澶栧眰澶栧眰澶栧眰澶栧眰澶栧眰寰幆' + totalHeading)
             }
-            // action['wpml:actionActuatorFuncParam'][0].['wpml:gimbalPitchRotateAngle']
-            // let params = action["wpml:actionActuatorFuncParam"]?.[0];
-
-            // if (!params) return;
-
-            // // 椋炴満鑸悜瑙�
-            // if (action["wpml:actionActuatorFunc"]?.[0] === "rotateYaw" &&
-            //     params["wpml:aircraftHeading"]) {
-            //   heading = Number(params["wpml:aircraftHeading"][0]);
-            // }
-
-            // // 浜戝彴瑙掑害
-            // if (action["wpml:actionActuatorFunc"]?.[0] === "gimbalRotate") {
-            //   if (params["wpml:gimbalPitchRotateAngle"])
-            //     gimbalPitch = Number(params["wpml:gimbalPitchRotateAngle"][0]);
-            //   if (params["wpml:gimbalRollRotateAngle"])
-            //     gimbalRoll = Number(params["wpml:gimbalRollRotateAngle"][0]);
-            //   if (params["wpml:gimbalYawRotateAngle"])
-            //     gimbalYaw = Number(params["wpml:gimbalYawRotateAngle"][0]);
-            // }
           });
         }
         // 杈撳嚭缁撴灉
@@ -276,7 +260,6 @@
         if (coords) {
           coords.trim().split(" ").forEach(coord => {
             const [lng, lat] = coord.split(",").map(Number);
-            //,heading:gimbalYaw || 0,pitch:gimbalPitch|| 0,roll:gimbalRoll|| 0
             points.push({ lng, lat, alt: height,heading:totalHeading  || 0,pitch:totalPitch || 0,roll:totalRoll|| 0 ,flyHeading:flyHeadingData});
           });
         }
@@ -318,9 +301,6 @@
     showFlightPath() {
       console.log(">> this.waypoints:", this.waypoints);
       if (this.waypoints.length === 0) return alert('璇峰厛涓婁紶KMZ鏂囦欢');
-
-      // viewer.entities.removeAll();
-
       // 杞崲鍧愭爣
       const positions = this.waypoints.map(wp =>
         Cesium.Cartesian3.fromDegrees(wp.lng, wp.lat, wp.alt)
@@ -367,7 +347,6 @@
       //绮惧害缁村害楂樺害
       getScopeTower(lon,lat,distance).then(res=>{
         if(res.code == 200) {
-          console.log(res.rows)
           res.rows.forEach((data) => {
             this.createModel(data);
           });
@@ -376,7 +355,6 @@
       })
     },
     createModel(data){
-      console.log(data)
       viewer.entities.add({
         id: data.id,
         position: Cesium.Cartesian3.fromDegrees(data.longitude, data.latitude, data.altitude),
@@ -404,7 +382,11 @@
     loadTimeLine(){
       // 璁剧疆鏃堕棿鑼冨洿
       const allTimes = this.trajectoryData.map(item => Cesium.JulianDate.fromIso8601(item.time))
-      console.log(allTimes)
+      // 鑾峰彇鎵�鏈夋椂闂达紝骞跺噺鍘�8灏忔椂
+      // const allTimes = this.trajectoryData.map(item => {
+      //     const time = Cesium.JulianDate.fromIso8601(item.time)
+      //     return Cesium.JulianDate.addHours(time, +8, new Cesium.JulianDate())
+      // })
       const startTime = allTimes[0]
       const stopTime = allTimes[allTimes.length - 1]
       // const startTime = Cesium.JulianDate.minimum(...allTimes)
@@ -433,45 +415,38 @@
         speedProperty.addSample(time, data.speed)
             // 璁$畻鏈濆悜鍥涘厓鏁�
         // const hpr = new Cesium.HeadingPitchRoll(
-        //     Cesium.Math.toRadians(data.heading),
+        //     Cesium.Math.toRadians(data.flyHeading),
         //     Cesium.Math.toRadians(data.pitch),
         //     Cesium.Math.toRadians(data.roll)
         // );
         const hpr = new Cesium.HeadingPitchRoll(
-            Cesium.Math.toRadians(data.flyHeading),
+            Cesium.Math.toRadians(0),
             Cesium.Math.toRadians(0),
             Cesium.Math.toRadians(0)
         );
         const quaternion = Cesium.Transforms.headingPitchRollQuaternion(position, hpr);
+        console.log(Cesium.JulianDate.toDate(time))
+        // // 娣诲姞椋炴満鏈濆悜閲囨牱
+        this.orientation.addSample(time, quaternion);
+        //浜戝彴
+        const szthpr = new Cesium.HeadingPitchRoll(
+            Cesium.Math.toRadians(data.heading),
+            Cesium.Math.toRadians(data.pitch),
+            Cesium.Math.toRadians(data.roll)
+        );
+        const sztquaternion = Cesium.Transforms.headingPitchRollQuaternion(position, szthpr);
         
-        // // 娣诲姞鏈濆悜閲囨牱
-        this.orientation.addSample(data.time, quaternion);
+        this.sztOrientation.addSample(time, sztquaternion);
       })
-      console.log(">> positionProperty:",this.positionProperty );
+      // console.log(">> positionProperty:",this.positionProperty );
 
       let entity = viewer.entities.add({
         show: true,
         position: this.positionProperty,
         id:'lineFly',
-        // label: {
-        //   show: true,
-        //   font: '18px 寰蒋闆呴粦',
-        //   style: Cesium.LabelStyle.FILL_AND_OUTLINE,
-        //   showBackground: false,
-        //   backgroundColor: Cesium.Color.fromCssColorString('#123456').withAlpha(0.5),
-        //   outlineColor: Cesium.Color.fromCssColorString('#00ff00'),
-        //   outlineWidth: 3,
-        //   fillColor: Cesium.Color.fromCssColorString("#000000"),
-        //   horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
-        //   verticalOrigin: Cesium.VerticalOrigin.TOP,
-        //   text: '娴嬭瘯鏂囧瓧',
-        //   // pixelOffset: new Cesium.Cartesian2(0, -1 * 100),
-        //   pixelOffset: new Cesium.Cartesian2(0, -90)
-        // },
         model: {
           uri: "/Model/M300.glb", // 娉ㄦ剰entitits.add鏂瑰紡鍔犺浇gltf鏂囦欢鏃讹紝杩欓噷鏄痷ri锛屼笉鏄痷rl锛屽苟涓旇繖绉嶆柟寮忓彧鑳藉姞杞�.glb鏍煎紡鐨勬枃浠�
           scale:  10, // 缂╂斁姣斾緥
-          // minimumPixelSize: this.minSize, // 鏈�灏忓儚绱犲ぇ灏忥紝鍙互閬垮厤澶皬鐪嬩笉瑙�
           minimumPixelSize: 0, // 鏈�灏忓儚绱犲ぇ灏忥紝鍙互閬垮厤澶皬鐪嬩笉瑙�
           maximumScale: 20000, // 妯″瀷鐨勬渶澶ф瘮渚嬪昂澶у皬銆俶inimumPixelSize鐨勪笂闄�
           incrementallyLoadTextures: true, // 鍔犺浇妯″瀷鍚庣汗鐞嗘槸鍚﹀彲浠ョ户缁祦鍏�
@@ -493,24 +468,12 @@
           leadTime: 60,
           trailTime: 60
         },
-        // orientation: Cesium.Quaternion.fromHeadingPitchRoll(
-        //     new Cesium.HeadingPitchRoll(
-        //         Cesium.Math.toRadians(45), // 鑸悜瑙�(姝e寳涓�0锛岄『鏃堕拡澧炲姞)
-        //         Cesium.Math.toRadians(45), // 淇话瑙�
-        //         Cesium.Math.toRadians(0)  // 缈绘粴瑙�
-        //     )
-        // ),
         orientation:this.orientation
       })
     },
      // 鏇存柊瑙嗛敟浣撲綅缃拰鏈濆悜
     updateFrustum() {
-      console.log(this.c3Position)
-      console.log(this.pitch)
-      console.log(this.heading)
-      console.log(this.roll)
       // 鏇存柊瑙嗛敟浣撲綅缃�
-      // this.c3Position = Cesium.Cartesian3.fromDegrees(114.169, 22.278, 500);  // 鍔ㄦ�佹洿鏂颁綅缃�
       if (this.frustumOutline) {
         // 鏇存柊鐩告満鍜岃閿ヤ綋浣嶇疆
         this.camera.setView({
@@ -525,9 +488,6 @@
       } else {
         console.warn('Frustum outline is not initialized');
       }
-      // 鏇存柊瑙嗛敟浣撹竟妗�
-      console.log(this.frustumOutline)
-      // this.frustumOutline.update();
     },
     listenChange() {
       let viewer =  window.viewer;
@@ -535,21 +495,27 @@
         if (viewer.clock.shouldAnimate) {
           this.getCurrentPosition()
         // 鎵ц鍔ㄤ綔
-        console.log("Clock is running, performing action...");
-        // 浣犵殑浠g爜閫昏緫
+        // console.log("Clock is running, performing action...");
+        // 浣犵殑浠g爜閫�
         } else {
             // 鏃堕挓鏆傚仠鏃朵笉鎵ц
-            console.log("Clock is paused, no action performed.");
+            // console.log("Clock is paused, no action performed.");
         }
       });
     },
     getCurrentPosition() {
       // 鑾峰彇褰撳墠鏃堕棿
       const currentTime = viewer.clock.currentTime;
+      console.log(Cesium.JulianDate.toDate(currentTime))
+      console.log('start:', Cesium.JulianDate.toDate(this.positionProperty._property._times[0]));
+      console.log('stop:', Cesium.JulianDate.toDate(this.positionProperty._property._times.slice(-1)[0]));
+      // const currentTime = Cesium.JulianDate.addHours(currentTime, -8, new Cesium.JulianDate());
       
+      console.log(currentTime)
       // 浠� positionProperty 涓幏鍙栧綋鍓嶄綅缃�
       const currentPosition = this.positionProperty.getValue(currentTime);
-      console.log('currentPosition>>>>>>>>>>>>>>>>>>>>>>>' + currentPosition)
+      
+      // console.log('currentPosition>>>>>>>>>>>>>>>>>>>>>>>' + currentPosition)
       // 濡傛灉鑾峰彇鍒颁綅缃�
       if (currentPosition) {
         // 灏嗕綅缃粠 Cartesian 杞崲涓� Cartographic
@@ -557,18 +523,32 @@
 
         // 灏嗙粡绾害浠庡姬搴﹁浆鎹负搴�
         this.currentLongitude = Cesium.Math.toDegrees(cartographicPosition.longitude);
+        console.log(Cesium.Math.toDegrees(cartographicPosition.longitude))
+        console.log(Cesium.Math.toDegrees(cartographicPosition.latitude))
         this.currentLatitude = Cesium.Math.toDegrees(cartographicPosition.latitude);
         this.currentHeight = cartographicPosition.height;
         this.c3Position = Cesium.Cartesian3.fromDegrees(this.currentLongitude, this.currentLatitude,this.currentHeight)
         // console.log(`褰撳墠浣嶇疆 - 缁忓害: ${this.currentLongitude}, 绾害: ${this.currentLatitude}, 楂樺害: ${this.currentHeight}`);
+        //鐩告満鍙樺寲
         const quaternion = this.orientation.getValue(currentTime)
-        if (quaternion) {
-          const hpr = Cesium.HeadingPitchRoll.fromQuaternion(quaternion)
+        // if(quaternion) {
+        //   const hpr111 = Cesium.HeadingPitchRoll.fromQuaternion(quaternion)
+        //   console.log('鐩告満鐨�   ' +Cesium.Math.toDegrees(hpr111.heading).toFixed(2))
+        // }
+        //浜戝彴鍙樺寲
+        const sztquaternion = this.sztOrientation.getValue(currentTime)
+        console.log(sztquaternion)
+        if (sztquaternion) {
+          const hpr = Cesium.HeadingPitchRoll.fromQuaternion(sztquaternion)
+          console.log(hpr)
           this.heading = Cesium.Math.toDegrees(hpr.heading).toFixed(2)
+          // this.heading = 180
           this.pitch = Cesium.Math.toDegrees(hpr.pitch).toFixed(2)
           this.roll = Cesium.Math.toDegrees(hpr.roll).toFixed(2)
-          console.log(`褰撳墠浣嶇疆 - heading: ${hpr.heading}, pitch: ${hpr.pitch}, roll: ${hpr.roll}`);
+          console.log('褰撳墠浣嶇疆 - heading ' + this.heading)
+          console.log(`褰撳墠浣嶇疆 - heading: ${this.heading}, pitch: ${this.pitch}, roll: ${this.roll}`);
         }
+        
         this.updateFrustum();
       } else {
         console.log("鏃犳硶鑾峰彇褰撳墠浣嶇疆");
@@ -588,16 +568,12 @@
         up: Cesium.Cartesian3.UNIT_Z,
         destination: this.c3Position,
         orientation: {
-          // heading: Cesium.Math.toRadians(this.heading),
-          // pitch: Cesium.Math.toRadians(this.pitch),
-          // roll: Cesium.Math.toRadians(this.roll),
           heading: Cesium.Math.toRadians(this.heading),
           pitch: Cesium.Math.toRadians(this.pitch),
           roll: Cesium.Math.toRadians(this.roll),
         },
       })
       this.frustumOutline = new Cesium.DebugCameraPrimitive({
-        // id: this.id,
         id: 111111,
         camera: this.camera,
         frustumSplits: [0.01, 10000],
@@ -605,7 +581,6 @@
         // updateOnChange: false,
         updateOnChange: true,
       })
-      console.log(this.frustumOutline)
       viewer.scene.primitives.add(this.frustumOutline);
       this.listenChange()
     }

--
Gitblit v1.9.3