From 7abab3d5474858f58ddd96bebbdf0379ddd1aa77 Mon Sep 17 00:00:00 2001
From: husq <931347610@qq.com>
Date: Tue, 17 Oct 2023 15:17:00 +0800
Subject: [PATCH] 飞机起飞时实时位置更新

---
 src/hooks/use-cesium-tsa.ts         |   29 +++++++++++++-
 src/utils/jobTime.ts                |   37 +++++++-----------
 src/pages/page-web/projects/tsa.vue |   48 ++++++++++++++++-------
 src/types/device.ts                 |    3 +
 4 files changed, 78 insertions(+), 39 deletions(-)

diff --git a/src/hooks/use-cesium-tsa.ts b/src/hooks/use-cesium-tsa.ts
index d2153cc..bbf48af 100644
--- a/src/hooks/use-cesium-tsa.ts
+++ b/src/hooks/use-cesium-tsa.ts
@@ -27,6 +27,9 @@
   billboard?: billboardSetting
   label?: labelSetting
   id?: string
+  heading?: number
+  pitch?: number
+  roll?: number
 }
 // 定义全局的viewer变量防止重复生成
 // eslint-disable-next-line no-var
@@ -140,12 +143,15 @@
   // 添加标记点
   const addPoint = (pointOption: pointOption) => {
     if (!pointOption.longitude && !pointOption.latitude) return
+    const position = Cesium.Cartesian3.fromDegrees(pointOption.longitude, pointOption.latitude)
+    const orientation = Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRoll(pointOption.heading, pointOption.pitch, pointOption.roll))
     viewer?.entities.add({
       position: Cesium.Cartesian3.fromDegrees(pointOption.longitude, pointOption.latitude),
       billboard: pointOption.billboard,
       point: pointOption.point,
       label: pointOption.label,
       id: pointOption.id,
+      orientation
     })
   }
 
@@ -157,7 +163,24 @@
       viewer?.entities.remove(pointEntity)
     }
   }
-
+  // 通过点ID获取实体
+  function getEntityById (id:string) {
+    const pointEntity = viewer?.entities.getById(id)
+    return pointEntity
+  }
+  // 更新实体位置
+  function updateEntityPosition (longitude:number, latitude:number, id:string, params?:any) {
+    const entity = getEntityById(id) as Cesium.Entity
+    const position = Cesium.Cartesian3.fromDegrees(longitude, latitude)
+    const heading = Cesium.Math.toRadians(params.heading)
+    const pitch = Cesium.Math.toRadians(params.pitch)
+    const roll = Cesium.Math.toRadians(params.roll)
+    const orientation = Cesium.Transforms.headingPitchRollQuaternion(position, new Cesium.HeadingPitchRoll(heading, pitch, roll))
+    if (Cesium.defined(entity)) {
+      entity.position = position
+      entity.orientation = orientation
+    }
+  }
   // 飞行 flyto
   const flyTo = (pointOption: pointOption, time: number = 4) => {
     if (!pointOption.longitude && !pointOption.latitude) return
@@ -256,6 +279,8 @@
     zoonIn,
     zoonOut,
     roadPattern,
-    patternMap
+    patternMap,
+    getEntityById,
+    updateEntityPosition
   }
 }
diff --git a/src/pages/page-web/projects/tsa.vue b/src/pages/page-web/projects/tsa.vue
index c5cba3e..ec804aa 100644
--- a/src/pages/page-web/projects/tsa.vue
+++ b/src/pages/page-web/projects/tsa.vue
@@ -266,7 +266,6 @@
 <script lang="ts" setup>
 import { computed, onMounted, reactive, ref, watch, WritableComputedRef } from 'vue'
 import { EDeviceTypeName, ELocalStorageKey } from '/@/types'
-import noData from '/@/assets/icons/no-data.png'
 import rc from '/@/assets/icons/rc.png'
 import { OnlineDevice, EModeCode, OSDVisible, EDockModeCode, DeviceOsd, EDockModeText, EModeText } from '/@/types/device'
 import { useMyStore } from '/@/store'
