huweili-cesium 1.2.87 → 1.2.88

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.vue CHANGED
@@ -16,6 +16,14 @@ import { useMapStore, MapLoadStatus } from './js/stores/mapStore.js'
16
16
  import { useEventBus } from './js/utils/useEventBus.js'
17
17
  import { processMapConfigColors } from './js/tileProviders.js'
18
18
  import { applyImageryLayers, resolveOnlineBasemap } from './js/utils/mapImagery.js'
19
+ import {
20
+ ensureTerrainConfig,
21
+ resolveTerrainConfig,
22
+ createTerrainProvider,
23
+ applyTerrain,
24
+ isTerrainEnabled,
25
+ syncTerrainConfig,
26
+ } from './js/utils/terrainProvider.js'
19
27
  import { createCustomToolbarButtons } from './js/customToolbarButtons.js'
20
28
  const { merge } = objectUtils()
21
29
  const { mouseController, setInitialCameraView, syncCameraInteractionMode } = basicConfig()
@@ -89,6 +97,24 @@ const handleSceneModeChange = ({ mapId, sceneMode }) => {
89
97
  syncCameraInteractionMode(map, mapId, sceneMode)
90
98
  }
91
99
 
100
+ /**
101
+ * 处理地形开关变化(地图外 UI 通过事件总线触发)
102
+ *
103
+ * 用法示例(宿主页面):
104
+ * emit('map-terrain-changed', { mapId: 'home-main-map', show: true })
105
+ * emit('map-terrain-changed', { mapId: 'home-main-map', url: '/terrain' })
106
+ *
107
+ * @param {Object} param
108
+ * @param {string} param.mapId - 地图实例 ID
109
+ * @param {boolean} [param.show] - 是否启用地形
110
+ * @param {string} [param.url] - 地形服务地址(离线数据替换此 url 即可)
111
+ */
112
+ const handleTerrainChange = async ({ mapId, show, url }) => {
113
+ if (mapId !== props.mapId || !map || map.isDestroyed?.()) return
114
+ await syncTerrainConfig(map, MapConfig, { show, url })
115
+ map.render()
116
+ }
117
+
92
118
  const cesiumContainer = ref(null)
93
119
  let map = null
94
120
  let customButtons = []
@@ -151,6 +177,7 @@ const initCesium = async () => {
151
177
 
152
178
  if (mapOptions) {
153
179
  mapOptions = processMapConfigColors(mapOptions)
180
+ ensureTerrainConfig(mapOptions)
154
181
  }
155
182
 
156
183
  try {
@@ -169,12 +196,16 @@ const initCesium = async () => {
169
196
  infoBox: mapOptions.control.infoBox, // 实体信息弹窗
170
197
  fullscreenButton: mapOptions.control.fullscreenButton, // 全屏按钮
171
198
  vrButton: mapOptions.control.vrButton, // VR 模式按钮
172
- terrainProvider: mapOptions.terrain.show // 地形服务;不开启时为 undefined
173
- ? await Cesium.CesiumTerrainProvider.fromUrl(mapOptions.terrain.url, {
174
- requestWaterMask: mapOptions.terrain.coastlineData, // 水体效果所需海岸线数据
175
- requestVertexNormals: mapOptions.terrain.lightingData, // 地形光照法线数据
176
- })
177
- : undefined,
199
+ terrainProvider: await (async () => {
200
+ const terrainConfig = resolveTerrainConfig(mapOptions)
201
+ if (!terrainConfig.show) return undefined
202
+ try {
203
+ return await createTerrainProvider(terrainConfig)
204
+ } catch (error) {
205
+ console.error('初始地形加载失败,将使用默认椭球地形:', error)
206
+ return undefined
207
+ }
208
+ })(),
178
209
  terrainShadows: Cesium.ShadowMode.RECEIVE_ONLY, // 地形只接收阴影,不投射,节省性能
179
210
  creditContainer: document.createElement('div'), // 用空容器替换默认版权水印区域
180
211
  }
@@ -228,6 +259,15 @@ const initCesium = async () => {
228
259
  console.warn('未找到可用底图,Cesium 将使用默认底图或空底图显示')
229
260
  }
230
261
 
262
+ const terrainConfig = resolveTerrainConfig(mapOptions)
263
+ if (terrainConfig.show) {
264
+ if (isTerrainEnabled(map)) {
265
+ console.log(`地形已启用,URL:${terrainConfig.url}`)
266
+ } else {
267
+ console.warn(`地形开关已开启但未加载成功,请检查 mapConfig.terrain.url:${terrainConfig.url}`)
268
+ }
269
+ }
270
+
231
271
  if (map.screenSpaceEventHandler && mapOptions.control.disableDoubleClick) {
232
272
  // 移除双击左键事件,防止地图缩放
233
273
  map.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK)
@@ -277,6 +317,25 @@ const initCesium = async () => {
277
317
  removeToolbarButtons, // 移除工具栏按钮
278
318
  },
279
319
  syncCameraInteractionMode: (mode) => syncCameraInteractionMode(map, props.mapId, mode), // 同步相机交互模式
320
+ terrain: {
321
+ getEnabled: () => isTerrainEnabled(map),
322
+ getConfig: () => resolveTerrainConfig(mapOptions),
323
+ setEnabled: async (show) => {
324
+ await syncTerrainConfig(map, MapConfig, { show })
325
+ map?.render()
326
+ return isTerrainEnabled(map)
327
+ },
328
+ setUrl: async (url) => {
329
+ await syncTerrainConfig(map, MapConfig, { url, show: true })
330
+ map?.render()
331
+ return isTerrainEnabled(map)
332
+ },
333
+ apply: async (config = {}) => {
334
+ await syncTerrainConfig(map, MapConfig, config)
335
+ map?.render()
336
+ return isTerrainEnabled(map)
337
+ },
338
+ },
280
339
  })
