From 295eb3cc87aaa5176d64a4ef985cdad0bfefae9a Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Mon, 31 Mar 2025 08:35:00 +0800
Subject: [PATCH] 增加单个机巢页面

---
 src/views/Home/useAggregation.js |  125 +++++++++++++++++++++++++++++++++--------
 1 files changed, 100 insertions(+), 25 deletions(-)

diff --git a/src/views/Home/useAggregation.js b/src/views/Home/useAggregation.js
index 32756bd..b724256 100644
--- a/src/views/Home/useAggregation.js
+++ b/src/views/Home/useAggregation.js
@@ -4,39 +4,39 @@
 import jiangxishi from '@/assets/geojson/jiangxishi.json';
 import jiangxi from '@/assets/geojson/jiangxi.json';
 import zg from '@/assets/geojson/zg.json';
+import MapPopUpBox from '@/views/Home/MapPopUpBox.vue';
+import { render } from 'vue';
 
 /**
  * 机巢聚合功能
  */
 export const useAggregation = () => {
-  let viewer = null;
   const scalingJudgment = [
     { name: '县', value: [0, 48651], gJson: null },
     { name: '市', value: [48651, 314863], gJson: jiangxishi },
     { name: '省', value: [314863, 1169651], gJson: jiangxi },
     { name: '国', value: [1169651, 37962800], gJson: zg },
   ];
-  const active = ref('');
-  const init = () => {
+  let viewer = null;
+  let active = null;
+  let handler = null;
+  let positionC3 = null;
+  const listenerHeight = () => {
     determineScaling();
-    viewer.camera.moveEnd.addEventListener(() => {
-      determineScaling();
-    });
+    viewer.camera.moveEnd.addEventListener(determineScaling);
   };
 
-  const removeFun = () => {
-    viewer.dataSources.removeAll(true);
-    viewer.entities.removeAll();
-  };
-
+  // 确定缩放比例
   const determineScaling = () => {
+    if(!viewer) return
     let height = viewer.camera.positionCartographic.height;
     // 根据高度展示对应的 gJson
     for (let item of scalingJudgment) {
       if (height > item.value[0] && height <= item.value[1]) {
-        if (active.value !== item.name) {
-          removeFun();
-          active.value = item.name;
+        if (active !== item.name) {
+          removeEntities();
+          removeLabel();
+          active = item.name;
           item.gJson ? aggregation(item) : splashed();
         }
         break;
@@ -83,6 +83,7 @@
       if (!feature.position) return;
       const position = Cesium.Cartesian3.fromDegrees(feature.position[0], feature.position[1]);
       viewer.entities.add({
+        id: feature.id,
         position: position,
         label: {
           // 随机整数
@@ -99,6 +100,12 @@
           image: new Cesium.ConstantProperty(data2),
           width: 24,
           height: 24,
+        },
+        properties: {
+          id: feature.id,
+          customData: {
+            name: feature.name,
+          },
         },
       });
     });
@@ -118,16 +125,84 @@
     });
   };
 
-  onUnmounted(() => {
-    console.log('xiezai');
-    removeFun();
-  });
+  // 获取弹框box
+  const getLabelDom = () => {
+    const vNode = h(MapPopUpBox, { data: '参数', removeLabel });
+    const tooltipContainer = document.createElement('div');
+    tooltipContainer.id = 'mapPopUpBox';
+    tooltipContainer.style.position = 'absolute';
+    tooltipContainer.style.transform = 'translateY(-50%)';
+    tooltipContainer.style.pointerEvents = 'none';
+    document.querySelector('.page-index').append(tooltipContainer);
+    render(vNode, tooltipContainer);
+    return tooltipContainer;
+  };
 
-  onMounted(() => {
-    console.log('触发');
-    nextTick(() => {
-      viewer = window.$viewer;
-      init();
-    });
-  });
+  // 弹框位置刷新
+  const labelBox = () => {
+    let dom = document.querySelector('#mapPopUpBox');
+    if (!dom) {
+      dom = getLabelDom();
+    }
+    const screenPosition = viewer.scene.cartesianToCanvasCoordinates(positionC3);
+    if (screenPosition) {
+      dom.style.left = `${screenPosition.x}px`;
+      dom.style.top = `${screenPosition.y}px`;
+      dom.style.display = 'block';
+    }
+  };
+
+  // 左键单机事件
+  const singleMachineEvent = click => {
+    const pickedObject = viewer.scene.pick(click.position);
+    if (Cesium.defined(pickedObject) && pickedObject.id) {
+      const entity = pickedObject.id;
+      positionC3 = entity.position._value;
+      viewer.scene.postRender.removeEventListener(labelBox);
+      viewer.scene.postRender.addEventListener(labelBox);
+    }
+  };
+
+  // 移除 点 和 gjson 实体
+  const removeEntities = () => {
+    viewer.dataSources?.removeAll(true);
+    viewer.entities?.removeAll();
+  };
+  // 移除弹框标签
+  const removeLabel = () => {
+    viewer.scene.postRender.removeEventListener(labelBox);
+    const dom = document.querySelector('#mapPopUpBox');
+    if (dom && dom.parentNode) {
+      dom.parentNode.removeChild(dom);
+    }
+  };
+
+  // 移除所有监听事件,变量置空
+  const removeAll = () => {
+    removeEntities();
+    removeLabel();
+    viewer.camera.moveEnd.removeEventListener(determineScaling);
+    handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
+    handler?.destroy();
+    viewer = null;
+    active = null
+    handler = null;
+    positionC3 = null;
+  };
+  const init = () => {
+    viewer = window.$viewer;
+    handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
+    handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+    listenerHeight();
+  };
+  // onMounted(() => {
+  //   nextTick(() => {
+  //     viewer = window.$viewer;
+  //     handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
+  //     handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+  //     listenerHeight();
+  //   });
+  // });
+
+  return { init,removeAll };
 };

--
Gitblit v1.9.3