From ea6e49ccb4d3bdb510ccf87844490823a96ebf08 Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Fri, 12 Sep 2025 20:11:51 +0800
Subject: [PATCH] feat:空域录入完善,增删改查
---
src/utils/drawPolygon/drawPolygon.js | 69 ++++++++++++++++++++++++++++++----
1 files changed, 60 insertions(+), 9 deletions(-)
diff --git a/src/utils/drawPolygon/drawPolygon.js b/src/utils/drawPolygon/drawPolygon.js
index 2f98842..8bf2482 100644
--- a/src/utils/drawPolygon/drawPolygon.js
+++ b/src/utils/drawPolygon/drawPolygon.js
@@ -1,4 +1,5 @@
import * as Cesium from 'cesium'
+import { flyVisual } from '@/utils/cesium/mapUtil'
import _, { cloneDeep, throttle } from 'lodash'
import * as turf from '@turf/turf'
import '@/utils/drawPolygon/drawPolygon.css'
@@ -33,6 +34,7 @@
constructor() {
// Cesium 视图对象
this.viewer = null
+ this.polygonHeight = 120
// 当前绘制的多边形
this.curPolygon = null
// 绘制模式标识
@@ -47,6 +49,7 @@
this.polygonEntity = null
// 存储端点的 DataSource
this.editPolygonDataSource = null
+ this.editPolyhedronDataSource = null
this.editPolygonPointDataSource = null
// 鼠标事件处理器
this.handler = null
@@ -97,7 +100,9 @@
DEFAULT_POLYGON: Cesium.Color.fromBytes(45, 140, 240, 99), // 默认面颜色
DEFAULT_LINE: Cesium.Color.fromBytes(45, 140, 240, 255), // 默认边界线颜色
ERROR_POLYGON: Cesium.Color.fromCssColorString('rgba(255, 0, 0, .3)'), // 错误(自交)面颜色
- ERROR_LINE: Cesium.Color.fromCssColorString('rgba(255, 0, 0, 1)') // 错误(自交)线颜色
+ ERROR_LINE: Cesium.Color.fromCssColorString('rgba(255, 0, 0, 1)'), // 错误(自交)线颜色
+ // 新增多变体(立体)颜色:橙色,透明度 0.3
+ DEFAULT_POLYHEDRON: Cesium.Color.fromCssColorString('rgba(255, 165, 0, 0.3)')
};
// ============ 发布订阅机制 ============
@@ -111,7 +116,13 @@
notify (key, data) {
this.listeners
.filter(subscriber => subscriber.key === key)
- .forEach(subscriber => subscriber.listener(data))
+ .forEach(subscriber => {
+ subscriber.listener(data)
+ })
+ }
+
+ setPolygonHeight (height) {
+ this.polygonHeight = height
}
// ============ 绘制相关 ============
@@ -128,6 +139,11 @@
this.viewer?.dataSources.add(this.editPolygonDataSource)
}
+ if (!this.editPolyhedronDataSource) {
+ this.editPolyhedronDataSource = new Cesium.CustomDataSource('editPolyhedronDataSource')
+ this.viewer?.dataSources.add(this.editPolyhedronDataSource)
+ }
+
if (!this.editPolygonPointDataSource) {
this.editPolygonPointDataSource = new Cesium.CustomDataSource('editPolygonPointDataSource')
this.viewer?.dataSources.add(this.editPolygonPointDataSource)
@@ -135,6 +151,7 @@
// 清空之前的点
this.editPolygonDataSource?.entities.removeAll()
+ this.editPolyhedronDataSource?.entities.removeAll()
this.editPolygonPointDataSource?.entities.removeAll()
}
@@ -159,6 +176,29 @@
false
)
},
+ })
+
+ this.editPolyhedronDataSource.entities.add({
+ polygon: {
+ hierarchy: new Cesium.CallbackProperty(() => this.curPolygon, false),
+ material: DrawPolygon.COLORS.DEFAULT_POLYHEDRON,
+ outline: false,
+ outlineWidth: 2,
+ height: 0,
+ extrudedHeight: new Cesium.CallbackProperty(() => {
+ let heights = this.curPolygon.positions.map(item => {
+ // 获取点的位置
+ const cartographic = Cesium.Cartographic.fromCartesian(item)
+ // 获取地形高度
+ const terrainHeight = this.viewer.scene.globe.getHeight(cartographic) || 0
+
+
+ return terrainHeight
+ })
+
+ return Math.max(...heights) + Number(this.polygonHeight)
+ }, false),
+ }
})
}
@@ -392,6 +432,11 @@
this.editPolygonDataSource = null
}
+ if (this.editPolyhedronDataSource) {
+ this.editPolyhedronDataSource.entities.removeAll()
+ this.editPolyhedronDataSource = null
+ }
+
if (this.editPolygonPointDataSource) {
this.editPolygonPointDataSource.entities.removeAll()
this.editPolygonPointDataSource = null
@@ -538,20 +583,25 @@
this.initHandler(viewer)
this.startDrawing()
- positions.forEach(item => {
+ let disposePosition = positions.map(item => Cesium.Cartesian3.fromDegrees(Number(item.lng), Number(item.lat), Number(item.height)))
+
+ disposePosition.forEach(item => {
this.addPosition(
- Cesium.Cartesian3.fromDegrees(Number(item.lng), Number(item.lat), Number(item.height)),
+ item,
false
)
})
+ this.notify('getPolygonPositions', disposePosition)
+
// 视角飞入区域
- const newBox = boxTransformScale(positions.map(item => [item.lng, item.lat]), 5)
- viewer.camera.flyTo({
- destination: Cesium.Rectangle.fromDegrees(...newBox),
- offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90), 0),
- duration: 0.5,
+ flyVisual({
+ positionsData: positions.map(item => [item.lng, item.lat]),
+ viewer,
+ pitch: -60,
+ multiple: 6
})
+
this.drawingMode = false
this.editingMode = true
@@ -603,6 +653,7 @@
* 销毁实例,释放资源
*/
destroy () {
+ this.prompt.destroy()
if (!this.viewer) return
this.removeMenuPopup()
--
Gitblit v1.9.3