281
340
 
282
341
  map.resize() // 调整地图尺寸
@@ -414,6 +473,7 @@ onMounted(() => {
414
473
  mapStore.setCurrentMapId(props.mapId) // 初始化当前地图ID
415
474
  setupActivityListeners() // 初始化用户活动监听器,用于判断是否需要继续渲染地图,避免空闲超时导致的渲染暂停
416
475
  onEvent('map-scene-mode-changed', handleSceneModeChange) // 监听场景模式变化事件,用于同步相机交互模式
476
+ onEvent('map-terrain-changed', handleTerrainChange) // 监听地形开关变化(地图外 UI 控制)
417
477
  initCesium() // 初始化 Cesium 地图实例
418
478
  })
419
479
 
@@ -439,6 +499,7 @@ onUnmounted(() => {
439
499
  isMapActive = false
440
500
  stopRenderLoop() // 停止持续渲染循环,释放资源
441
501
  offEvent('map-scene-mode-changed', handleSceneModeChange) // 移除场景模式变化事件监听器
502
+ offEvent('map-terrain-changed', handleTerrainChange) // 移除地形开关变化事件监听器
442
503
  if (map) {
443
504
  teardownOrthographicWheelZoom(map) // 移除正交投影滚轮缩放事件监听器
444
505
  }
package/js/index.js CHANGED
@@ -58,3 +58,13 @@ export {
58
58
  export { getAddressByLocation, setGeocodeProvider } from './api/gaode.js'
59
59
 
60
60
  export { objectUtils } from './utils/cesium/object.js'
61
+
62
+ export {
63
+ DEFAULT_TERRAIN_CONFIG,
64
+ resolveTerrainConfig,
65
+ ensureTerrainConfig,
66
+ createTerrainProvider,
67
+ applyTerrain,
68
+ isTerrainEnabled,
69
+ syncTerrainConfig,
70
+ } from './utils/terrainProvider.js'
@@ -0,0 +1,125 @@
1
+ /**
2
+ * 地形服务加载与切换(支持 mapConfig.terrain 配置及地图外开关)
3
+ */
4
+ import * as Cesium from 'cesium'
5
+
6
+ /** mapConfig.terrain 缺省时的默认值(show 仅在为 undefined 时生效) */
7
+ export const DEFAULT_TERRAIN_CONFIG = {
8
+ show: true,
9
+ url: 'https://data.mars3d.cn/terrain',
10
+ coastlineData: false,
11
+ lightingData: false,
12
+ }
13
+
14
+ /**
15
+ * 解析地形配置(合并 mapConfig.terrain 与默认值)
16
+ * @param {Object} mapOptions
17
+ * @returns {{ show: boolean, url: string, coastlineData: boolean, lightingData: boolean }}
18
+ */
19
+ export function resolveTerrainConfig(mapOptions) {
20
+ const terrain = mapOptions?.terrain || {}
21
+ return {
22
+ show: terrain.show ?? DEFAULT_TERRAIN_CONFIG.show,
23
+ url: terrain.url ?? DEFAULT_TERRAIN_CONFIG.url,
24
+ coastlineData: terrain.coastlineData ?? DEFAULT_TERRAIN_CONFIG.coastlineData,
25
+ lightingData: terrain.lightingData ?? DEFAULT_TERRAIN_CONFIG.lightingData,
26
+ }
27
+ }
28
+
29
+ /**
30
+ * 补全 mapOptions.terrain,避免宿主未配置时无法加载
31
+ * @param {Object} mapOptions
32
+ */
33
+ export function ensureTerrainConfig(mapOptions) {
34
+ if (!mapOptions) return mapOptions
35
+ if (!mapOptions.terrain) {
36
+ mapOptions.terrain = { ...DEFAULT_TERRAIN_CONFIG }
37
+ return mapOptions
38
+ }
39
+ const resolved = resolveTerrainConfig(mapOptions)
40
+ mapOptions.terrain = { ...mapOptions.terrain, ...resolved }
41
+ return mapOptions
42
+ }
43
+
44
+ /**
45
+ * 创建 Cesium 地形 Provider
46
+ * @param {Object} terrainConfig
47
+ * @returns {Promise<Cesium.CesiumTerrainProvider|undefined>}
48
+ */
49
+ export async function createTerrainProvider(terrainConfig) {
50
+ const config = resolveTerrainConfig({ terrain: terrainConfig })
51
+ if (!config.show || !config.url) return undefined
52
+
53
+ return Cesium.CesiumTerrainProvider.fromUrl(config.url, {
54
+ requestWaterMask: !!config.coastlineData,
55
+ requestVertexNormals: !!config.lightingData,
56
+ })
57
+ }
58
+
59
+ /**
60
+ * 将地形应用到 Viewer(关闭时使用椭球地形)
61
+ * @param {Cesium.Viewer} viewer
62
+ * @param {Object} terrainConfig
63
+ * @returns {Promise<boolean>} 是否成功加载真实地形
64
+ */
65
+ export async function applyTerrain(viewer, terrainConfig) {
66
+ if (!viewer || viewer.isDestroyed?.()) return false
67
+
68
+ const config = resolveTerrainConfig({ terrain: terrainConfig })
69
+
70
+ if (!config.show) {
71
+ viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider()
72
+ viewer.scene?.requestRender?.()
73
+ return false
74
+ }
75
+
76
+ if (!config.url) {
77
+ console.warn('地形已开启但未配置 url,请在 mapConfig.js 的 terrain.url 中设置地形服务地址')
78
+ viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider()
79
+ viewer.scene?.requestRender?.()
80
+ return false
81
+ }
82
+
83
+ try {
84
+ const provider = await createTerrainProvider(config)
85
+ viewer.terrainProvider = provider
86
+ viewer.scene?.requestRender?.()
87
+ console.log(`地形已加载:${config.url}`)
88
+ return true
89
+ } catch (error) {
90
+ console.error('地形加载失败,将使用默认椭球地形:', error)
91
+ viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider()
92
+ viewer.scene?.requestRender?.()
93
+ return false
94
+ }
95
+ }
96
+
97
+ /**
98
+ * 当前 Viewer 是否在使用真实地形(非椭球)
99
+ * @param {Cesium.Viewer} viewer
100
+ */
101
+ export function isTerrainEnabled(viewer) {
102
+ if (!viewer?.terrainProvider) return false
103
+ return !(viewer.terrainProvider instanceof Cesium.EllipsoidTerrainProvider)
104
+ }
105
+
106
+ /**
107
+ * 同步 mapConfig.terrain 并应用到 Viewer
108
+ * @param {Cesium.Viewer} viewer
109
+ * @param {Object} mapConfig - 通常为 window.MapConfig / MapConfig
110
+ * @param {{ show?: boolean, url?: string }} patch
111
+ */
112
+ export async function syncTerrainConfig(viewer, mapConfig, patch = {}) {
113
+ if (!mapConfig) {
114
+ return applyTerrain(viewer, patch)
115
+ }
116
+
117
+ if (!mapConfig.terrain) {
118
+ mapConfig.terrain = { ...DEFAULT_TERRAIN_CONFIG }
119
+ }
120
+
121
+ if (patch.show !== undefined) mapConfig.terrain.show = patch.show
122
+ if (patch.url !== undefined) mapConfig.terrain.url = patch.url
123
+
124
+ return applyTerrain(viewer, mapConfig.terrain)
125
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "huweili-cesium",
3
- "version": "1.2.87",
3
+ "version": "1.2.88",
4
4
  "description": "基于 Cesium 的地图工具库(无人机态势、轨迹、围栏、工具栏等)",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -81,6 +81,8 @@
81
81
  "./utils/basemapSwitcher.js": "./js/utils/basemapSwitcher.js",
82
82
  "./utils/mapImagery": "./js/utils/mapImagery.js",
83
83
  "./utils/mapImagery.js": "./js/utils/mapImagery.js",
84
+ "./utils/terrainProvider": "./js/utils/terrainProvider.js",
85
+ "./utils/terrainProvider.js": "./js/utils/terrainProvider.js",
84
86
  "./utils/eventBus": "./js/utils/eventBus.js",
85
87
  "./utils/eventBus.js": "./js/utils/eventBus.js",
86
88
  "./utils/useEventBus": "./js/utils/useEventBus.js",