forked from drone/command-center-dashboard

chenyao
2025-04-21 a7729ab954c949489fd6888fdecdd361d617c39e
src/components/CurrentTaskDetails/RealTimeMap.vue
@@ -6,9 +6,9 @@
import AmapMercatorTilingScheme from '@/utils/cesium/AmapMercatorTilingScheme'
import { Cartesian3, Terrain, Viewer } from 'cesium'
import { addBlueFilter } from '@/utils/cesium/common'
import CreateFrustum from '@/utils/cesium/frustum/CreateFrustum'
import aircraftGltf from '@/assets/gltf/aircraft.gltf'
import { useTaskWayline } from '@/hooks/useTaskWayline/useTaskWayline'
const { init: initTaskWayline } = useTaskWayline()
const imageryProvider_ammapSL = new Cesium.UrlTemplateImageryProvider({
   url: 'https://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
@@ -25,7 +25,7 @@
const taskDetailsViewer = inject('taskDetailsViewer')
const taskDetails = inject('taskDetails')
const deviceOsdInfo = inject('deviceOsdInfo')
const wsInfo = inject('wsInfo')
const initMap = () => {
   taskDetailsViewer.value = new Viewer('currentTaskMap', {
@@ -55,60 +55,9 @@
   taskDetailsViewer?.value.camera.setView({
      destination: Cartesian3.fromDegrees(115.763819, 28.787374, 5000),
   })
   initTaskWayline(taskDetailsViewer.value, wsInfo, taskDetails)
}
let viewInfoFrustum
// 设置视椎
const setCreateFrustum = () => {
   const host = deviceOsdInfo.value?.data?.host
   if (!host) return
   viewInfoFrustum?.clear()
   if ([14, 0].includes(host.mode_code)) return
   const attitude_head = 180 + host.attitude_head
   const gimbal_pitch = 90 - Number(host?.payloads[0]?.gimbal_pitch) || 0
   viewInfoFrustum = new CreateFrustum(taskDetailsViewer?.value, {
      position: {
         longitude: host.longitude,
         latitude: host.latitude,
         altitude: host.height,
      },
      width: 30,
      height: 30,
      fov: 20.0,
      near: 3.0,
      far: 250.0,
      roll: gimbal_pitch,
      pitch: 0,
      heading: attitude_head,
   })
}
function setAircraftGltf() {
   const host = deviceOsdInfo.value?.data?.host
   const aircraftEntity = taskDetailsViewer.value.entities.getById('aircraftGltf')
   const position = Cesium.Cartesian3.fromDegrees(host.longitude, host.latitude, host.height)
   if (aircraftEntity) {
      aircraftEntity.position = new Cesium.ConstantPositionProperty(position)
      return
   }
   taskDetailsViewer.value.entities.add({
      id: 'aircraftGltf',
      position,
      model: {
         uri: aircraftGltf, // 或 .glb
         scale: 1.0, // 缩放比例
         minimumPixelSize: 64, // 最小像素尺寸(保证模型远处可见)
         maximumScale: 128, // 最大缩放(可选)
      },
   })
}
watch(deviceOsdInfo, () => {
   setCreateFrustum()
   setAircraftGltf()
})
useTaskWayline(taskDetailsViewer, taskDetails)
const removeMap = () => {
   taskDetailsViewer?.value.entities.removeAll()