From 1591bdf1abcd66e2ca6433f09fa5335aeeec4804 Mon Sep 17 00:00:00 2001
From: xiaoxiao <2014227881@qq.com>
Date: Sun, 02 Nov 2025 17:02:28 +0800
Subject: [PATCH] feat:删除清除地图数据

---
 src/views/layerManagement/index.vue |  178 ++++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 121 insertions(+), 57 deletions(-)

diff --git a/src/views/layerManagement/index.vue b/src/views/layerManagement/index.vue
index 59a4883..6a43cb5 100644
--- a/src/views/layerManagement/index.vue
+++ b/src/views/layerManagement/index.vue
@@ -9,9 +9,13 @@
       </div>
       <!-- 地图 -->
       <div class="mapContainer">
-        <div class="tool-tip" v-if="layerParams.addNest ">
-		        点击地图生成测绘区域
-		</div>
+        <!-- <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
           v-if="
@@ -27,13 +31,13 @@
           @newFencesMethods="newFencesMethods"
         ></leftList>
         <rightEdit
-          v-if="layerParams.addNest || (layerParams.editNest)"
+          v-if="layerParams.addNest || layerParams.editNest"
           @callParentMethod="parentMethod"
         ></rightEdit>
         <folderFile
-        @refreshMethod="refreshMethod"
+          @refreshMethod="refreshMethod"
           :activeName="activeName"
-          v-if="layerParams.addFolder || (layerParams.editFolder)"
+          v-if="layerParams.addFolder || layerParams.editFolder"
         ></folderFile>
       </div>
     </div>
@@ -41,6 +45,7 @@
 </template>
 
 <script setup>
+import EventBus from '@/utils/eventBus';
 import * as turf from '@turf/turf';
 import { dataFolderApi } from '@/api/layer/index';
 import folderFile from '@/views/layerManagement/components/folderFile.vue';
@@ -60,7 +65,8 @@
 const userInfo = computed(() => store.getters.userInfo);
 const areaCode = userInfo.value?.detail?.areaCode || '';
 // console.log('用户信息',areaCode);
-
+// 红色警告交叉面提示窗
+const isShowWaringTip = ref(false);
 const activeName = ref('电子围栏');
 const activeType = ref('0');
 let tbJwdList = [];
@@ -97,8 +103,8 @@
   fenceArea: 0, //围栏面积
   fileType: 1, //文件夹类型
   editFolderData: null,
-  editingIsProhibited:false,//禁止编辑
-  isDetailShow:false
+  editingIsProhibited: false, //禁止编辑
+  isDetailShow: false,
 });
 
 const handleClick = tab => {
@@ -106,11 +112,11 @@
   activeType.value = clickedTab.type;
   activeName.value = clickedTab.name;
   getdataFolderApi();
-  parentMethod()
+  parentMethod();
 };
-const refreshMethod =()=>{
-  getdataFolderApi()
-}
+const refreshMethod = () => {
+  getdataFolderApi();
+};
 const getdataFolderApi = () => {
   let id;
   if (activeName.value === '电子围栏') {
@@ -126,7 +132,7 @@
       label: folder.name,
       value: folder.id.toString(),
     }));
-    layerParams.value.folderOption = formattedFolderOption;  
+    layerParams.value.folderOption = formattedFolderOption;
   });
 };
 // 编辑围栏区域
@@ -134,7 +140,7 @@
   viewer.entities.removeAll();
   layerParams.value.editDetailData = val;
   drawPolygonExample.editThePatch(true);
-    drawPolygonExample.drawTheArea(true);
+  drawPolygonExample.drawTheArea(true);
   const positions = parseGeoDataToPositions(val.geo_data, val.altitude);
   if (positions.length < 3) return; // 少于3个点无法构成多边形
   drawPolygonExample.initPolygon(viewer, positions, true);
@@ -154,7 +160,7 @@
 const parentMethod = () => {
   drawPolygonExample.delPolygon();
   drawPolygonExample.drawTheArea(false);
-   viewer.entities.removeAll();
+  viewer.entities.removeAll();
 };
 // 点击显示区域
 const handleCoverDataUpdate = data => {
@@ -209,7 +215,6 @@
   });
   focusOnAllFeatures();
   viewInstance.value?.addLeftClickEvent(null, handleFenceClick);
