| | |
| | | * @Author: shuishen 1109946754@qq.com |
| | | * @Date: 2025-04-15 22:41:40 |
| | | * @LastEditors: shuishen 1109946754@qq.com |
| | | * @LastEditTime: 2025-04-17 15:05:32 |
| | | * @LastEditTime: 2025-04-17 20:24:19 |
| | | * @FilePath: \command-center-dashboard\src\hooks\useSingleDroneMap\useSingleDroneMap.js |
| | | * @Description: |
| | | * |
| | | * Copyright (c) 2025 by shuishen, All Rights Reserved. |
| | | */ |
| | | import * as Cesium from 'cesium' |
| | | import { render } from 'vue' |
| | | import endingImg from '@/assets/images/aiNowFly/ending.png' |
| | | import endingHighImg from '@/assets/images/aiNowFly/ending-high.png' |
| | | import EventPopUpBox from '@/hooks/components/EventPopUpBox.vue' |
| | | |
| | | import eventSingle from '@/assets/images/home/useEventOperate/eventSingle.png' |
| | | import { getEventImage } from '@/utils/stateToImageMap/event' |
| | | import { getDroneFlagImage } from '@/utils/stateToImageMap/drone' |
| | | |
| | | import eventPending from '@/assets/images/home/useEventOperate/eventPending.png' // 待处理 0 |
| | | import eventWaitAudit from '@/assets/images/home/useEventOperate/eventWaitAudit.png' // 待审核 2 |
| | | import eventProcessing from '@/assets/images/home/useEventOperate/eventProcessing.png' // 处理中 3 |
| | | import eventCompleted from '@/assets/images/home/useEventOperate/eventCompleted.png' // 已完成 4 |
| | | import eventClosed from '@/assets/images/home/useEventOperate/eventClosed.png' // 已完结 5 |
| | | import { useMapHandlerClick } from '@/hooks/components/useMapHandlerClick' |
| | | |
| | | /** |
| | | * |
| | |
| | | eventApi: null, |
| | | eventApiParams: {} |
| | | }) { |
| | | const styleTransform = 'translate(-50%,-110%)' |
| | | |
| | | const { eventPositions, eventApi, eventApiParams } = options |
| | | const eventImage = { |
| | | 0: eventPending, |
| | | 2: eventWaitAudit, |
| | | 3: eventProcessing, |
| | | 4: eventCompleted, |
| | | 5: eventClosed |
| | | } |
| | | |
| | | let viewer = null |
| | | let handler = null |
| | | let currentEntity = null |
| | | |
| | | const { |
| | | handlerInit: mapHandlerInit, |
| | | removeAll: removeMapHandlerAll |
| | | } = useMapHandlerClick({ |
| | | getViewer () { |
| | | return viewer |
| | | } |
| | | }) |
| | | |
| | | // 初始化机场位置 |
| | | const initDroneEntity = (dronePosition) => { |
| | |
| | | |
| | | if (!lng || !lat) return |
| | | |
| | | const markerImg = status ? endingHighImg : endingImg |
| | | const markerImg = getDroneFlagImage(status) |
| | | const position = Cesium.Cartesian3.fromDegrees(+lng, +lat, 0) |
| | | |
| | | const droneEntity = viewer?.entities.add({ |
| | |
| | | eventData.length && eventData.forEach((item, index) => { |
| | | const { longitude, latitude, status, id } = item |
| | | |
| | | const curImg = eventImage[status] || eventSingle |
| | | const curImg = getEventImage(status) |
| | | |
| | | const position = Cesium.Cartesian3.fromDegrees(+longitude, +latitude, 0) |
| | | |
| | |
| | | customData: { |
| | | data: { |
| | | ...item, |
| | | eventId: item.id, |
| | | eventId: id, |
| | | type: 'single-drone-event' |
| | | } |
| | | } |
| | |
| | | }) |
| | | } |
| | | |
| | | // 查找特定类型的实体 |
| | | const findEntityByType = (entities, type) => { |
| | | return entities.find(entity => |
| | | entity?.properties?.customData?._value?.data?.type === type |
| | | ) |
| | | } |
| | | |
| | | // 左键单机事件 |
| | | const singleMachineEvent = async click => { |
| | | currentEntity = null |
| | | |
| | | let clickedEntities = viewer?.scene.drillPick(click.position).map(item => item.id) |
| | | |
| | | if (!clickedEntities?.length) return |
| | | |
| | | currentEntity = findEntityByType(clickedEntities, 'single-drone-event') |
| | | |
| | | removeLabel() |
| | | |
| | | if (currentEntity) { |
| | | viewer?.scene.postRender.addEventListener(labelBoxRender) |
| | | } |
| | | } |
| | | |
| | | // 事件初始化 |
| | | const handlerInit = () => { |
| | | if (handler) return |
| | | |
| | | handler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas) |
| | | handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK) |
| | | } |
| | | |
| | | // 事件移除 |
| | | const removeHandler = () => { |
| | | handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK) |
| | | handler?.destroy() |
| | | handler = null |
| | | } |
| | | |
| | | // 获取弹框box |
| | | const getLabelDom = data => { |
| | | const vNode = h(EventPopUpBox, { data, removeLabel }) |
| | | const tooltipContainer = document.createElement('div') |
| | | tooltipContainer.id = 'mapPopUpBox' |
| | | tooltipContainer.style.position = 'absolute' |
| | | tooltipContainer.style.transform = styleTransform |
| | | tooltipContainer.style.pointerEvents = 'none' |
| | | document.querySelector('.page-index').append(tooltipContainer) |
| | | render(vNode, tooltipContainer) |
| | | return tooltipContainer |
| | | } |
| | | |
| | | // 弹框位置刷新 |
| | | const labelBoxRender = () => { |
| | | if (!currentEntity) return |
| | | let dom = document.querySelector('#mapPopUpBox') |
| | | |
| | | if (!dom) { |
| | | dom = getLabelDom(currentEntity.properties.customData._value.data) |
| | | } |
| | | const screenPosition = viewer?.scene.cartesianToCanvasCoordinates(currentEntity?.position?._value) |
| | | if (screenPosition) { |
| | | dom.style.left = `${screenPosition.x}px` |
| | | dom.style.top = `${screenPosition.y}px` |
| | | dom.style.display = 'block' |
| | | } |
| | | } |
| | | |
| | | const removeDom = () => { |
| | | const dom = document.querySelector('#mapPopUpBox') |
| | | if (dom && dom.parentNode) { |
| | | dom.parentNode.removeChild(dom) |
| | | } |
| | | } |
| | | |
| | | // 移除弹框标签 |
| | | const removeLabel = () => { |
| | | viewer?.scene.postRender.removeEventListener(labelBoxRender) |
| | | removeDom() |
| | | } |
| | | |
| | | |
| | | const init = () => { |
| | | viewer = window.$viewer |
| | | |
| | | handlerInit() |
| | | mapHandlerInit() |
| | | } |
| | | |
| | | const removeAll = () => { |
| | | removeLayer() |
| | | removeHandler() |
| | | removeLabel() |
| | | removeMapHandlerAll() |
| | | } |
| | | |
| | | onMounted(() => { |
| | | nextTick(() => { |
| | | init() |
| | | }) |
| | | onMounted(async () => { |
| | | await nextTick() |
| | | init() |
| | | }) |
| | | |
| | | // 自动清理 |