| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-button type="primary" @click="showGZ">显示视锥体</el-button> |
| | | <a @click="showGZ">显示视锥体</a> |
| | | <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 |
| | | file:text-sm file:font-semibold |
| | | file:bg-blue-50 file:text-blue-700 |
| | | hover:file:bg-blue-100"> |
| | | <CesiumMap style="height: 790px;"></CesiumMap> |
| | | <CesiumMap style="height: 790px;" :showAnimation = true :showCesiumCompass = true :cesiumId="'cesiumContainer'"></CesiumMap> |
| | | <CesiumMap style="height: 324px;width: 576px;" :showAnimation = false :showCesiumCompass = false :cesiumId="'cesiumContainerYY'" class="eagleye"></CesiumMap> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | 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]; |
| | | const next = this.waypoints[i + 1]; |
| | | |
| | | // Create a new element with the current lng, lat and next heading, pitch, roll |
| | | dealArr.push({ |
| | | "lng": current.lng, |
| | | "lat": current.lat, |
| | | "alt": current.alt, |
| | | "lng": next.lng, |
| | | "lat": next.lat, |
| | | "alt": next.alt, |
| | | 'flyHeading':next.flyHeading, |
| | | "heading": next.heading, |
| | | "pitch": next.pitch, |
| | | "roll": next.roll |
| | | "heading": current.heading, |
| | | "pitch": current.pitch, |
| | | "roll": current.roll |
| | | }); |
| | | } |
| | | |
| | |
| | | heading:item.heading|| 0, |
| | | pitch:item.pitch|| 0, |
| | | roll:item.roll || 0, |
| | | speed: speeds[index] || 0, |
| | | // speed: speeds[index] || 0, |
| | | speed: 80, |
| | | // flyHeading:item.flyHeading |
| | | }; |
| | | }); |
| | |
| | | console.log("Total Heading:", totalHeading); |
| | | if (coords) { |
| | | coords.trim().split(" ").forEach(coord => { |
| | | console.log(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}); |
| | | }); |
| | |
| | | return R * c; |
| | | }, |
| | | showFlightPath() { |
| | | let viewer = window['cesiumContainer'].viewer |
| | | console.log(">> this.waypoints:", this.waypoints); |
| | | if (this.waypoints.length === 0) return alert('请先上传KMZ文件'); |
| | | // 转换坐标 |
| | |
| | | }) |
| | | }, |
| | | createModel(data){ |
| | | let viewer = window['cesiumContainer'].viewer |
| | | viewer.entities.add({ |
| | | id: data.id, |
| | | position: Cesium.Cartesian3.fromDegrees(data.longitude, data.latitude, data.altitude), |
| | |
| | | disableDepthTestDistance: 100000000 |
| | | } |
| | | }); |
| | | window['cesiumContainerYY'].viewer.entities.add({ |
| | | id:data.id+ 'yytower', |
| | | position: Cesium.Cartesian3.fromDegrees(data.longitude, data.latitude, data.altitude), |
| | | model: { |
| | | uri: data?.ardTowerModel?.modelRoute, |
| | | scale: 1, |
| | | }, |
| | | label: { |
| | | show: true, |
| | | verticalOrigin: Cesium.VerticalOrigin.BOTTOM, |
| | | horizontalOrigin: Cesium.HorizontalOrigin.CENTER, |
| | | font: '28px Helvetica', |
| | | outlineColor: Cesium.Color.RED, |
| | | outlineWidth: 3, |
| | | fillColor: Cesium.Color.fromCssColorString('#FFFFFF'), //44c3cc |
| | | text: data.deviceName, |
| | | style: Cesium.LabelStyle.FILL_AND_OUTLINE, |
| | | pixelOffset: new Cesium.Cartesian2(0.0, -56.0), |
| | | scaleByDistance: new Cesium.NearFarScalar(1000, 0.6, 10000, 0.4), |
| | | pixelOffsetScaleByDistance: new Cesium.NearFarScalar(1000, 0.4, 10000, 0.4), |
| | | disableDepthTestDistance: 100000000 |
| | | } |
| | | }); |
| | | }, |
| | | loadTimeLine(){ |
| | | let viewer = window['cesiumContainer'].viewer |
| | | // 设置时间范围 |
| | | console.log(this.trajectoryData) |
| | | const allTimes = this.trajectoryData.map(item => Cesium.JulianDate.fromIso8601(item.time)) |
| | | // 获取所有时间,并减去8小时 |
| | | // const allTimes = this.trajectoryData.map(item => { |
| | | // const time = Cesium.JulianDate.fromIso8601(item.time) |
| | | // return Cesium.JulianDate.addHours(time, +8, new Cesium.JulianDate()) |
| | | // }) |
| | | console.log(allTimes) |
| | | const startTime = allTimes[0] |
| | | const stopTime = allTimes[allTimes.length - 1] |
| | | console.log(startTime) |
| | | console.log(stopTime) |
| | | // const startTime = Cesium.JulianDate.minimum(...allTimes) |
| | | // const stopTime = Cesium.JulianDate.maximum(...allTimes) |
| | | |
| | | viewer.clock.startTime = startTime.clone() |
| | | viewer.clock.stopTime = stopTime.clone() |
| | | viewer.clock.currentTime = startTime.clone() |
| | | viewer.clock.clockRange = Cesium.ClockRange.LOOP_STOP |
| | | viewer.clock.clockRange = Cesium.ClockRange.CLAMPED |
| | | viewer.timeline.zoomTo(startTime, stopTime) |
| | | |
| | | const duration = Cesium.JulianDate.secondsDifference(stopTime, startTime); |
| | | console.log(`时间轴总时长: ${duration} 秒`) |
| | | |
| | | // 创建位置和速度属性 |
| | | const speedProperty = new Cesium.SampledProperty(Number) |
| | |
| | | // 添加采样点 |
| | | this.trajectoryData.forEach(data => { |
| | | const time = Cesium.JulianDate.fromIso8601(data.time) |
| | | console.log("存储的时间:", Cesium.JulianDate.toDate(time)) |
| | | const position = Cesium.Cartesian3.fromDegrees( |
| | | data.position.longitude, |
| | | data.position.latitude, |
| | |
| | | Cesium.Math.toRadians(0) |
| | | ); |
| | | const quaternion = Cesium.Transforms.headingPitchRollQuaternion(position, hpr); |
| | | console.log(Cesium.JulianDate.toDate(time)) |
| | | // // 添加飞机朝向采样 |
| | | this.orientation.addSample(time, quaternion); |
| | | //云台 |
| | |
| | | Cesium.Math.toRadians(data.pitch), |
| | | Cesium.Math.toRadians(data.roll) |
| | | ); |
| | | console.log(szthpr) |
| | | // console.log( Cesium.Math.toRadians(data.heading)) |
| | | const sztquaternion = Cesium.Transforms.headingPitchRollQuaternion(position, szthpr); |
| | | |
| | | console.log(sztquaternion) |
| | | this.sztOrientation.addSample(time, sztquaternion); |
| | | console.log(this.sztOrientation) |
| | | // console.log(this.orientation) |
| | | }) |
| | | // console.log(">> positionProperty:",this.positionProperty ); |
| | | |
| | |
| | | } else { |
| | | console.warn('Frustum outline is not initialized'); |
| | | } |
| | | let yyDestination = this.c3Position |
| | | window['cesiumContainerYY'].viewer.camera.setView( |
| | | { |
| | | destination: yyDestination, |
| | | orientation: { |
| | | // 指向 |
| | | heading: Cesium.Math.toRadians(Number(this.heading)), |
| | | // 视角 |
| | | pitch: Cesium.Math.toRadians(Number(this.pitch)), |
| | | roll: Cesium.Math.toRadians(Number(this.roll)) |
| | | } |
| | | } |
| | | ) |
| | | }, |
| | | listenChange() { |
| | | let viewer = window.viewer; |
| | | let viewer = window['cesiumContainer'].viewer; |
| | | viewer.clock.onTick.addEventListener(() => { |
| | | if (viewer.clock.shouldAnimate) { |
| | | this.getCurrentPosition() |
| | |
| | | }); |
| | | }, |
| | | getCurrentPosition() { |
| | | let viewer = window['cesiumContainer'].viewer; |
| | | console.log(this.sztOrientation) |
| | | // 获取当前时间 |
| | | 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])); |
| | | console.log("当前时间:", Cesium.JulianDate.toDate(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) |
| | | // console.log(currentTime) |
| | | // 从 positionProperty 中获取当前位置 |
| | | const currentPosition = this.positionProperty.getValue(currentTime); |
| | | |
| | |
| | | |
| | | // 将经纬度从弧度转换为度 |
| | | 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) { |
| | |
| | | if (sztquaternion) { |
| | | const hpr = Cesium.HeadingPitchRoll.fromQuaternion(sztquaternion) |
| | | console.log(hpr) |
| | | this.heading = Cesium.Math.toDegrees(hpr.heading).toFixed(2) |
| | | this.heading = (Cesium.Math.toDegrees(hpr.heading).toFixed(2)-143.32384000000002 ) |
| | | // this.heading = 180 |
| | | this.pitch = Cesium.Math.toDegrees(hpr.pitch).toFixed(2) |
| | | this.roll = Cesium.Math.toDegrees(hpr.roll).toFixed(2) |
| | | console.log('当前位置 - heading ' + this.heading) |
| | | this.pitch = (Cesium.Math.toDegrees(hpr.pitch).toFixed(2) - 14.33) |
| | | // this.roll = Cesium.Math.toDegrees(hpr.roll).toFixed(2) |
| | | this.roll = 0 |
| | | // console.log('当前位置 - heading ' + this.heading) |
| | | console.log(`当前位置 - heading: ${this.heading}, pitch: ${this.pitch}, roll: ${this.roll}`); |
| | | } |
| | | |
| | |
| | | console.log("无法获取当前位置"); |
| | | } |
| | | }, |
| | | quaternionToHeadingPitchRoll(quaternion) { |
| | | const x = quaternion.x; |
| | | const y = quaternion.y; |
| | | const z = quaternion.z; |
| | | const w = quaternion.w; |
| | | |
| | | // 构建旋转矩阵元素 |
| | | const m11 = 1 - 2 * (y * y + z * z); |
| | | const m12 = 2 * (x * y - w * z); |
| | | const m13 = 2 * (x * z + w * y); |
| | | const m21 = 2 * (x * y + w * z); |
| | | const m22 = 1 - 2 * (x * x + z * z); |
| | | const m23 = 2 * (y * z - w * x); |
| | | const m31 = 2 * (x * z - w * y); |
| | | const m32 = 2 * (y * z + w * x); |
| | | const m33 = 1 - 2 * (x * x + y * y); |
| | | |
| | | const heading = Math.atan2(m21, m11); |
| | | const pitch = Math.asin(-m31); |
| | | const roll = Math.atan2(m32, m33); |
| | | |
| | | return new Cesium.HeadingPitchRoll(heading, pitch, roll); |
| | | }, |
| | | showGZ(){ |
| | | let viewer = window.viewer; |
| | | let viewer = window['cesiumContainer'].viewer; |
| | | this.camera = new Cesium.Camera(viewer.scene) |
| | | // 视锥体参数 |
| | | this.camera.frustum = new Cesium.PerspectiveFrustum({ |
| | | // fov: Cesium.Math.PI_OVER_THREE, |
| | | fov: Cesium.Math.toRadians(10), |
| | | fov: Cesium.Math.PI_OVER_THREE, |
| | | // aspectRatio: this.aspectRatio, |
| | | aspectRatio: 1920 / 1080, |
| | | }); |
| | |
| | | } |
| | | } |
| | | </script> |
| | | <style> |
| | | .eagleye{ |
| | | position: absolute; |
| | | right: 30px; |
| | | bottom: 50px; |
| | | } |
| | | </style> |