@@ -280,6 +279,7 @@
 } from '@ant-design/icons-vue'
 import { EHmsLevel } from '/@/types/enums'
 import { cesiumOperation } from '/@/hooks/use-cesium-tsa'
+let droneEntity
 
 const { appContext } = getCurrentInstance()
 const global = appContext.config.globalProperties
@@ -326,28 +326,46 @@
 const cesium = cesiumOperation()
 // 添加机场标注
 watch(() => store.state.deviceState, data => {
-  if (snCode.value.includes(data.currentSn)) return
-  snCode.value.push(data.currentSn)
   // cesium.removeAllPoint()
   if (data.currentType === EDeviceTypeName.Aircraft && data.deviceInfo[data.currentSn]) {
-    // 无人机图标
-    const setting = {
-      longitude: data.deviceInfo[data.currentSn].longitude,
-      latitude: data.deviceInfo[data.currentSn].latitude,
-      billboard: {
-        image: getResource('drone.png'),
-        outlineWidth: 0,
-        width: 36,
-        height: 36,
-        scale: 1.0,
-      }
+    // cesium.removeById('drone_fly')
+    if (!droneEntity) {
+      droneEntity = cesium.getEntityById('drone_fly')
     }
-    cesium.addPoint(setting)
+    console.log(data.deviceInfo[data.currentSn], '====deviceInfo====')
+    if (droneEntity) {
+      const orientation = {
+        heading: data.deviceInfo[data.currentSn].attitude_head,
+        pitch: data.deviceInfo[data.currentSn].attitude_pitch,
+        roll: data.deviceInfo[data.currentSn].attitude_roll
+      }
+      cesium.updateEntityPosition(data.deviceInfo[data.currentSn].longitude, data.deviceInfo[data.currentSn].latitude, 'drone_fly', orientation)
+    } else {
+      // 无人机图标
+      const setting = {
+        longitude: data.deviceInfo[data.currentSn].longitude,
+        latitude: data.deviceInfo[data.currentSn].latitude,
+        id: 'drone_fly',
+        billboard: {
+          image: getResource('drone.png'),
+          outlineWidth: 0,
+          width: 36,
+          height: 36,
+          scale: 1.0,
+        },
+        heading: data.deviceInfo[data.currentSn].attitude_head,
+        pitch: data.deviceInfo[data.currentSn].attitude_pitch,
+        roll: data.deviceInfo[data.currentSn].attitude_roll
+      }
+      cesium.addPoint(setting)
+    }
     // if (osdVisible.value.visible && osdVisible.value.sn !== '') {
     //   deviceInfo.value.device = data.deviceInfo[osdVisible.value.sn]
     // }
   }
   if (data.currentType === EDeviceTypeName.Dock && data.dockInfo[data.currentSn]) {
+    if (snCode.value.includes(data.currentSn)) return
+    snCode.value.push(data.currentSn)
     // 机场图标位置
     const setting = {
       longitude: data.dockInfo[data.currentSn].basic_osd?.longitude,
diff --git a/src/types/device.ts b/src/types/device.ts
index 7edb980..5fb1f84 100644
--- a/src/types/device.ts
+++ b/src/types/device.ts
@@ -265,6 +265,9 @@
 }
 
 export interface DeviceOsd {
+  attitude_head?:number,
+  attitude_pitch?:number,
+  attitude_roll?:number,
   longitude: number,
   latitude: number,
   gear: number,
diff --git a/src/utils/jobTime.ts b/src/utils/jobTime.ts
index 4387d5d..fe52128 100644
--- a/src/utils/jobTime.ts
+++ b/src/utils/jobTime.ts
@@ -8,7 +8,6 @@
  * @param creatPlan
  */
 export function getFlyTimeList (creatPlan: CreatePlan) {
-
   const startDate = moment.unix(creatPlan.task_days[0]).toDate()
   const endDate = moment.unix(creatPlan.task_days[1]).toDate()
 
@@ -118,7 +117,7 @@
   } else if (creatPlan.task_type === TaskType.Continuous) {
     // 连续执行
     switch (creatPlan.rep_fre_type) {
-        // 月
+      // 月
       case FrequencyType.month: {
         // 先计算这几个月分别是哪个月
         const monthList = getYearMonth(startDate, endDate, creatPlan.rep_fre_val)
@@ -135,8 +134,7 @@
               }
 
               creatPlan.task_periods?.forEach(timearr => {
-
-                timearr.forEach(time=>{
+                timearr.forEach(time => {
                   const timeStr = moment.unix(time).format('HH:mm')
                   const str = date + '-' + day + ' ' + timeStr
                   const tempDate = new Date(str)
@@ -178,8 +176,7 @@
             const tmpDate = new Date(yearMonth)
             const date = getMonthWeek(tmpDate.getFullYear(), tmpDate.getMonth(), creatPlan.rep_rule_val[0], creatPlan.rep_rule_val[1])
             creatPlan.task_periods?.forEach(timearr => {
-
-              timearr.forEach(time=>{
+              timearr.forEach(time => {
                 const timeStr = moment.unix(time).format('HH:mm')
                 const dateStr = date + ' ' + timeStr
                 finalDateTimeArr.push(dateStr)
@@ -190,7 +187,7 @@
 
         break
       }
-        // 周
+      // 周
       case FrequencyType.week: {
         // 获取每n周的日期
         const weekDate = gainAllDateBetRange(startDate, endDate, creatPlan.rep_fre_val * 7)
@@ -201,29 +198,26 @@
         // 拼接时间
         dateList.forEach(date => {
           creatPlan.task_periods?.forEach(timearr => {
-
-            timearr.forEach(time=>{
+            timearr.forEach(time => {
               const timeStr = moment.unix(time).format('HH:mm')
               finalDateTimeArr.push(date + ' ' + timeStr)
             })
-
           })
         })
         break
       }
-        // 日
+      // 日
       case FrequencyType.day: {
         // 根据每几天获取时间
         const dateList = gainAllDateBetRange(startDate, endDate, creatPlan.rep_fre_val)
         // 拼接执行时间即可
         dateList.forEach(date => {
           creatPlan.task_periods?.forEach(timearr => {
-            timearr.forEach(time=>{
+            timearr.forEach(time => {
               const timeStr = moment.unix(time).format('HH:mm')
 
               finalDateTimeArr.push(date + ' ' + timeStr)
             })
-
           })
         })
         break
@@ -232,15 +226,14 @@
   }
 
   console.log('最终时间:', finalDateTimeArr)
-  var tempDateTimeArr = []
+  let tempDateTimeArr = []
   if (creatPlan.task_type === TaskType.Repeat) {
-    tempDateTimeArr =  finalDateTimeArr.map(dateTime=>[dateTime])
-  }else if (creatPlan.task_type === TaskType.Continuous){
-    for (let i = 0; i < finalDateTimeArr.length; i=i+2) {
-      tempDateTimeArr.push([finalDateTimeArr[i],finalDateTimeArr[i+1]])
+    tempDateTimeArr = finalDateTimeArr.map(dateTime => [dateTime])
+  } else if (creatPlan.task_type === TaskType.Continuous) {
+    for (let i = 0; i < finalDateTimeArr.length; i = i + 2) {
+      tempDateTimeArr.push([finalDateTimeArr[i], finalDateTimeArr[i + 1]])
     }
   }
-
 
   // 对tempDateTimeArr进行时间过滤,筛选掉过去时间和无效时间
   const futureDateTimeArr = tempDateTimeArr.filter(dateArr => {
@@ -250,11 +243,11 @@
   console.log('未来时间:', futureDateTimeArr)
 
   const futureDateTimeUnixArr = [] as any
-  futureDateTimeArr.forEach(dateArr=>{
+  futureDateTimeArr.forEach(dateArr => {
     const list = [] as any
 
-    dateArr.forEach(dateTimeStr=>{
-      const timestamp =  moment(dateTimeStr).unix()
+    dateArr.forEach(dateTimeStr => {
+      const timestamp = moment(dateTimeStr).unix()
       list.push(timestamp)
     })
     futureDateTimeUnixArr.push(list)

--
Gitblit v1.9.3