| src/views/layerManagement/components/folderFile.vue | ●●●●● patch | view | raw | blame | history | |
| src/views/layerManagement/components/leftList.vue | ●●●●● patch | view | raw | blame | history | |
| src/views/layerManagement/index.vue | ●●●●● patch | view | raw | blame | history |
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="请选择" 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)) { 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%;