From be0ca10c87e7de1556b5f3618ac403b0e9f41ed9 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Tue, 11 Nov 2025 16:37:07 +0800
Subject: [PATCH] feat:点击单个数据定位

---
 src/views/layerManagement/components/leftList.vue |    9 +++++++++
 src/views/layerManagement/index.vue               |   48 ++++++++++++++++++++++++++++++++++++------------
 2 files changed, 45 insertions(+), 12 deletions(-)

diff --git a/src/views/layerManagement/components/leftList.vue b/src/views/layerManagement/components/leftList.vue
index d37c82a..15b96b8 100644
--- a/src/views/layerManagement/components/leftList.vue
+++ b/src/views/layerManagement/components/leftList.vue
@@ -151,6 +151,7 @@
   );
 };
 const handleCheck = (checkedNodesData, checkedKeysData) => {
+layerParams.value.isSingleLocating = false
   const filteredNodes = checkedKeysData.checkedNodes.filter(node => node.level === 3);
   checkedNodes.value = filteredNodes
   checkedKeys.value = filteredNodes.map(node => node.id);
@@ -164,6 +165,7 @@
   );
 };
 const selectAll = () => {
+layerParams.value.isSingleLocating = false
   if (treeRef.value) {
     const allFenceKeys = getAllFenceKeys();
     const allFenceNodes = treeData.value.flatMap(folder => folder.children);
@@ -186,6 +188,12 @@
 };
 // 定位按钮事件
 const handleLocation = node => {
+ if (node.data.level === 2) {
+    layerParams.value.isSingleLocating = false; 
+  } else if (node.data.level === 3) {
+    layerParams.value.isSingleLocating = true; 
+  }
+
   const currentCheckedKeys = [...checkedKeys.value];
   const currentCheckedNodes = [...checkedNodes.value];
   EventBus.emit('focusOnNode', node.data);
@@ -202,6 +210,7 @@
   } 
   // 如果是单个节点(level 3),仅添加到选中列表(如果未选中)
   else if (!currentCheckedKeys.includes(node.data.id)) {
+  layerParams.value.isSingleLocating = true
     currentCheckedKeys.push(node.data.id);
     currentCheckedNodes.push(node.data);
     treeRef.value.setCheckedKeys(currentCheckedKeys);
diff --git a/src/views/layerManagement/index.vue b/src/views/layerManagement/index.vue
index 3a2e477..4a3184f 100644
--- a/src/views/layerManagement/index.vue
+++ b/src/views/layerManagement/index.vue
@@ -97,6 +97,7 @@
   editFolderData: null,
   editingIsProhibited: false, //禁止编辑
   isDetailShow: false,
+  isSingleLocating:false
 });
 
 const handleClick = tab => {
@@ -170,6 +171,7 @@
 const handleCoverDataUpdate = data => {
   selectDataList.value = data;
   if (selectDataList.value.length > 0) {
+  
     loadDataToMap(selectDataList.value);
   } else {
     viewer.entities.removeAll();
@@ -240,7 +242,11 @@
       zIndex: 99, 
     });
   });
-  focusOnAllFeatures();
+
+  
+ if (!layerParams.value.isSingleLocating) {
+    focusOnAllFeatures(); 
+  }
   viewInstance.value?.addLeftClickEvent(null, handleFenceClick);
 };
 const focusOnAllFeatures = () => {
@@ -261,21 +267,30 @@
 const handleFenceClick = movement => {
   if (!viewer) return;
   layerParams.value.editDetailData = null;
-  const pickedObject = viewer.scene.pick(movement.position);
-  if (Cesium.defined(pickedObject) && pickedObject.id?.customType === 'fence_polygon') {
-    const selectedEntity = pickedObject.id;
-    const selectedData = selectedEntity.customInfo;
-    //   viewer.entities.values.forEach(entity => {
+  
+if(activeName.value !== '国土空间规划') {
+    const pickedObjects = viewer.scene.drillPick(movement.position, 10); 
+  // 遍历所有被点击的实体,找到围栏类型(customType: 'fence_polygon')
+  let selectedEntity = null;
+  for (let i = 0; i < pickedObjects.length; i++) {
+    const pick = pickedObjects[i];
+    if (Cesium.defined(pick.id) && pick.id?.customType === 'fence_polygon') {
+      selectedEntity = pick.id;
+      break; 
+    }
+  }
+    // viewer.entities.values.forEach(entity => {
     // if (entity.customType === 'fence_polygon') {
     //   entity.polygon.material = entity === selectedEntity
     //     ? Cesium.Color.RED.withAlpha(0.5)
     //     : Cesium.Color.YELLOW.withAlpha(0.5);
     // }
     // });
+  if (selectedEntity) {
+    const selectedData = selectedEntity.customInfo;
     if (activeName.value !== '国土空间规划') {
-      layerParams.value.editNest = true; // 显示右侧编辑组件
-      layerParams.value.decideWhetherToAddOrEdit = 2; // 标记为编辑模式
-      // 根据围栏类型设置fenceType
+      layerParams.value.editNest = true;
+      layerParams.value.decideWhetherToAddOrEdit = 2;
       if (activeName.value === '自定义识别区') {
         layerParams.value.fenceType = 1;
       } else if (activeName.value === '自定义禁飞区') {
@@ -286,6 +301,11 @@
       layerParams.value.editingIsProhibited = true;
     }
   }
+}else {
+
+  
+}
+
 };
 let publicCesiumInstance = null;
 let viewer = null;
@@ -411,15 +431,19 @@
 
 //定位到指定节点
 const focusOnNode = (nodeData) => {
+
   if (!viewer || !nodeData?.geo_data) return;
+
   // 解析节点坐标
   const positions = parseGeoDataToPositions(nodeData.geo_data, nodeData.altitude);
-  if (positions.length < 3) return;
-  // 飞向该节点(保持其他已选中的围栏显示)
+if (positions.length < 3) {
+ 
+    return;
+  }
   flyVisual({
     positionsData: positions.map(pos => [pos.lng, pos.lat, pos.height || 0]),
     viewer,
-    multiple: 4, // 缩放倍数
+    multiple: 8, // 缩放倍数
     pitch: -90
   });
 

--
Gitblit v1.9.3