From c1b252b4890ae7df1720955cb7caba184d78798f Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Tue, 27 Jan 2026 11:32:32 +0800
Subject: [PATCH] feat:数据驾驶舱部分调整

---
 applications/drone-command/src/utils/cesium/publicCesium.js |   50 +++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/applications/drone-command/src/utils/cesium/publicCesium.js b/applications/drone-command/src/utils/cesium/publicCesium.js
index 94c734e..234d0e5 100644
--- a/applications/drone-command/src/utils/cesium/publicCesium.js
+++ b/applications/drone-command/src/utils/cesium/publicCesium.js
@@ -114,6 +114,9 @@
 		this.handlerRightEvents = { handler: null }
 		this.handlerMouseMoveEvents = { handler: null }
 		this.viewer = null
+		this.terrainProvider = null
+		this.terrainLoading = null
+		this.terrainEnabled = false
 		this.globalBaseMapLayers = []
 		this.boundary = null
 		this.init(options)
@@ -177,16 +180,7 @@
 
 		this.viewer?.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK) // 禁用双击
 
-		if (terrain) {
-			// 使用公司地形
-			Cesium.CesiumTerrainProvider.fromUrl(`${import.meta.env.VITE_APP_TERRAIN_URL}ja_terrain`, {
-				requestVertexNormals: true, // 启用地形法线增强立体感
-				requestWaterMask: true, // 启用水体遮罩效果
-			}).then(terrainProvider => {
-				this.viewer.terrainProvider = terrainProvider
-				terrainLoadCallback?.()
-			})
-		}
+		this.setTerrainVisible(terrain, terrainLoadCallback)
 
 		this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = 4500000
 		this.switchLayers(layerMode)
@@ -203,6 +197,40 @@
 
 	getViewer () {
 		return this.viewer
+	}
+
+	async ensureTerrainProvider () {
+		if (this.terrainProvider) return this.terrainProvider
+		if (this.terrainLoading) return this.terrainLoading
+		this.terrainLoading = Cesium.CesiumTerrainProvider.fromUrl(
+			`${import.meta.env.VITE_APP_TERRAIN_URL}ja_terrain`,
+			{
+				requestVertexNormals: true, // 启用地形法线增强立体感
+				requestWaterMask: true, // 启用水体遮罩效果
+			}
+		).then(provider => {
+			this.terrainProvider = provider
+			return provider
+		})
+		return this.terrainLoading
+	}
+
+	async setTerrainVisible (visible, terrainLoadCallback) {
+		if (!this.viewer) return
+		if (!visible) {
+			this.viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider()
+			this.terrainEnabled = false
+			return
+		}
+		try {
+			const provider = await this.ensureTerrainProvider()
+			if (!this.viewer) return
+			this.viewer.terrainProvider = provider
+			this.terrainEnabled = true
+			terrainLoadCallback?.()
+		} catch (error) {
+			this.terrainEnabled = false
+		}
 	}
 
 	// 销毁viewer
@@ -876,4 +904,4 @@
 			this.viewer?.imageryLayers.remove(imageryLayers)
 		}
 	}
-}
\ No newline at end of file
+}

--
Gitblit v1.9.3