| | |
| | | <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 |
| | |
| | | |
| | | // // æ´å¤ç¹... |
| | | // ], |
| | | 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]; |
| | |
| | | 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 = ` |
| | |
| | | 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: { |
| | |
| | | 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); |
| | |
| | | const kmlFile = Object.keys(zip.files).find(name => |
| | | name.endsWith(".kml") |
| | | ); |
| | | console.log(">> kmlFile:", kmlFile); |
| | | // console.log(">> kmlFile:", kmlFile); |
| | | if (!kmlFile) throw new Error("æªæ¾å°KMLæä»¶"); |
| | | |
| | | const kmlContent = await zip.file(kmlFile).async("text"); |
| | |
| | | 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]); |
| | | // } |
| | | }); |
| | | } |
| | | // è¾åºç»æ |
| | |
| | | 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}); |
| | | }); |
| | | } |
| | |
| | | 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) |
| | |
| | | //精度维度é«åº¦ |
| | | getScopeTower(lon,lat,distance).then(res=>{ |
| | | if(res.code == 200) { |
| | | console.log(res.rows) |
| | | res.rows.forEach((data) => { |
| | | this.createModel(data); |
| | | }); |
| | |
| | | }) |
| | | }, |
| | | createModel(data){ |
| | | console.log(data) |
| | | viewer.entities.add({ |
| | | id: data.id, |
| | | position: Cesium.Cartesian3.fromDegrees(data.longitude, data.latitude, data.altitude), |
| | |
| | | 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) |
| | |
| | | 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æä»¶æ¶ï¼è¿éæ¯uriï¼ä¸æ¯urlï¼å¹¶ä¸è¿ç§æ¹å¼åªè½å è½½.glbæ ¼å¼çæä»¶ |
| | | scale: 10, // ç¼©æ¾æ¯ä¾ |
| | | // minimumPixelSize: this.minSize, // æå°åç´ å¤§å°ï¼å¯ä»¥é¿å
太å°çä¸è§ |
| | | minimumPixelSize: 0, // æå°åç´ å¤§å°ï¼å¯ä»¥é¿å
太å°çä¸è§ |
| | | maximumScale: 20000, // 模åçæå¤§æ¯ä¾å°ºå¤§å°ãminimumPixelSizeçä¸é |
| | | incrementallyLoadTextures: true, // å 载模ååçº¹çæ¯å¦å¯ä»¥ç»§ç»æµå
¥ |
| | |
| | | leadTime: 60, |
| | | trailTime: 60 |
| | | }, |
| | | // orientation: Cesium.Quaternion.fromHeadingPitchRoll( |
| | | // new Cesium.HeadingPitchRoll( |
| | | // Cesium.Math.toRadians(45), // èªåè§(æ£å为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({ |
| | |
| | | } else { |
| | | console.warn('Frustum outline is not initialized'); |
| | | } |
| | | // æ´æ°è§é¥ä½è¾¹æ¡ |
| | | console.log(this.frustumOutline) |
| | | // this.frustumOutline.update(); |
| | | }, |
| | | listenChange() { |
| | | let viewer = window.viewer; |
| | |
| | | if (viewer.clock.shouldAnimate) { |
| | | this.getCurrentPosition() |
| | | // æ§è¡å¨ä½ |
| | | console.log("Clock is running, performing action..."); |
| | | // ä½ ç代ç é»è¾ |
| | | // console.log("Clock is running, performing action..."); |
| | | // ä½ ç代ç é» |
| | | } 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 |
| | |
| | | |
| | | // å°ç»çº¬åº¦ä»å¼§åº¦è½¬æ¢ä¸ºåº¦ |
| | | 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("æ æ³è·åå½åä½ç½®"); |
| | |
| | | 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], |
| | |
| | | // updateOnChange: false, |
| | | updateOnChange: true, |
| | | }) |
| | | console.log(this.frustumOutline) |
| | | viewer.scene.primitives.add(this.frustumOutline); |
| | | this.listenChange() |
| | | } |