From 2800fa4f32f3900509cb4d6eefaf2bfaf54efdd7 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Mon, 21 Apr 2025 18:29:09 +0800
Subject: [PATCH] fix: 天气显示

---
 src/hooks/useMapAggregation/useMapAggregation.js |  247 +++++++++++++++++++-----------------------------
 1 files changed, 98 insertions(+), 149 deletions(-)

diff --git a/src/hooks/useMapAggregation/useMapAggregation.js b/src/hooks/useMapAggregation/useMapAggregation.js
index 41d33ee..739da34 100644
--- a/src/hooks/useMapAggregation/useMapAggregation.js
+++ b/src/hooks/useMapAggregation/useMapAggregation.js
@@ -1,60 +1,69 @@
 import * as Cesium from 'cesium'
 import aggregationImg from '@/assets/images/home/useUavHome/aggregation.png'
 import eventAggregationImg from '@/assets/images/home/useUavHome/eventAggregationImg.png'
-import uavImg from '@/assets/images/home/useUavHome/uavImg.png'
-import eventSingle from '@/assets/images/home/useEventOperate/eventSingle.png'
+import _ from 'lodash'
+import { getEventImage } from '@/utils/stateToImageMap/event'
+import { getDroneStatusImage } from '@/utils/stateToImageMap/drone'
 
-import DevicePopUpBox from '@/hooks/useMapAggregation/DevicePopUpBox.vue'
-import EventPopUpBox from '@/hooks/useMapAggregation/EventPopUpBox.vue'
-
-import { render } from 'vue'
 import { useStore } from 'vuex'
 import { getCenterPoint } from '@/utils/cesium/mapUtil'
 import cesiumOperation from '@/utils/cesium-tsa'
 import { getDeviceRegion, getDeviceRegionCount, getEventDetails, getMapEvents } from '@/api/home/aggregation'
 import { PolyGradientMaterial } from '@/utils/cesium/Material'
 import { start } from 'nprogress'
+
+// hook
+import { useMapHandlerClick } from '@/hooks/components/useMapHandlerClick'
+import { MAP_LEVEL } from '@/const/drc'
+
 /**
  * 机巢聚合功能
  */
 
-let arrColor = ["rgb(15,176,255)", "rgb(18,76,154)", "#40C4E4", "#42B2BE", "rgb(51,176,204)", "#8CB7E5", "rgb(0,244,188)", "#139FF0"]
+let arrColor = [
+  'rgb(15,176,255)',
+  'rgb(18,76,154)',
+  '#40C4E4',
+  '#42B2BE',
+  'rgb(51,176,204)',
+  '#8CB7E5',
+  'rgb(0,244,188)',
+  '#139FF0',
+]
 
 let index = 0
 function getColor () {
   return arrColor[++index % arrColor.length]
 }
 
