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