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