-export const useMapAggregation = type => {
+export const useMapAggregation = (type, status) => {
   const { flyTo } = cesiumOperation()
 
-  const singleImg = type === 'device' ? uavImg : eventSingle
   const mergeImg = type === 'device' ? aggregationImg : eventAggregationImg
-  const MapPopUpBox = type === 'device' ? DevicePopUpBox : EventPopUpBox
   const styleTransform = type === 'device' ? 'translateY(-50%)' : 'translate(-50%,-110%)'
+  const eventType = type === 'device' ? ['deviceAggregation', 'device'] : 'event'
 
-  let scalingJudgment = [
-    { name: '县', splashedList: [], gJson: null, show: false, outline: {}, value: [0, 48651], height: 31753 },
-    { name: '市', splashedList: [], gJson: null, show: false, outline: {}, value: [48651, 314863], height: 257731 },
-    {
-      name: '省',
-      splashedList: [],
-      gJson: null,
-      show: false,
-      outline: {},
-      value: [314863, 3796280000],
-      height: 1987280,
-    },
-  ]
+  const {
+    handlerInit: mapHandlerInit,
+    removeAll: removeMapHandlerAll,
+    removeLabel: removeMapLabel
+  } = useMapHandlerClick({
+    popupType: `${type}-popup`,
+    eventType: eventType,
+    styleTransform,
+    getViewer () {
+      return viewer
+    }
+  })
+
+  let scalingJudgment = _.cloneDeep(MAP_LEVEL).map(i => ({...i,gJson: null,splashedList:[], show: false, outline: {}}))
+
   let viewer = null
   let active = null
-  let handler = null
-  let currentEntity = null
 
   const store = useStore()
   const userAreaCode = computed(() => store.state.user.userInfo.detail.areaCode)
   const selectedAreaCode = computed(() => store.state.user.selectedAreaCode)
-
 
   const eventTimeType = computed(() => store.state.home.eventTimeType)
   const eventTimeRang = computed(() => store.state.home.eventTimeRang)
@@ -72,7 +81,6 @@
 
   let saveParams = { area_code: '', date_enum: 'CURRENT_WEEK' }
 
-
   // 确定缩放比例
   const determineScaling = () => {
     // console.log('确定缩放比例');
@@ -81,11 +89,11 @@
     // 根据高度展示对应的 gJson
     for (let [index, item] of scalingJudgment.entries()) {
       if (!item.show) return
-      if (height > item.value[0] && height <= item.value[1]) {
+      if (height > item.heightRange[0] && height <= item.heightRange[1]) {
         if (active === item.name) return
         active = item.name
         removeEntities()
-        removeLabel()
+        removeMapLabel()
         renderOutline(item)
         if (!item.gJson && !item.splashedList?.length) return
         item.gJson ? aggregation(item) : splashed(item)
@@ -110,20 +118,22 @@
   // 获取设备聚合
   function getDeviceCount (areaCode) {
     return getDeviceRegionCount({ areaCode }).then(res => {
-      return (res?.data?.data || [])
+      return res?.data?.data || []
     })
   }
   // 获取设备散点
   function getDeviceList (areaCode) {
     return getDeviceRegion({ areaCode }).then(res => {
+
       return (res?.data?.data || []).map(i => ({ ...i, type }))
+
+
     })
   }
 
   // 事件散点
   let eventList = []
   function processChildren (childrens) {
-    // console.log(childrens, '事件点')
     return (childrens || []).map(item => {
       const arr = processChildren(item.childrens)
       if (item.data) {
@@ -137,14 +147,12 @@
       if (arr.length !== 0) {
         returnObj.childrens = arr
       }
-      console.log(returnObj, '111111')
       return returnObj
     })
   }
 
   // 获取事件聚合
   function getMapEventCount (params) {
-    console.log(5555555)
     return getMapEvents(params).then(res => {
       const resData = res?.data?.data
       if (resData?.data) {
@@ -165,9 +173,7 @@
   }
   const getOutLine = async (jsonPathPre, hierarchy) => {
     const parentGJson = await getFiler(`${defaultDir}${jsonPathPre}/index.json`)
-    let features = parentGJson.features.find(
-      item => item.properties.adcode === Number(hierarchy[hierarchy.length - 1])
-    )
+    let features = parentGJson.features.find(item => item.properties.adcode === Number(hierarchy[hierarchy.length - 1]))
     return { type: 'FeatureCollection', features: [features] }
   }
 
@@ -185,11 +191,18 @@
     eventList = []
     if (!areaCode) return
     saveParams.area_code = areaCode
-    console.log(type, '444')
     const list = type === 'device' ? await getDeviceCount(areaCode) : await getMapEventCount(saveParams)
-    const splashedList = type === 'device'
-      ? await getDeviceList(areaCode)
-      : eventList.map(i => ({ eventId: i.id, latitude: Number(i.latitude), longitude: Number(i.longitude), type: 'event' }))
+
+    const splashedList =
+      type === 'device'
+        ? await getDeviceList(areaCode)
+        : eventList.map(i => ({
+          eventId: i.id,
+          latitude: Number(i.latitude),
+          longitude: Number(i.longitude),
+          type: 'event',
+          status: i.status
+        }))
     const hierarchy = convertToHierarchy(areaCode.slice(0, 6))
     const jsonPath = hierarchy.join('/')
     const jsonPathPre = hierarchy.slice(0, hierarchy.length - 1).join('/')
@@ -228,50 +241,58 @@
     const outlineGJson = await getOutLine(jsonPathPre, hierarchy)
     scalingJudgment.forEach(item => item.show && (item.outline = outlineGJson))
     const [longitude, latitude] = outlineGJson.features[0].properties.centroid
-    const height = scalingJudgment[(hierarchy.length - 3) * (-1)].height
+    const height = scalingJudgment[(hierarchy.length - 3) * -1].height
     setCenterPosition({ longitude, latitude, height })
     flyTo({ longitude, latitude }, 0, height)
   }
 
   const userAreaPosition = computed(() => store.state.home.userAreaPosition)
 
-  const setCenterPosition = (position) => {
+  const setCenterPosition = position => {
     store.commit('setCurrentAreaPosition', position)
     if (!userAreaPosition.value.longitude) {
       store.commit('setUserAreaPosition', position)
     }
   }
 
-  watch(combinedValues, async (newValue, oldValue) => {
-    if (newValue.singleUavHome?.device_sn) {
-      clearMapEntity()
-      return
-    }
+  watch(
+    combinedValues,
+    async (newValue, oldValue) => {
+      if (newValue.singleUavHome?.device_sn) {
+        clearMapEntity()
+        return
+      }
 
-    handlerInit()
+      if (newValue.eventTimeType) {
+        saveParams = { area_code: newValue.selectedAreaCode, date_enum: store.state.home.eventTimeParams }
+      }
 
-    if (newValue.eventTimeType) {
-      saveParams = { area_code: newValue.selectedAreaCode, date_enum: store.state.home.eventTimeParams }
-    }
+      if (newValue.eventTimeRang) {
+        saveParams = {
+          area_code: newValue.selectedAreaCode,
+          start_date: newValue.eventTimeRang[0],
+          end_date: newValue.eventTimeRang[1],
+        }
+      }
 
-    if (newValue.eventTimeRang) {
-      saveParams = { area_code: newValue.selectedAreaCode, start_date: newValue.eventTimeRang[0], end_date: newValue.eventTimeRang[1] }
-    }
+      needFly = true
+      if (!viewer) return
+      mapHandlerInit()
 
-    needFly = true
-    if (!viewer) return
-    viewer.scene.postRender.removeEventListener(determineScaling)
+      viewer.scene.postRender.removeEventListener(determineScaling)
 
-    initMapData(newValue.selectedAreaCode).then(() => {
-      viewer.scene.postRender.addEventListener(determineScaling)
-    })
-  },
+      initMapData(newValue.selectedAreaCode).then(() => {
+        viewer.scene.postRender.addEventListener(determineScaling)
+      })
+    },
     { deep: true }
   )
 
   //散点机巢
   function splashed (row) {
     row.splashedList.forEach((item, index) => {
+      const image = type === 'device' ? getDroneStatusImage(item.status) : getEventImage(item.status)
+
       viewer.entities.add({
         id: `aggregation-splashed-${index}`,
         position: Cesium.Cartesian3.fromDegrees(item.longitude, item.latitude),
@@ -286,7 +307,8 @@
           pixelOffset: new Cesium.Cartesian2(0, -9),
         },
         billboard: {
-          image: new Cesium.ConstantProperty(singleImg),
+          // singleImg
+          image: new Cesium.ConstantProperty(image),
           width: 24,
           height: 24,
         },
@@ -315,7 +337,7 @@
             let material = new PolyGradientMaterial({
               color: Cesium.Color.fromCssColorString(arrColor[randomInt]),
               opacity: 0.7,
-              alphaPower: 1.3
+              alphaPower: 1.3,
             })
 
             entity.polygon.extrudedHeight = (entity.properties.childrenNum._value || 1) * 500
@@ -337,14 +359,14 @@
               }),
             },
 
-            polygon
+            polygon,
           })
         })
       })
   }
 
   // 聚合机巢
-  const aggregation = (item) => {
+  const aggregation = item => {
     if (!item.gJson) return
     const featuresList = item.gJson.features.map(item1 => {
       // const {lng,lat} = getCenterPoint(item1.geometry.coordinates[0][0])
@@ -409,7 +431,7 @@
         let material = new PolyGradientMaterial({
           color: Cesium.Color.fromCssColorString(getColor()),
           opacity: 0.7,
-          alphaPower: 1.3
+          alphaPower: 1.3,
         })
 
         const randomInt = Math.floor(Math.random() * 8) + 1
@@ -420,41 +442,15 @@
         entity.polygon.outline = false // 显示边框
       })
 
-      needFly && viewer.flyTo(dataSource, {
-        offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-60), 0),
-        duration: 0.5,
-      })
+      needFly &&
+        viewer.flyTo(dataSource, {
+          offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-60), 0),
+          duration: 0.5,
+        })
       needFly = false
     })
   }
 
