forked from drone/command-center-dashboard

罗广辉
2025-04-18 75cdd3cdcec1fc22bddebd6352e5e87e0a8d5d33
src/hooks/useSingleDroneMap/useSingleDroneMap.js
@@ -2,25 +2,18 @@
 * @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'
/**
 * 
@@ -31,20 +24,18 @@
  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) => {
@@ -52,7 +43,7 @@
    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({
@@ -93,7 +84,7 @@
    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)
@@ -109,7 +100,7 @@
          customData: {
            data: {
              ...item,
              eventId: item.id,
              eventId: id,
              type: 'single-drone-event'
            }
          }
@@ -155,104 +146,20 @@
    })
  }
  // 查找特定类型的实体
  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()
  })
  // 自动清理