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