From 70df9429bb56fc293cf7891cb261c2403c0bcb6e Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Mon, 27 Oct 2025 14:45:23 +0800
Subject: [PATCH] feat:demo

---
 src/assets/images/layerManagement/newcon_box.png |    0 
 src/views/layerManagement/components/utils.js    |   19 ++++--
 src/styles/mapEdit.scss                          |   59 +++++++++++++++++++
 src/views/layerManagement/index.vue              |   72 ++++++++++++++++++-----
 src/styles/common.scss                           |    3 +
 5 files changed, 130 insertions(+), 23 deletions(-)

diff --git a/src/assets/images/layerManagement/newcon_box.png b/src/assets/images/layerManagement/newcon_box.png
new file mode 100644
index 0000000..483bf7a
--- /dev/null
+++ b/src/assets/images/layerManagement/newcon_box.png
Binary files differ
diff --git a/src/styles/common.scss b/src/styles/common.scss
index 4464cf7..e0704d4 100644
--- a/src/styles/common.scss
+++ b/src/styles/common.scss
@@ -3,6 +3,9 @@
 @import './base.scss';
 @import './tool.scss';
 @import './element-ui.scss';
+// 地图编辑样式
+@import './mapEdit.scss';
+
 a {
   text-decoration: none;
   color: #333;
diff --git a/src/styles/mapEdit.scss b/src/styles/mapEdit.scss
new file mode 100644
index 0000000..4a7aac3
--- /dev/null
+++ b/src/styles/mapEdit.scss
@@ -0,0 +1,59 @@
+.create-wayline-box {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+    width: 130px;
+    height: 70px;
+
+    .create-wayline-menu {
+        background: url('@/assets/images/layerManagement/newcon_box.png') no-repeat center / 100% 100%;
+        margin: 15px;
+
+        div {
+            color: #fff;
+            width: 90px;
+            height: 30px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            cursor: pointer;
+            font-weight: bold;
+            font-size: 12px;
+
+            &:hover {
+                background-color: rgba(0, 0, 0, 0.3);
+            }
+        }
+    }
+}
+
+.planar-polygon-edit-tooltip {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+
+
+    .planar-polygon-edit-menu {
+        padding: 4px 0px;
+        transform: translate(24px, 10px);
+     
+        background: url('@/assets/images/layerManagement/newcon_box.png') no-repeat center / 100% 100%;
+        border-radius: 4px;
+
+        div {
+            color: #fff;
+            width: 90px;
+            height: 26px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            cursor: pointer;
+            font-weight: bold;
+            font-size: 12px;
+
+            &:hover {
+                background-color: rgba(0, 0, 0, 0.3);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/views/layerManagement/components/utils.js b/src/views/layerManagement/components/utils.js
index 80c8101..2b9e452 100644
--- a/src/views/layerManagement/components/utils.js
+++ b/src/views/layerManagement/components/utils.js
@@ -164,6 +164,8 @@
 				ind: pointIndex, // 索引记录
 			},
 		})
+	
+		
 	}
 	// 清除不在范围内的点
 	removeLastInvalidPoint() {
@@ -308,11 +310,11 @@
 		this.removeMenuPopup()
 
 		const pickedAllEntity = this.viewer.scene.drillPick(click.position).filter(i => i.id)
-		const isStartPoint = pickedAllEntity.find(i => i.id.name === '起飞点')
+	
 		const isPolygonPoint = pickedAllEntity.find(i => i.id.name === DrawPolygon.ENTITY_NAMES.POINT)
 		const isPolygon = pickedAllEntity.find(i => i.id.name === DrawPolygon.ENTITY_NAMES.POLYGON)
 
-		if (isStartPoint) return
+
 
 		// 如果不是绘制模式
 		if (!this.drawingMode) {
@@ -349,10 +351,11 @@
 	}
 
 	// 鼠标右键点击(弹出菜单)
-	handleRightClick(click) {
+	handleRightClick(click) {	
+		console.log('click',click);
+		
 		const that = this
 		if (that.drawingMode) return
-
 		that.removeMenuPopup()
 
 		const pickedAllEntity = that.viewer.scene.drillPick(click.position).filter(i => i.id)
@@ -367,10 +370,12 @@
 			pickedEntity = isPolygon
 			tooltipEvent = that.delPolygon
 			menuType = 'polygon'
+		
 		} else if (isEditPoint) {
 			pickedEntity = isEditPoint
 			tooltipEvent = that.delPoint
 			menuType = 'edit-point'
+			
 		}
 
 		if (pickedEntity && this.isDeleteTheArea) {
@@ -469,6 +474,7 @@
 		menuPopup.id = 'planarPolygonEditMenu'
 		menuPopup.className = 'planar-polygon-edit-menu'
 
+
 		const menuItems =
 			type === 'polygon'
 				? [{ title: '删除测区', class: 'del-planar-polygon' }]
@@ -480,6 +486,7 @@
 			titleDiv.className = item.class
 			menuPopup.appendChild(titleDiv)
 		})
+	
 		this.isPreviewMode = true
 		menuPopupVBox.appendChild(menuPopup)
 		return menuPopupVBox
@@ -540,7 +547,7 @@
 	initPolygon(viewer, positions, isPurePreview = false) {
 		this.initHandler(viewer)
 		this.isPureSpotPreview = isPurePreview
-		this.startDrawing()
+		// this.startDrawing()
 		let newPosition = positions.map(item => {
 			return Cesium.Cartesian3.fromDegrees(Number(item.lng), Number(item.lat), Number(item.height))
 		})
@@ -571,7 +578,7 @@
 	// 初始化事件处理器
 	initHandler(viewer) {
 		this.viewer = viewer
-		this.startDrawing()
+		// this.startDrawing()
 
 		if (!this.handler) {
 			this.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
diff --git a/src/views/layerManagement/index.vue b/src/views/layerManagement/index.vue
index 0668a73..e22caba 100644
--- a/src/views/layerManagement/index.vue
+++ b/src/views/layerManagement/index.vue
@@ -3,20 +3,29 @@
     <div class="layerContainer">
       <!-- 地图 -->
       <div id="layMap" class="ztzf-cesium"></div>
+      <div class="draw-control">
+        <div @click="startDraw">开始绘制多边形</div>
+      </div>
     </div>
   </basic-container>
 </template>
 
 <script setup>
-import { DrawPolygon } from '@/views/layerManagement/components/utils'
+import { DrawPolygon } from '@/views/layerManagement/components/utils';
 import * as Cesium from 'cesium';
 import { PublicCesium } from '@/utils/cesium/publicCesium';
-import _, { cloneDeep, throttle } from 'lodash'
+import _, { cloneDeep, throttle } from 'lodash';
+import { ElButton } from 'element-plus';
+
 let publicCesiumInstance = null;
 let viewer = null;
 const viewInstance = shallowRef(null);
 const homeViewer = shallowRef(null);
-// 地图
+
+// 初始化绘制工具实例
+const drawPolygonExample = new DrawPolygon();
+
+// 地图初始化
 const initMap = () => {
   publicCesiumInstance = new PublicCesium({
     dom: 'layMap',
@@ -28,21 +37,40 @@
 
   viewer = publicCesiumInstance.getViewer();
   viewInstance.value = publicCesiumInstance;
+
+  drawPolygonExample.initHandler(viewer);
 };
-const drawPolygonExample = new DrawPolygon()
-const loadPlanarRoute =async(positions = null, save = false)=>{
 
-}
+// 开启绘制模式(按钮点击触发)
+const startDraw = () => {
+  // 清除之前的绘制内容,重新开启绘制
+  drawPolygonExample.removeEntities();
+  drawPolygonExample.startDrawing();
+};
 
-const throttleLoadPlanarRoute = throttle(loadPlanarRoute, 200)
-drawPolygonExample.subscribe('getShowWaringTip', data => {
-	
-})
+// 处理绘制完成后的多边形坐标(示例)
+const loadPlanarRoute = async (positions = null, save = false) => {
+  if (!positions || positions.length < 3) return;
+  console.log('绘制的多边形顶点坐标(Cartesian3):', positions);
+  //坐标转换
+  const cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray(positions);
+  const latLngPositions = cartographics.map(cartographic => ({
+    lng: Cesium.Math.toDegrees(cartographic.longitude),
+    lat: Cesium.Math.toDegrees(cartographic.latitude),
+    height: cartographic.height || 0,
+  }));
+  console.log('转换后的经纬度坐标:', latLngPositions);
+};
+
+const throttleLoadPlanarRoute = throttle(loadPlanarRoute, 200);
 drawPolygonExample.subscribe('getPolygonPositions', data => {
-	throttleLoadPlanarRoute(data)
-})
-// 销毁
+  throttleLoadPlanarRoute(data);
+});
+
+// 地图销毁
 const destroyMap = () => {
+  drawPolygonExample.destroy();
+
   if (viewer) {
     viewer.destroy();
     viewer = null;
@@ -53,6 +81,7 @@
 onMounted(() => {
   initMap();
 });
+
 onBeforeUnmount(() => {
   destroyMap();
 });
@@ -60,12 +89,21 @@
 
 <style scoped lang="scss">
 .layerContainer {
-     width: 100%;
-    height: 100vh;
+  position: relative;
+  width: 100%;
+  height: 100vh;
   #layMap {
     width: 100%;
-   height: 100%;
-   
+    height: 100%;
   }
 }
+
+// 绘制控制按钮样式
+.draw-control {
+  position: absolute;
+  top: 16px;
+  left: 16px;
+  z-index: 100; // 确保按钮在地图上方
+  color: red;
+}
 </style>

--
Gitblit v1.9.3