From f1393f0ceedea20d671e381f32bdfa29e8dc09a7 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Thu, 13 Nov 2025 09:12:14 +0800
Subject: [PATCH] Merge branch 'refs/heads/feature/v8.0/8.0.1' into test
---
src/views/layerManagement/components/folderFile.vue | 4
src/views/layerManagement/components/leftList.vue | 53 ++++++++++-------
src/views/layerManagement/index.vue | 95 +++++++++++++++++++++----------
3 files changed, 98 insertions(+), 54 deletions(-)
diff --git a/src/views/layerManagement/components/folderFile.vue b/src/views/layerManagement/components/folderFile.vue
index 1e55585..429b760 100644
--- a/src/views/layerManagement/components/folderFile.vue
+++ b/src/views/layerManagement/components/folderFile.vue
@@ -8,12 +8,12 @@
<el-input class="ztzf-layer-input inputName" v-model="formData.name" placeholder="请输入" />
</div>
</div>
- <div class="itemRow" v-if="layerParams.addAnEditingFolder === 1 && layerParams.fileType !==2 && !itSLandPlanning">
+ <div class="itemRow" v-if="(layerParams.addAnEditingFolder === 1 && layerParams.fileType !==2) || (layerParams.addAnEditingFolder === 2 && layerParams.fileType !==2) && !itSLandPlanning">
<div class="label">关联算法</div>
<div>
<el-select
class="ztzf-layer-search filter-item"
-
+
@change="handleTypeChange"
v-model="formData.event_type"
placeholder="请选择"
diff --git a/src/views/layerManagement/components/leftList.vue b/src/views/layerManagement/components/leftList.vue
index e82fb2b..310e478 100644
--- a/src/views/layerManagement/components/leftList.vue
+++ b/src/views/layerManagement/components/leftList.vue
@@ -57,6 +57,7 @@
node-key="id"
default-expand-all
:expand-on-click-node="false"
+ :check-on-click-node="false"
:filter-node-method="filterNode"
@check="handleCheck"
:props="{
@@ -150,8 +151,9 @@
);
};
const handleCheck = (checkedNodesData, checkedKeysData) => {
+layerParams.value.isSingleLocating = false
const filteredNodes = checkedKeysData.checkedNodes.filter(node => node.level === 3);
- checkedNodes.value = checkedNodesData.checkedNodes;
+ checkedNodes.value = filteredNodes
checkedKeys.value = filteredNodes.map(node => node.id);
coverData.value = filteredNodes;
emit('update:coverData', coverData.value);
@@ -163,6 +165,7 @@
);
};
const selectAll = () => {
+layerParams.value.isSingleLocating = false
if (treeRef.value) {
const allFenceKeys = getAllFenceKeys();
const allFenceNodes = treeData.value.flatMap(folder => folder.children);
@@ -185,27 +188,38 @@
};
// 定位按钮事件
const handleLocation = node => {
- checkedKeys.value = [];
- checkedNodes.value = [];
- coverData.value = [];
+ 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);
if (node.data.level === 2) {
const folderChildren = node.data.children || [];
- // const childrenIds = folderChildren.map(child => child.id);
- // treeRef.value.setCheckedKeys(childrenIds);
- // checkedKeys.value = childrenIds;
- // checkedNodes.value = folderChildren;
- coverData.value = folderChildren;
- emit('update:coverData', coverData.value);
- } else {
- // const currentNodeId = node.data.id;
- // treeRef.value.setCheckedKeys([currentNodeId]);
- // checkedKeys.value = [currentNodeId];
- // checkedNodes.value = [node.data];
- coverData.value = [node.data];
- emit('update:coverData', coverData.value);
+ const childrenIds = folderChildren.map(child => child.id);
+ // 合并已选中的节点和当前文件夹的子节点
+ const newCheckedKeys = [...new Set([...currentCheckedKeys, ...childrenIds])];
+ const newCheckedNodes = [...currentCheckedNodes, ...folderChildren];
+ treeRef.value.setCheckedKeys(newCheckedKeys);
+ checkedKeys.value = newCheckedKeys;
+ checkedNodes.value = newCheckedNodes;
+ coverData.value = newCheckedNodes;
+ }
+ // 如果是单个节点(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);
+ checkedKeys.value = currentCheckedKeys;
+ checkedNodes.value = currentCheckedNodes;
+ coverData.value = currentCheckedNodes;
}
+ emit('update:coverData', coverData.value);
};
-
// 编辑按钮事件
const handleEdit = node => {
if (node.data.level == 2) {
@@ -246,7 +260,6 @@
deleteFolderApi(id).then(res => {
ElMessage.success('删除成功');
gettreeDataApi();
- // 通知父组件删除该文件夹下所有围栏的地图实体
EventBus.emit('deleteMapEntitiesByFolderId', id);
});
} else if (node.data.level === 3) {
@@ -254,7 +267,6 @@
deleteFenceApi(id).then(res => {
ElMessage.success('删除成功');
gettreeDataApi();
- // 通知父组件删除对应的地图实体
EventBus.emit('deleteMapEntityById', id);
});
}
@@ -284,7 +296,6 @@
layerParams.value.fileType = 2;
}
};
-
function uploadFlightFile(file, t) {
const fileSuffix = file.name.substring(file.name.lastIndexOf('.') + 1);
if (!['zip'].includes(fileSuffix)) {
diff --git a/src/views/layerManagement/index.vue b/src/views/layerManagement/index.vue
index 47c2cfc..9ff0fda 100644
--- a/src/views/layerManagement/index.vue
+++ b/src/views/layerManagement/index.vue
@@ -9,12 +9,6 @@
</div>
<!-- 地图 -->
<div class="mapContainer">
- <!-- <div class="tool-tip warning" v-show="isShowWaringTip">
- <span class="icon">
- <el-icon><WarningFilled /></el-icon>
- </span>
- <span>测区不支持交叉面,无法生成航线</span>
- </div> -->
<div class="tool-tip" v-if="layerParams.addNest">点击地图生成测绘区域</div>
<div id="layMap" class="ztzf-cesium"></div>
<leftList
@@ -103,6 +97,7 @@
editFolderData: null,
editingIsProhibited: false, //禁止编辑
isDetailShow: false,
+ isSingleLocating:false
});
const handleClick = tab => {
@@ -176,6 +171,7 @@
const handleCoverDataUpdate = data => {
selectDataList.value = data;
if (selectDataList.value.length > 0) {
+
loadDataToMap(selectDataList.value);
} else {
viewer.entities.removeAll();
@@ -246,7 +242,11 @@
zIndex: 99,
});
});
- focusOnAllFeatures();
+
+
+ if (!layerParams.value.isSingleLocating) {
+ focusOnAllFeatures();
+ }
viewInstance.value?.addLeftClickEvent(null, handleFenceClick);
};
const focusOnAllFeatures = () => {
@@ -259,7 +259,7 @@
flyVisual({
positionsData,
viewer,
- multiple: 13, // 缩放倍数
+ multiple:activeName.value == '国土空间规划' ? 13 :4, // 缩放倍数
pitch: -90
});
};
@@ -267,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 === '自定义禁飞区') {
@@ -292,6 +301,11 @@
layerParams.value.editingIsProhibited = true;
}
}
+}else {
+
+
+}
+
};
let publicCesiumInstance = null;
let viewer = null;
@@ -303,8 +317,8 @@
dom: 'layMap',
flatMode: false,
terrain: true,
- layerMode: 4,
- contour: false,
+ layerMode: 4, //轮廓线
+ dockOptions:{showDock:true}//机巢
});
viewer = publicCesiumInstance.getViewer();
viewInstance.value = publicCesiumInstance;
@@ -395,14 +409,45 @@
}
};
provide('layerParams', layerParams);
+// onMounted(() => {
+// initMap();
+// cesiumContextMenu();
+// getdataFolderApi();
+// EventBus.on('deleteMapEntityById', deleteMapEntityById);
+// EventBus.on('deleteMapEntitiesByFolderId', deleteMapEntitiesByFolderId);
+
+// });
onMounted(() => {
initMap();
cesiumContextMenu();
getdataFolderApi();
+ // 监听定位事件
+ EventBus.on('focusOnNode', (nodeData) => {
+ focusOnNode(nodeData);
+ });
EventBus.on('deleteMapEntityById', deleteMapEntityById);
EventBus.on('deleteMapEntitiesByFolderId', deleteMapEntitiesByFolderId);
-
});
+
+//定位到指定节点
+const focusOnNode = (nodeData) => {
+
+ if (!viewer || !nodeData?.geo_data) return;
+
+ // 解析节点坐标
+ const positions = parseGeoDataToPositions(nodeData.geo_data, nodeData.altitude);
+if (positions.length < 3) {
+
+ return;
+ }
+ flyVisual({
+ positionsData: positions.map(pos => [pos.lng, pos.lat, pos.height || 0]),
+ viewer,
+ multiple:activeName.value == '国土空间规划' ? 13 :7, // 缩放倍数
+ pitch: -90
+ });
+
+};
onBeforeUnmount(() => {
destroyMap();
cesiumContextMenu(false);
@@ -442,18 +487,6 @@
position: relative;
width: 100%;
height: 80vh;
- .warning {
- position: absolute;
- top: 234px;
- color: #fff;
- background: rgba(140, 0, 0, 0.4);
-
- .icon {
- display: flex;
- align-items: center;
- color: #ff1f1f;
- }
- }
#layMap {
width: 100%;
height: 100%;
--
Gitblit v1.9.3