多mb轨迹回放载荷显隐

This commit is contained in:
严争鸣 2025-04-27 17:11:06 +08:00
parent d7c196d88d
commit 20f73b3364
9 changed files with 240 additions and 73 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

View File

@ -2,24 +2,13 @@ export default class Radar {
// 创建雷达罩 // 创建雷达罩
constructor(options) { constructor(options) {
this.radius = options.radius this.radius = options.radius
// this.viewer = options.viewer this.maximumCone = options.maximumCone || 0
// this.id = options.id this.minimumCone = options.minimumCone || 90
// this.entity = null this.maximumClock = options.maximumClock || 0
// this.radius = options.radius this.minimumClock = options.minimumClock || 360
// ;(this.longitude = options.position[0]), this.entity = null
// (this.latitude = options.position[1]),
// (this.position = Cesium.Cartesian3.fromDegrees( this.bindEntity = options.bindEntity
// options.position[0],
// options.position[1]
// ))
// this.heading = 0
// this.positionArr = this.calcPoints(
// options.position[0],
// options.position[1],
// options.radius,
// 0
// ) //储存脏数据
// this.addEntities()
} }
cartesian32LonLat(cartesian3) { cartesian32LonLat(cartesian3) {
const cartographic = const cartographic =
@ -31,50 +20,20 @@ export default class Radar {
return [lon, lat] return [lon, lat]
} }
getRadar() { getRadar() {
// this.entity = this.viewer.entities.add({
// id: this.id,
// position: this.position,
// wall: {
// positions: new Cesium.CallbackProperty(() => {
// return Cesium.Cartesian3.fromDegreesArrayHeights(this.positionArr)
// }, false),
// material: Cesium.Color.fromCssColorString('#00dcff82'),
// distanceDisplayCondition: new Cesium.DistanceDisplayCondition(
// 0.0,
// 10.5e6
// ),
// },
// ellipsoid: {
// radii: new Cesium.Cartesian3(
// this.radius,
// this.radius,
// this.radius
// ),
// maximumCone: Cesium.Math.toRadians(90),
// material: Cesium.Color.fromCssColorString('#00dcff82'),
// outline: true,
// outlineColor: Cesium.Color.fromCssColorString('#00dcff'),
// outlineWidth: 1,
// distanceDisplayCondition: new Cesium.DistanceDisplayCondition(
// 0.0,
// 10.5e8
// ),
// },
// })
return { return {
// wall: { position: new Cesium.CallbackProperty(() => {
// positions: new Cesium.CallbackProperty(() => { const position =
// return Cesium.Cartesian3.fromDegreesArrayHeights(this.positionArr) this.bindEntity.position._value ||
// }, false), this.bindEntity.position.getValue(viewer.clock.currentTime)
// material: Cesium.Color.fromCssColorString('#00dcff82'), return position
// distanceDisplayCondition: new Cesium.DistanceDisplayCondition( }),
// 0.0,
// 10.5e6
// ),
// },
ellipsoid: { ellipsoid: {
innerRadii: new Cesium.Cartesian3(1.0, 1.0, 1.0),
radii: new Cesium.Cartesian3(this.radius, this.radius, this.radius), radii: new Cesium.Cartesian3(this.radius, this.radius, this.radius),
maximumCone: Cesium.Math.toRadians(90), maximumCone: Cesium.Math.toRadians(this.maximumCone),
minimumCone: Cesium.Math.toRadians(this.minimumCone),
maximumClock: Cesium.Math.toRadians(this.maximumClock),
minimumClock: Cesium.Math.toRadians(this.minimumClock),
material: Cesium.Color.fromCssColorString('#00dcff82'), material: Cesium.Color.fromCssColorString('#00dcff82'),
outline: true, outline: true,
outlineColor: Cesium.Color.fromCssColorString('#00dcff'), outlineColor: Cesium.Color.fromCssColorString('#00dcff'),
@ -83,10 +42,20 @@ export default class Radar {
0.0, 0.0,
10.5e8 10.5e8
), ),
slicePartitions: 24,
stackPartitions: 36,
}, },
orientation: this.bindEntity.orientation,
} }
// this.addPostRender() // this.addPostRender()
} }
create() {
this.entity = viewer.entities.add(this.getRadar())
return this.entity
}
addPostRender() { addPostRender() {
this.viewer.clock.onTick.addEventListener(() => { this.viewer.clock.onTick.addEventListener(() => {
this.heading += 1.0 //可调节转动速度 this.heading += 1.0 //可调节转动速度

View File

@ -25,7 +25,7 @@ const {
changeTime, changeTime,
} = useMultiTraj() } = useMultiTraj()
const timeRange = ref<string[]>([1183135200000 + 40 * 1000, 1183135360000]) const timeRange = ref<string[]>([1730620780000, 1730623260000])
const rangeShortcuts = { const rangeShortcuts = {
近一天: () => { 近一天: () => {

View File

@ -0,0 +1,80 @@
import Radar from '@/js/Radar'
export function useDetectionLoad() {
return {
addSectorDetectionLoad,
addConicDetectionLoad,
}
}
function addSectorDetectionLoad({
radius,
maximumCone,
minimumCone,
maximumClock,
minimumClock,
bindEntity,
}) {
const radar = new Radar({
radius,
maximumCone,
minimumCone,
maximumClock,
minimumClock,
bindEntity,
})
const sector = radar.create()
return sector
}
function addConicDetectionLoad({
radius,
angle,
bindEntity,
heading,
pitch,
show = true,
}) {
const conicSensor = new CesiumSensorVolumes.ConicSensorGraphics({
show: true,
radius: radius * 1000,
innerHalfAngle: 0,
outerHalfAngle: Cesium.Math.toRadians(angle / 2),
minimumClockAngle: 0,
maximumClockAngle: 2 * Math.PI,
showIntersection: true,
intersectionColor: new Cesium.Color(1, 1, 1, 1),
intersectionWidth: 3,
lateralSurfaceMaterial: new Cesium.Color(0.0, 1.0, 1.0, 0.3),
})
const conic = viewer.entities.add({
position: new Cesium.CallbackProperty(() => {
const position =
bindEntity.position._value ||
bindEntity.position.getValue(viewer.clock.currentTime)
return position
}),
orientation: new Cesium.CallbackProperty(() => {
const position =
bindEntity.position._value ||
bindEntity.position.getValue(viewer.clock.currentTime)
return (
position &&
Cesium.Transforms.headingPitchRollQuaternion(
position,
new Cesium.HeadingPitchRoll(
// Cesium.Math.toRadians(heading),
Cesium.Math.toRadians(heading),
Cesium.Math.toRadians(pitch),
0
// Cesium.Math.toRadians(pitch)
) // 初始朝向
)
)
}),
conicSensor: conicSensor,
})
return conic
}

View File

@ -1,15 +1,19 @@
import { ref } from 'vue' import { ref } from 'vue'
import { useSatellite } from '../../Satellite/hooks/satellite' import { useSatellite } from '../../Satellite/hooks/satellite'
export function useMultiSatTraj() { export function useMultiSatTraj() {
return { addSatelliteTraj, removeAllMultiSatelliteTraj } return {
addSatelliteTraj,
removeAllMultiSatelliteTraj,
satellitePayloadStatusMap,
changeSatellitePayloadStatus,
}
} }
const multiSatTrajMap = new Map() const multiSatTrajMap = new Map()
const satellitePayloadStatusMap = ref(new Map())
const { addSatellite } = useSatellite() const { addSatellite } = useSatellite()
function addSatelliteTraj(satelliteList = [], timeRange) { function addSatelliteTraj(satelliteList = [], timeRange) {
console.log(satelliteList)
satelliteList.forEach(({ id, tle }) => { satelliteList.forEach(({ id, tle }) => {
if (!multiSatTrajMap.has(id)) { if (!multiSatTrajMap.has(id)) {
const satellite = addSatellite( const satellite = addSatellite(
@ -18,11 +22,18 @@ function addSatelliteTraj(satelliteList = [], timeRange) {
startTime: new Date(timeRange[0]).toISOString() || new Date(), startTime: new Date(timeRange[0]).toISOString() || new Date(),
} }
) )
satellite.sensor = true
multiSatTrajMap.set(id, satellite) multiSatTrajMap.set(id, satellite)
satellitePayloadStatusMap.value.set(id, satellite.sensor)
} }
}) })
} }
function changeSatellitePayloadStatus(id, status) {
multiSatTrajMap.has(id) && (multiSatTrajMap.get(id).sensor = status)
}
function removeAllMultiSatelliteTraj() { function removeAllMultiSatelliteTraj() {
for (let [key, satellite] of multiSatTrajMap.entries()) { for (let [key, satellite] of multiSatTrajMap.entries()) {
satellite.destroy() satellite.destroy()

View File

@ -73,6 +73,8 @@ export function useMultiTraj() {
loadMultiHisTraj, loadMultiHisTraj,
showMultiHisTrajDrawer, showMultiHisTrajDrawer,
showOrHideMultiHisTrajDrawer, showOrHideMultiHisTrajDrawer,
allMultiPayloadStatusMap,
changeRadarStatus,
} }
} }
@ -91,6 +93,7 @@ function showOrHideMultiHisTrajDrawer() {
} }
const showMultiHisTrajCom = ref(false) const showMultiHisTrajCom = ref(false)
// 显示或隐藏多目标历史轨迹组件 // 显示或隐藏多目标历史轨迹组件
function showOrHideMultiHisTraj() { function showOrHideMultiHisTraj() {
showMultiHisTrajCom.value = !showMultiHisTrajCom.value showMultiHisTrajCom.value = !showMultiHisTrajCom.value
@ -138,8 +141,18 @@ function loadMultiHisTraj(timeRange) {
setTimeRange(timeRange) setTimeRange(timeRange)
} }
const { addMultiZBTraj, removeAllMultiZBTraj } = useMultiZBTraj() const {
const { addSatelliteTraj, removeAllMultiSatelliteTraj } = useMultiSatTraj() addMultiZBTraj,
removeAllMultiZBTraj,
ZBPayloadStatusMap,
changeZBPayloadStatus,
} = useMultiZBTraj()
const {
addSatelliteTraj,
removeAllMultiSatelliteTraj,
satellitePayloadStatusMap,
changeSatellitePayloadStatus,
} = useMultiSatTraj()
const { addHJTraj, removeAllMultiHJTraj } = useMultiHJTraj() const { addHJTraj, removeAllMultiHJTraj } = useMultiHJTraj()
const { addMultiDDTraj, removeAllMultiDDTraj } = useMultiDDTraj() const { addMultiDDTraj, removeAllMultiDDTraj } = useMultiDDTraj()
@ -149,6 +162,31 @@ const typeFunc = {
satellite: { add: addSatelliteTraj, remove: removeAllMultiSatelliteTraj }, satellite: { add: addSatelliteTraj, remove: removeAllMultiSatelliteTraj },
hj: { add: addHJTraj, remove: removeAllMultiHJTraj }, hj: { add: addHJTraj, remove: removeAllMultiHJTraj },
} }
const allMultiPayloadStatusMap = ref({
zb: ZBPayloadStatusMap,
satellite: satellitePayloadStatusMap,
})
const allMultiPayloadChangeFun = {
zb: changeZBPayloadStatus,
satellite: changeSatellitePayloadStatus,
}
function changeRadarStatus({ id, type }) {
console.log(id, type)
const statusMap = allMultiPayloadStatusMap.value[type]
if (statusMap) {
console.log(statusMap)
if (statusMap.has(id)) {
const status = !statusMap.get(id)
statusMap.set(id, status)
typeof allMultiPayloadChangeFun[type] === 'function' &&
allMultiPayloadChangeFun[type](id, status)
}
}
}
// 添加轨迹实体 // 添加轨迹实体
function addAllEntity(data) { function addAllEntity(data) {
Object.keys(typeFunc).forEach(key => { Object.keys(typeFunc).forEach(key => {

View File

@ -87,7 +87,7 @@ async function getSatelliteHisTraj({ ids, timeRange }) {
setTimeout(() => { setTimeout(() => {
resolve([ resolve([
{ {
id: 'ONEWEB-0012', id: '11',
name: 'ONEWEB-0012', name: 'ONEWEB-0012',
tle: `ONEWEB-0012 tle: `ONEWEB-0012
1 44057U 19010A 24310.58073783 .00000090 00000+0 20246-3 0 9997 1 44057U 19010A 24310.58073783 .00000090 00000+0 20246-3 0 9997

View File

@ -1,10 +1,13 @@
import { useEntity } from '@/hooks/entity' import { useEntity } from '@/hooks/entity'
import { getDirection } from '@/utils/pos' import { getDirection } from '@/utils/pos'
import { useDetectionLoad } from './useDetectionLoad'
export function useMultiZBTraj() { export function useMultiZBTraj() {
return { return {
multiZBTrajMap, multiZBTrajMap,
addMultiZBTraj, addMultiZBTraj,
removeAllMultiZBTraj, removeAllMultiZBTraj,
ZBPayloadStatusMap,
changeZBPayloadStatus,
} }
} }
@ -23,7 +26,7 @@ function addMultiZBTraj(zbList) {
id, id,
targetType, targetType,
country, country,
extendInfo, extendInfo: null,
}) })
const startTime = trajList[0].target_time const startTime = trajList[0].target_time
@ -46,7 +49,6 @@ function addMultiZBTraj(zbList) {
return Cesium.Math.toRadians(angleDegrees) return Cesium.Math.toRadians(angleDegrees)
} }
}, false) }, false)
Object.assign(ZBOpt, { Object.assign(ZBOpt, {
...getPositions(trajList, targetType), ...getPositions(trajList, targetType),
...getPath(startTime, endTime), ...getPath(startTime, endTime),
@ -56,11 +58,48 @@ function addMultiZBTraj(zbList) {
console.log('ZBOpt', ZBOpt) console.log('ZBOpt', ZBOpt)
const ZBEntity = viewer.entities.add(ZBOpt) const ZBEntity = viewer.entities.add(ZBOpt)
// ZBEntity.billboard.show = false
// ZBEntity.model.show = true
addPayload(id, extendInfo, ZBEntity)
multiZBTrajMap.set(id, ZBEntity) multiZBTrajMap.set(id, ZBEntity)
} }
}) })
} }
const { addSectorDetectionLoad, addConicDetectionLoad } = useDetectionLoad()
const payloadMap = new Map()
const ZBPayloadStatusMap = ref(new Map())
function addPayload(id, extendInfo, ZBEntity) {
extendInfo?.radarPayload &&
extendInfo.radarPayload.forEach(item => {
const radar = addSectorDetectionLoad({
id: `${item.id}`,
bindEntity: ZBEntity,
...item,
})
payloadMap.set(id, [...(payloadMap.get(id) || []), radar])
})
extendInfo?.airplaneConicPayload &&
extendInfo.airplaneConicPayload.forEach(item => {
const conic = addConicDetectionLoad({
id: `${item.id}`,
bindEntity: ZBEntity,
...item,
})
payloadMap.set(id, [...(payloadMap.get(id) || []), conic])
})
// console.log(payloadMap, 'payloadMap')
ZBPayloadStatusMap.value.set(id, true)
}
function changeZBPayloadStatus(id, status) {
payloadMap.get(id)?.forEach(item => {
item.show = status
})
}
function getPositions(trajList, targetType) { function getPositions(trajList, targetType) {
const positionProperty = new Cesium.SampledPositionProperty() const positionProperty = new Cesium.SampledPositionProperty()
@ -120,4 +159,11 @@ function removeAllMultiZBTraj() {
viewer.entities.remove(entity) viewer.entities.remove(entity)
multiZBTrajMap.delete(key) multiZBTrajMap.delete(key)
} }
for (let [key, entity] of payloadMap.entries()) {
entity.forEach(item => {
viewer.entities.remove(item)
})
payloadMap.delete(key)
}
} }

View File

@ -5,7 +5,8 @@ import Tree from '@/components/Tree/index.vue'
import TabsCom from '@/components/Tabs/index.vue' import TabsCom from '@/components/Tabs/index.vue'
import Bg from '@/assets/image/multiTraj/编组.png' import Bg from '@/assets/image/multiTraj/编组.png'
import RadarSwitch from '@/assets/image/multiTraj/开.png' import RadarOpen from '@/assets/image/multiTraj/开.png'
import RadarClose from '@/assets/image/multiTraj/关备份.png'
import { useMultiTrajReq } from './hooks/useMultiTrajReq' import { useMultiTrajReq } from './hooks/useMultiTrajReq'
import { useMultiTraj } from './hooks/useMultiTraj' import { useMultiTraj } from './hooks/useMultiTraj'
@ -13,6 +14,7 @@ export default defineComponent({
name: 'MultiTrajPlayback', name: 'MultiTrajPlayback',
setup() { setup() {
const { allTreeData, getAllTree } = useMultiTrajReq() const { allTreeData, getAllTree } = useMultiTrajReq()
onMounted(() => { onMounted(() => {
getAllTree() getAllTree()
}) })
@ -23,17 +25,30 @@ export default defineComponent({
dd: 'dd', dd: 'dd',
hj: 'hj', hj: 'hj',
} }
function renderSuffix({ option }) { function renderSuffix({ option }) {
const idField = this.type === 'satellite' ? 'id' : 'dataId'
return option.extendInfo || option.data?.extendInfo ? ( return option.extendInfo || option.data?.extendInfo ? (
<div class="pr-2"> <div class="pr-2">
<NIcon <NIcon
size={14} size={14}
class="cursor-pointer text-gray-500 hover:text-blue-600" class="cursor-pointer text-gray-500 hover:text-blue-600"
onClick={() => { onClick={e => {
e.stopPropagation() e.stopPropagation()
changeRadarStatus({ type: this.type, id: option[idField] })
}} }}
> >
<img src={RadarSwitch} class="h-full w-full" /> {allMultiPayloadStatusMap.value &&
allMultiPayloadStatusMap.value[this.type]?.get(option[idField]) ? (
<img src={RadarOpen} class="h-full w-full" />
) : (
<img
src={RadarClose}
style={`filter: contrast(0.2);`}
class="h-full w-full"
/>
)}
</NIcon> </NIcon>
</div> </div>
) : undefined ) : undefined
@ -41,8 +56,11 @@ export default defineComponent({
const { const {
checkedAllKeys, checkedAllKeys,
showMultiHisTrajCom,
showOrHideMultiHisTraj, showOrHideMultiHisTraj,
showOrHideMultiHisTrajDrawer, showOrHideMultiHisTrajDrawer,
allMultiPayloadStatusMap,
changeRadarStatus,
} = useMultiTraj() } = useMultiTraj()
const multiTrajAllTreeTabConfig = computed(() => { const multiTrajAllTreeTabConfig = computed(() => {
@ -58,7 +76,9 @@ export default defineComponent({
label-field={key === 'satellite' ? 'name' : 'nodeName'} label-field={key === 'satellite' ? 'name' : 'nodeName'}
showSearch showSearch
renderSuffix={ renderSuffix={
['zb', 'satellite'].includes(key) ? renderSuffix : () => ({}) ['zb', 'satellite'].includes(key)
? renderSuffix.bind({ type: key })
: () => ({})
} }
v-model:checked={checkedAllKeys.value[key]} v-model:checked={checkedAllKeys.value[key]}
/> />
@ -95,7 +115,10 @@ export default defineComponent({
)} )}
</div> </div>
<NButton disabled={!canPlay.value} onClick={playMultiTraj}> <NButton
disabled={!canPlay.value || showMultiHisTrajCom}
onClick={playMultiTraj}
>
轨迹回放 轨迹回放
</NButton> </NButton>
</div> </div>