-  // 获取弹框box
-  const getLabelDom = data => {
-    const vNode = h(MapPopUpBox, { 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'
-    }
-  }
 
   /**
    * 根据条件获取项
@@ -464,40 +460,6 @@
    */
   const findTypeItem = (arr, condition) => {
     return arr.find(item => condition(item))
-  }
-
-  // 左键单机事件
-  const singleMachineEvent = async click => {
-    let clickTargets = viewer.scene.drillPick(click.position).map(item => item.id)
-    if (!clickTargets.length) return
-
-    console.log(clickTargets, 11111)
-
-    let deviceAggregationFind = findTypeItem(clickTargets, (item) => item?.properties?.customData?._value?.data?.type === 'deviceAggregation')
-    let deviceFind = findTypeItem(clickTargets, (item) => item?.properties?.customData?._value?.data?.type === 'device')
-    // "event"
-    let eventFind = findTypeItem(clickTargets, (item) => item?.properties?.customData?._value?.data?.type === 'event')
-    // let eventFind = findTypeItem(clickTargets, (item) => item?.properties?.customData?._value?.data?.type === 'eventAggregation')
-    currentEntity = deviceAggregationFind || deviceFind || eventFind
-
-    if (!currentEntity) return
-    if (!currentEntity?.position?._value) return
-    // 一定要移除
-    removeLabel()
-    if (deviceAggregationFind || eventFind) {
-      viewer.scene.postRender.addEventListener(labelBoxRender)
-    }
-    if (deviceFind) {
-      const device = deviceFind.properties.customData._value.data
-      store.commit('setSingleUavHome', device)
-    }
-  }
-
-  const removeDom = () => {
-    const dom = document.querySelector('#mapPopUpBox')
-    if (dom && dom.parentNode) {
-      dom.parentNode.removeChild(dom)
-    }
   }
 
   // 移除 点 和 gjson 实体
@@ -513,11 +475,7 @@
       item.includes('aggregation-') && viewer.entities.removeById(item)
     })
   }
-  // 移除弹框标签
-  const removeLabel = () => {
-    viewer?.scene.postRender.removeEventListener(labelBoxRender)
-    removeDom()
-  }
+
 
   // 移除所有监听事件,变量置空
   const removeAll = () => {
@@ -528,14 +486,12 @@
   const clearMapEntity = () => {
     if (!viewer) return
     removeEntities()
-    removeLabel()
+    removeMapHandlerAll()
+
     // viewer.camera.moveEnd.removeEventListener(determineScaling);
     viewer.scene.postRender.removeEventListener(determineScaling)
-    handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
-    handler?.destroy()
+
     active = null
-    handler = null
-    currentEntity = null
   }
 
   const init = () => {
@@ -545,14 +501,7 @@
       viewer.scene.postRender.addEventListener(determineScaling)
     })
 
-    handlerInit()
-  }
-
-  const handlerInit = () => {
-    if (handler) return
-
-    handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
-    handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK)
+    mapHandlerInit()
   }
 
   onBeforeUnmount(() => { })

--
Gitblit v1.9.3