-
 };
 //计算所有图斑的包围球并定位
 const focusOnAllFeatures = () => {
@@ -236,29 +241,28 @@
   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 (entity.customType === 'fence_polygon') {
-  //   entity.polygon.material = entity === selectedEntity 
-  //     ? Cesium.Color.RED.withAlpha(0.5) 
-  //     : Cesium.Color.YELLOW.withAlpha(0.5);
-  // }
-  // });
-  if (activeName.value !== '国土空间规划') {
-     layerParams.value.editNest = true; // 显示右侧编辑组件
-    layerParams.value.decideWhetherToAddOrEdit = 2; // 标记为编辑模式
-    // 根据围栏类型设置fenceType
-    if (activeName.value === '电子围栏') {
-      layerParams.value.fenceType = 1;
-    } else if (activeName.value === '自定义禁飞区') {
-      layerParams.value.fenceType = 2;
+    const selectedData = selectedEntity.customInfo;
+    //   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 (activeName.value !== '国土空间规划') {
+      layerParams.value.editNest = true; // 显示右侧编辑组件
+      layerParams.value.decideWhetherToAddOrEdit = 2; // 标记为编辑模式
+      // 根据围栏类型设置fenceType
+      if (activeName.value === '电子围栏') {
+        layerParams.value.fenceType = 1;
+      } else if (activeName.value === '自定义禁飞区') {
+        layerParams.value.fenceType = 2;
+      }
+      layerParams.value.editDetailData = selectedData;
+      layerParams.value.fenceArea = selectedData.area;
+      layerParams.value.editingIsProhibited = true;
     }
-     layerParams.value.editDetailData = selectedData;
-     layerParams.value.fenceArea = selectedData.area;
-     layerParams.value.editingIsProhibited = true
   }
-  }
-   
 };
 let publicCesiumInstance = null;
 let viewer = null;
@@ -300,6 +304,7 @@
 
 // 编辑/绘制
 const loadPlanarRoute = async (positions = null, save = false) => {
+  isShowWaringTip.value = false;
   if (positions) {
     curPolygonPosition = positions.map(item => {
       let cartographic = Cesium.Cartographic.fromCartesian(item);
@@ -314,9 +319,9 @@
     });
   }
 
-  let polygon = curPolygonPosition.map(item => [item?.lng, item?.lat]);  
+  let polygon = curPolygonPosition.map(item => [item?.lng, item?.lat]);
   let polygonString = JSON.stringify(polygon);
-  layerParams.value.polygonPosition = polygonString;
+  layerParams.value.polygonPosition = polygon.length > 0 ? polygonString : null;
   if (polygon.length >= 3) {
     //  确保多边形闭合:最后一个点与第一个点一致(避免计算偏差)
     const firstPoint = polygon[0];
@@ -337,6 +342,9 @@
     layerParams.value.fenceArea = 0;
   }
 };
+drawPolygonExample.subscribe('getShowWaringTip', data => {
+  isShowWaringTip.value = data;
+});
 const throttleLoadPlanarRoute = throttle(loadPlanarRoute, 200);
 drawPolygonExample.subscribe('getPolygonPositions', data => {
   throttleLoadPlanarRoute(data);
@@ -366,16 +374,60 @@
   }
 };
 provide('layerParams', layerParams);
+// onMounted(() => {
+//   initMap();
+//   cesiumContextMenu();
+//   getdataFolderApi();
+// });
+
+// onBeforeUnmount(() => {
+//   destroyMap();
+//   cesiumContextMenu(false);
+// });
 onMounted(() => {
   initMap();
   cesiumContextMenu();
   getdataFolderApi();
+
+  // 监听单个实体删除事件
+  EventBus.on('deleteMapEntityById', deleteMapEntityById);
+  // 监听文件夹下所有实体删除事件
+  EventBus.on('deleteMapEntitiesByFolderId', deleteMapEntitiesByFolderId);
 });
 
 onBeforeUnmount(() => {
   destroyMap();
   cesiumContextMenu(false);
+
+  // 移除事件监听
+  EventBus.off('deleteMapEntityById', deleteMapEntityById);
+  EventBus.off('deleteMapEntitiesByFolderId', deleteMapEntitiesByFolderId);
 });
+
+// 删除单个地图实体
+const deleteMapEntityById = entityId => {
+  if (!viewer) return;
+  const entity = viewer.entities.getById(`polygon_${entityId}`);
+  if (entity) {
+    viewer.entities.remove(entity);
+  }
+  // 更新选中数据列表
+  selectDataList.value = selectDataList.value.filter(item => item.id !== entityId);
+};
+
+// 删除文件夹下所有地图实体
+const deleteMapEntitiesByFolderId = folderId => {
+  if (!viewer) return;
+  // 假设围栏数据中包含 folder_id 字段,根据文件夹ID过滤
+  const entitiesToDelete = viewer.entities.values.filter(entity => {
+    return entity.customInfo?.folder_id === folderId;
+  });
+  entitiesToDelete.forEach(entity => {
+    viewer.entities.remove(entity);
+  });
+  // 更新选中数据列表
+  selectDataList.value = selectDataList.value.filter(item => item.folder_id !== folderId);
+};
 </script>
 
 <style scoped lang="scss">
@@ -387,28 +439,40 @@
   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%;
   }
   .tool-tip {
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	position: absolute;
-	width: 800px;
-	height: 64px;
-	right: 430px;
-	top: 60px;
-	font-family: Source Han Sans CN, Source Han Sans CN;
-	font-size: 18px;
-	color: #ffffff;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    position: absolute;
+    width: 800px;
+    height: 64px;
+    right: 430px;
+    top: 60px;
+    font-family: Source Han Sans CN, Source Han Sans CN;
+    font-size: 18px;
+    color: #ffffff;
 
-	background: rgba(11, 31, 58, 0.7);
-	-moz-user-select: none;
-	-webkit-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-}
+    background: rgba(11, 31, 58, 0.7);
+    -moz-user-select: none;
+    -webkit-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+  }
 }
 </style>

--
Gitblit v1.9.3