leiting-bim 2.1.104 → 2.1.106

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.
Files changed (31) hide show
  1. package/leiting-bim.es.js +1 -1
  2. package/leiting-bim.umd.js +2 -2
  3. package/package.json +1 -1
  4. package/plugins/cesium-core/dist/cesium-core.mjs +1538 -1409
  5. package/plugins/cesium-core/dist/cesium-core.mjs.map +1 -1
  6. package/plugins/cesium-core/dist/cesium-core.umd.js +28 -28
  7. package/plugins/cesium-core/dist/cesium-core.umd.js.map +1 -1
  8. package/plugins/cesium-core/dist/components/BufferedHierarchicalAggregator.d.ts +17 -0
  9. package/plugins/cesium-core/dist/components/HtmlOverlayLabelPool.d.ts +7 -0
  10. package/plugins/cesium-vue/dist/{HtmlOverlayLabelPool-B1gUt-p1.js → HtmlOverlayLabelPool-DgCFnmr3.js} +33 -20
  11. package/plugins/cesium-vue/dist/{HtmlOverlayLabelPool-B1gUt-p1.js.map → HtmlOverlayLabelPool-DgCFnmr3.js.map} +1 -1
  12. package/plugins/cesium-vue/dist/components/marker-manage.js +544 -429
  13. package/plugins/cesium-vue/dist/components/marker-manage.js.map +1 -1
  14. package/plugins/cesium-vue/dist/components/measurement.js +1 -1
  15. package/plugins/cesium-vue/dist/components/basic-audio/index.d.ts +0 -13
  16. package/plugins/cesium-vue/dist/components/basic-video/index.d.ts +0 -98
  17. package/plugins/cesium-vue/dist/components/card-carousel/index.d.ts +0 -147
  18. package/plugins/cesium-vue/dist/components/card-content/index.d.ts +0 -16
  19. package/plugins/cesium-vue/dist/components/card-page/index.d.ts +0 -64
  20. package/plugins/cesium-vue/dist/components/carousel-img/index.d.ts +0 -34
  21. package/plugins/cesium-vue/dist/components/echarts-pro/index.d.ts +0 -63
  22. package/plugins/cesium-vue/dist/components/marker-bubble/index.d.ts +0 -73
  23. package/plugins/cesium-vue/dist/components/marker-default/index.d.ts +0 -43
  24. package/plugins/cesium-vue/dist/components/marker-html/index.d.ts +0 -43
  25. package/plugins/cesium-vue/dist/components/marker-manage/index.d.ts +0 -159
  26. package/plugins/cesium-vue/dist/components/marker-text/index.d.ts +0 -25
  27. package/plugins/cesium-vue/dist/components/measurement/index.d.ts +0 -73
  28. package/plugins/cesium-vue/dist/components/position-picker/index.d.ts +0 -58
  29. package/plugins/cesium-vue/dist/index-C0pspk3x.js +0 -45856
  30. package/plugins/cesium-vue/dist/index-C0pspk3x.js.map +0 -1
  31. package/plugins/theme-chalk/dist/debug.log +0 -1
@@ -23,6 +23,7 @@ interface AggregatorOptions {
23
23
  centralPointMode?: string;
24
24
  minGlobalPointCount?: number;
25
25
  groupByTheme?: boolean;
26
+ terrainLevelOffset?: number;
26
27
  }
27
28
  interface GridLevel {
28
29
  level: number;
@@ -49,6 +50,8 @@ export declare class BufferedHierarchicalAggregator {
49
50
  private minGlobalPointCount;
50
51
  private groupByTheme;
51
52
  private tilingScheme;
53
+ private terrainLevelOffset;
54
+ private debugTileCoordLayer;
52
55
  private levelIndexByTileLevel;
53
56
  private _lastTileProvider;
54
57
  private _updateTimer;
@@ -60,6 +63,7 @@ export declare class BufferedHierarchicalAggregator {
60
63
  private _cameraChangedHandler;
61
64
  private defaultMinLevel;
62
65
  private defaultMaxLevel;
66
+ private maxRefineLevels;
63
67
  constructor(Cesium: any, viewer: any, options: AggregatorOptions);
64
68
  setGroupByTheme(groupByTheme: boolean, rebuild?: boolean, update?: boolean): void;
65
69
  setMinGlobalPointCount(count: number, update?: boolean): void;
@@ -77,8 +81,21 @@ export declare class BufferedHierarchicalAggregator {
77
81
  private _preparePointLevelRange;
78
82
  private _isVisibleAtLevel;
79
83
  private _update;
84
+ private _getSurfaceTiles;
85
+ private _handleNoSurfaceTiles;
86
+ private _resolveLevelIndex;
87
+ private _isTerrainEnabled;
88
+ private _getGridRefLevel;
89
+ private _processTiles;
90
+ private _processCell;
91
+ private _getCellContext;
92
+ private _processCellSkipPoints;
93
+ private _processCellGroups;
94
+ private _debugDrawCell;
80
95
  refresh(): void;
81
96
  private _drawDebugGrid;
82
97
  private _clearDebugGrids;
98
+ private _ensureDebugImageryLayer;
99
+ private _removeDebugImageryLayer;
83
100
  destroy(): void;
84
101
  }
@@ -141,6 +141,13 @@ export declare class HtmlOverlayLabelPool {
141
141
  * 坐标转换:经纬度 -> 屏幕像素坐标
142
142
  */
143
143
  toWindowCoordinates(position: any): any;
144
+ /**
145
+ * 检查经纬度是否有效
146
+ * @param lon 经度
147
+ * @param lat 纬度
148
+ * @returns 是否有效
149
+ */
150
+ private _isValidCoordinate;
144
151
  /**
145
152
  * 每帧刷新所有活跃标签的位置
146
153
  */
@@ -110,8 +110,8 @@ class B {
110
110
  show: u = !0,
111
111
  notCreateElement: d = !1,
112
112
  style: b
113
- } = e, m = this.themes[o];
114
- if (!m) {
113
+ } = e, f = this.themes[o];
114
+ if (!f) {
115
115
  console.warn(`Theme "${o}" not registered`);
116
116
  return;
117
117
  }
@@ -119,7 +119,7 @@ class B {
119
119
  if (i) {
120
120
  i.theme = o, i.data = t, i.notCreateElement = d;
121
121
  try {
122
- i.unload = m.createElement(i.el, { id: s, theme: o, data: t }, m), (!d || u) && this.container.appendChild(i.el);
122
+ i.unload = f.createElement(i.el, { id: s, theme: o, data: t }, f), (!d || u) && this.container.appendChild(i.el);
123
123
  } catch (c) {
124
124
  console.error(`Error updating label element for id "${s}":`, c);
125
125
  }
@@ -132,32 +132,32 @@ class B {
132
132
  ...e.style || {}
133
133
  });
134
134
  for (const [v, g] of Object.entries(L)) {
135
- c.addEventListener(g, (f) => {
136
- f.stopPropagation();
135
+ c.addEventListener(g, (m) => {
136
+ m.stopPropagation();
137
137
  const p = this.labels.get(s);
138
- this.eventBus.runListener(v, p, f);
138
+ this.eventBus.runListener(v, p, m);
139
139
  });
140
- let w = 0;
141
- c.addEventListener("wheel", (f) => {
140
+ let y = 0;
141
+ c.addEventListener("wheel", (m) => {
142
142
  if (!this.openWheel) return;
143
- const p = f.currentTarget;
144
- w = Date.now();
145
- const C = w;
143
+ const p = m.currentTarget;
144
+ y = Date.now();
145
+ const C = y;
146
146
  p.style.pointerEvents = "none", setTimeout(() => {
147
- w === C && (p.style.pointerEvents = "auto");
147
+ y === C && (p.style.pointerEvents = "auto");
148
148
  }, 2e3);
149
149
  });
150
150
  }
151
- let y = null;
151
+ let w = null;
152
152
  if (!d || u) {
153
153
  try {
154
- y = m.createElement(c, { id: s, theme: o, data: t }, m) || {};
154
+ w = f.createElement(c, { id: s, theme: o, data: t }, f) || {};
155
155
  } catch (v) {
156
156
  console.error(`Error updating label element for id "${s}":`, v);
157
157
  }
158
158
  this.container.appendChild(c);
159
159
  }
160
- i = { id: s, el: c, theme: o, data: t, notCreateElement: d, unload: y }, this.labels.set(s, i);
160
+ i = { id: s, el: c, theme: o, data: t, notCreateElement: d, unload: w }, this.labels.set(s, i);
161
161
  }
162
162
  i.el.dataset.lon = String(n), i.el.dataset.lat = String(l), i.el.dataset.height = String(a), i.el.style.zIndex = b?.zIndex || "1", i.el.style.display = u ? "block" : "none", u && this.activeIds.add(s);
163
163
  }
@@ -308,18 +308,31 @@ class B {
308
308
  return s.worldToWindowCoordinates(e, t);
309
309
  console.warn("No compatible window coordinate transform function found.");
310
310
  }
311
+ /**
312
+ * 检查经纬度是否有效
313
+ * @param lon 经度
314
+ * @param lat 纬度
315
+ * @returns 是否有效
316
+ */
317
+ _isValidCoordinate(t, e) {
318
+ return !(Number.isNaN(t) || Number.isNaN(e) || t === 0 && e === 0 || t < -180 || t > 180 || e < -90 || e > 90);
319
+ }
311
320
  /**
312
321
  * 每帧刷新所有活跃标签的位置
313
322
  */
314
323
  async _update() {
315
- this.viewer.scene;
316
324
  for (const t of this.activeIds) {
317
325
  const e = this.labels.get(t);
318
326
  if (!e) continue;
319
- const s = parseFloat(e.el.dataset.lon), n = parseFloat(e.el.dataset.lat), l = parseFloat(e.el.dataset.height || "0"), a = this.Cesium.Cartesian3.fromDegrees(s, n, l), o = this.toWindowCoordinates(a);
327
+ const s = parseFloat(e.el.dataset.lon), n = parseFloat(e.el.dataset.lat), l = parseFloat(e.el.dataset.height || "0");
328
+ if (!this._isValidCoordinate(s, n)) {
329
+ e.el.style.display = "none";
330
+ continue;
331
+ }
332
+ const a = this.Cesium.Cartesian3.fromDegrees(s, n, l), o = this.toWindowCoordinates(a);
320
333
  if (this.Cesium.defined(o)) {
321
- const d = this.themes[e.theme].options?.offset || {}, b = d.x || 0, m = d.y || 0;
322
- e.el.style.left = `${o.x}px`, e.el.style.top = `${o.y}px`, e.el.style.transform = `translate(${b}px, ${m}px)`, e.el.style.display = "block";
334
+ const d = this.themes[e.theme].options?.offset || {}, b = d.x || 0, f = d.y || 0;
335
+ e.el.style.left = `${o.x}px`, e.el.style.top = `${o.y}px`, e.el.style.transform = `translate(${b}px, ${f}px)`, e.el.style.display = "block";
323
336
  } else
324
337
  e.el.style.display = "none";
325
338
  }
@@ -336,4 +349,4 @@ export {
336
349
  h as M,
337
350
  E as a
338
351
  };
339
- //# sourceMappingURL=HtmlOverlayLabelPool-B1gUt-p1.js.map
352
+ //# sourceMappingURL=HtmlOverlayLabelPool-DgCFnmr3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HtmlOverlayLabelPool-B1gUt-p1.js","sources":["../../cesium-core/src/components/MarkerEvent.ts","../../cesium-core/src/components/HtmlOverlayLabelPool.ts"],"sourcesContent":["export enum MarkerEventKey {\r\n Click = 'marker:click',\r\n DoubleClick = 'marker:dblclick',\r\n RightClick = 'marker:rightclick',\r\n MouseEnter = 'marker:mouseenter',\r\n MouseLeave = 'marker:mouseleave',\r\n MouseDown = 'marker:mousedown',\r\n MouseUp = 'marker:mouseup',\r\n}\r\n\r\ninterface ListenerItem<T = any> {\r\n name: string;\r\n fn: (data: T, event: Event) => void;\r\n once?: boolean;\r\n}\r\n\r\nexport { ListenerItem };\r\n\r\nexport class MarkerEventBus {\r\n private listenerMap = new Map<MarkerEventKey, Map<string, ListenerItem>>();\r\n\r\n /**\r\n * 添加监听器\r\n * @param key 事件 key\r\n * @param listener 监听器项\r\n * @param overwrite 是否覆盖同名监听器\r\n * @returns 是否成功添加\r\n */\r\n addListener(key: MarkerEventKey, listener: ListenerItem, overwrite: boolean = false): boolean {\r\n let map = this.listenerMap.get(key);\r\n if (!map) {\r\n map = new Map();\r\n this.listenerMap.set(key, map);\r\n }\r\n\r\n if (map.has(listener.name)) {\r\n if (overwrite) {\r\n console.warn(\r\n `[MarkerEventBus] Overwriting listener \"${listener.name}\" for event \"${key}\".`,\r\n );\r\n map.set(listener.name, listener);\r\n return true;\r\n } else {\r\n console.warn(\r\n `[MarkerEventBus] Listener \"${listener.name}\" for event \"${key}\" already exists. Use overwrite=true to replace it.`,\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n map.set(listener.name, listener);\r\n return true;\r\n }\r\n\r\n /**\r\n * 移除某个 key 的所有监听器\r\n */\r\n removeListenerByKey(key: MarkerEventKey): boolean {\r\n const existed = this.listenerMap.has(key);\r\n this.listenerMap.set(key, new Map());\r\n return existed;\r\n }\r\n\r\n /**\r\n * 移除某个 key 下的指定名字的监听器\r\n */\r\n removeListenerByKeyAndName(key: MarkerEventKey, name: string): boolean {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return false;\r\n return map.delete(name);\r\n }\r\n\r\n /**\r\n * 运行监听器\r\n */\r\n runListener<T = any>(key: MarkerEventKey, data: T, e: Event) {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return;\r\n\r\n for (const [name, listener] of map.entries()) {\r\n try {\r\n listener.fn(data, e);\r\n } catch (err) {\r\n console.error(`Error in listener \"${name}\" for event \"${key}\":`, err);\r\n }\r\n\r\n if (listener.once) {\r\n map.delete(name);\r\n }\r\n }\r\n }\r\n}\r\n","import { MarkerEventKey, MarkerEventBus } from './MarkerEvent';\r\n\r\n/**\r\n * 单个标签实例\r\n */\r\ninterface LabelInstance {\r\n id: string;\r\n el: HTMLDivElement;\r\n theme: string;\r\n data?: any;\r\n notCreateElement?: boolean;\r\n unload?: any;\r\n}\r\n\r\n/**\r\n * 主题配置项\r\n */\r\ninterface ThemeOptions {\r\n /**\r\n * 创建标签 DOM 内容的方法\r\n */\r\n createElement: (\r\n el: HTMLDivElement,\r\n context: { id: string; theme: string; data: any },\r\n options: ThemeOptions,\r\n ) => any;\r\n\r\n /**\r\n * 可选配置,如偏移量\r\n */\r\n options?: {\r\n offset?: { x?: number; y?: number };\r\n };\r\n}\r\n\r\n/**\r\n * 标签添加时的参数\r\n */\r\ninterface LabelOptions {\r\n id: string;\r\n lon: number;\r\n lat: number;\r\n height?: number;\r\n theme: string;\r\n show?: boolean;\r\n notCreateElement?: boolean;\r\n style?: {\r\n [key: string]: string;\r\n };\r\n}\r\n\r\nexport { LabelOptions, LabelInstance, ThemeOptions };\r\n\r\n/**\r\n * 自定义事件与 DOM 事件的映射\r\n */\r\nexport const DOM_EVENT_MAP: Record<MarkerEventKey, keyof HTMLElementEventMap> = {\r\n [MarkerEventKey.Click]: 'click',\r\n [MarkerEventKey.DoubleClick]: 'dblclick',\r\n [MarkerEventKey.RightClick]: 'contextmenu',\r\n [MarkerEventKey.MouseEnter]: 'mouseenter',\r\n [MarkerEventKey.MouseLeave]: 'mouseleave',\r\n [MarkerEventKey.MouseDown]: 'mousedown',\r\n [MarkerEventKey.MouseUp]: 'mouseup',\r\n};\r\n\r\n/**\r\n * 用于管理 Cesium HTML 标签的池,支持主题渲染、事件分发、动态更新等功能\r\n */\r\nexport class HtmlOverlayLabelPool {\r\n private viewer: any;\r\n private Cesium: any;\r\n private container: HTMLDivElement;\r\n private labels: Map<string, LabelInstance> = new Map();\r\n private activeIds: Set<string> = new Set();\r\n private _updateFn: () => void;\r\n private themes: Record<string, ThemeOptions> = {};\r\n public eventBus: MarkerEventBus;\r\n public openWheel = true;\r\n /**\r\n * 构造函数\r\n * @param Cesium Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param containerId HTML 容器 ID(默认:\"html-label-container\")\r\n * @param eventBus 可选:自定义事件总线\r\n */\r\n constructor(\r\n Cesium: any,\r\n viewer: any,\r\n containerId: string = 'html-label-container',\r\n eventBus?: MarkerEventBus,\r\n openWheel: boolean = true,\r\n ) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.container = this._createContainer(containerId);\r\n this._updateFn = this._update.bind(this);\r\n this.viewer.scene.postRender.addEventListener(this._updateFn);\r\n this.eventBus = eventBus || new MarkerEventBus();\r\n this.openWheel = openWheel;\r\n }\r\n\r\n /**\r\n * 创建标签容器\r\n */\r\n private _createContainer(id: string): HTMLDivElement {\r\n let container = document.getElementById(id) as HTMLDivElement;\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.id = id;\r\n Object.assign(container.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n pointerEvents: 'none',\r\n width: '100%',\r\n height: '100%',\r\n zIndex: '100',\r\n overflow: 'hidden',\r\n });\r\n document.body.appendChild(container);\r\n }\r\n return container;\r\n }\r\n\r\n /**\r\n * 注册标签主题\r\n */\r\n registerTheme(themeName: string, options: ThemeOptions) {\r\n this.themes[themeName] = options;\r\n }\r\n\r\n /**\r\n * 添加单个标签\r\n */\r\n add(data: any, options: LabelOptions) {\r\n const {\r\n id,\r\n lon,\r\n lat,\r\n height = 0,\r\n theme,\r\n show = true,\r\n notCreateElement = false,\r\n style,\r\n } = options;\r\n\r\n const themeOptions = this.themes[theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${theme}\" not registered`);\r\n return;\r\n }\r\n\r\n let label = this.labels.get(id);\r\n if (!label) {\r\n const el = document.createElement('div');\r\n Object.assign(el.style, {\r\n position: 'absolute',\r\n transform: 'translate(0, 0)',\r\n pointerEvents: 'auto',\r\n ...(options.style || {}),\r\n });\r\n\r\n // 绑定 DOM 事件到事件总线\r\n for (const [key, domEvent] of Object.entries(DOM_EVENT_MAP)) {\r\n el.addEventListener(domEvent, (e: Event) => {\r\n e.stopPropagation();\r\n const labelData = this.labels.get(id);\r\n this.eventBus.runListener(key as MarkerEventKey, labelData, e);\r\n });\r\n\r\n // 滚轮期间禁止点击\r\n let lastTime = 0;\r\n el.addEventListener('wheel', (event) => {\r\n if (!this.openWheel) return;\r\n const dom = event.currentTarget as HTMLElement;\r\n lastTime = Date.now();\r\n const currTime = lastTime;\r\n dom.style.pointerEvents = 'none';\r\n setTimeout(() => {\r\n if (lastTime === currTime) {\r\n dom.style.pointerEvents = 'auto';\r\n }\r\n }, 2000);\r\n });\r\n }\r\n\r\n let unload = null;\r\n if (!notCreateElement || show) {\r\n try {\r\n unload = themeOptions.createElement(el, { id, theme, data }, themeOptions) || {};\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n this.container.appendChild(el);\r\n }\r\n label = { id, el, theme, data, notCreateElement, unload: unload };\r\n this.labels.set(id, label);\r\n } else {\r\n label.theme = theme;\r\n label.data = data;\r\n label.notCreateElement = notCreateElement;\r\n\r\n // 若已存在,则更新 DOM 内容\r\n try {\r\n label.unload = themeOptions.createElement(label.el, { id, theme, data }, themeOptions);\r\n if (!notCreateElement || show) {\r\n this.container.appendChild(label.el);\r\n }\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n }\r\n\r\n // 存储坐标用于后续位置更新\r\n label.el.dataset.lon = String(lon);\r\n label.el.dataset.lat = String(lat);\r\n label.el.dataset.height = String(height);\r\n\r\n label.el.style.zIndex = style?.zIndex || '1';\r\n label.el.style.display = show ? 'block' : 'none';\r\n if (show) {\r\n this.activeIds.add(id);\r\n }\r\n }\r\n\r\n /**\r\n * 批量添加标签\r\n */\r\n addBatch(items: Array<{ data: any; options: LabelOptions }>) {\r\n for (const { data, options } of items) {\r\n this.add(data, options);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量移除标签\r\n */\r\n removeByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n this.unloadByLabel(label);\r\n this.labels.delete(id);\r\n this.activeIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n unloadByLabel(label: LabelInstance) {\r\n label.el.remove();\r\n if (label?.unload && typeof label.unload === 'function') label?.unload();\r\n label.unload = null;\r\n }\r\n\r\n /**\r\n * 移除所有标签\r\n */\r\n removeAll() {\r\n for (const label of this.labels.values()) {\r\n this.unloadByLabel(label);\r\n }\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n }\r\n\r\n /**\r\n * 更新标签的数据并刷新内容\r\n */\r\n update(id: string, newData: any) {\r\n const label = this.labels.get(id);\r\n if (!label) {\r\n console.warn(`Label with id \"${id}\" not found for update.`);\r\n return;\r\n }\r\n\r\n const theme = this.themes[label.theme];\r\n if (!theme) {\r\n console.warn(`Theme \"${label.theme}\" not registered.`);\r\n return;\r\n }\r\n\r\n try {\r\n theme.createElement(label.el, { id, theme: label.theme, data: newData }, theme);\r\n } catch (err) {\r\n console.error(`Failed to update label \"${id}\":`, err);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量隐藏标签\r\n */\r\n hideByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏所有标签\r\n */\r\n hideAll() {\r\n for (const label of this.labels.values()) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 条件过滤隐藏标签\r\n */\r\n hideFilter(filter: (data: any) => boolean) {\r\n for (const label of this.labels.values()) {\r\n if (!filter(label.data)) continue;\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 显示标签\r\n */\r\n showByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement || !label.el.parentNode) {\r\n this.container.appendChild(label.el);\r\n }\r\n if (!label.unload) {\r\n try {\r\n const themeOptions = this.themes[label.theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${label.theme}\" not registered`);\r\n return;\r\n }\r\n label.unload =\r\n themeOptions.createElement(\r\n label.el,\r\n { id, theme: label.theme, data: label.data },\r\n themeOptions,\r\n ) || {};\r\n } catch (err) {\r\n console.error(`Error creating label element for theme \"${label.theme}\":`, err);\r\n return;\r\n }\r\n }\r\n\r\n label.el.style.display = 'block';\r\n this.activeIds.add(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 检查标签是否存在\r\n */\r\n has(id: string): boolean {\r\n return this.labels.has(id);\r\n }\r\n\r\n /**\r\n * 清空活跃 ID 列表(不影响 DOM)\r\n */\r\n reset() {\r\n for (const id of this.activeIds.values()) {\r\n let label = this.labels.get(id);\r\n label && this.unloadByLabel(label);\r\n }\r\n this.activeIds.clear();\r\n }\r\n\r\n /**\r\n * 清理当前未活跃的标签(隐藏而不移除 DOM)\r\n */\r\n cleanup() {\r\n for (const [id, label] of this.labels.entries()) {\r\n if (!this.activeIds.has(id)) {\r\n label.el.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 经纬度 -> 自动地形高度修正 -> Cartesian3 -> 屏幕坐标\r\n */\r\n async toWindowPositionByLonLat(lon: number, lat: number): Promise<any> {\r\n const Cesium = this.Cesium;\r\n const scene = this.viewer.scene;\r\n\r\n // 1. 经纬度列表\r\n const positions = [Cesium.Cartographic.fromDegrees(lon, lat)];\r\n\r\n // 2. 使用 clampToHeightMostDetailed 获取真实地形高度\r\n let heightResult;\r\n try {\r\n heightResult = await scene.clampToHeightMostDetailed(positions);\r\n } catch (e) {\r\n console.warn('clampToHeightMostDetailed failed, fallback to ellipsoid height.');\r\n }\r\n\r\n let finalHeight = 0;\r\n if (heightResult && heightResult[0] && heightResult[0].height != null) {\r\n finalHeight = heightResult[0].height; // 用户偏好:height[0].height\r\n } else {\r\n // 如果地形未开启,则 fallback 椭球高度\r\n finalHeight = 0;\r\n }\r\n\r\n // 3. 生成真实位置 Cartesian3\r\n const worldPos = Cesium.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n\r\n // 4. 转屏幕像素坐标\r\n return this.toWindowCoordinates(worldPos);\r\n }\r\n\r\n /**\r\n * 坐标转换:经纬度 -> 屏幕像素坐标\r\n */\r\n toWindowCoordinates(position: any): any {\r\n const scene = this.viewer.scene;\r\n const st = this.Cesium.SceneTransforms;\r\n if (typeof st?.wgs84ToWindowCoordinates === 'function') {\r\n return st.wgs84ToWindowCoordinates(scene, position);\r\n }\r\n if (typeof st?.worldToWindowCoordinates === 'function') {\r\n return st.worldToWindowCoordinates(scene, position);\r\n }\r\n\r\n console.warn('No compatible window coordinate transform function found.');\r\n return undefined;\r\n }\r\n\r\n /**\r\n * 每帧刷新所有活跃标签的位置\r\n */\r\n private async _update() {\r\n const scene = this.viewer.scene;\r\n\r\n for (const id of this.activeIds) {\r\n const label = this.labels.get(id);\r\n if (!label) continue;\r\n\r\n const lon = parseFloat(label.el.dataset.lon!);\r\n const lat = parseFloat(label.el.dataset.lat!);\r\n const height = parseFloat(label.el.dataset.height || '0');\r\n\r\n const position = this.Cesium.Cartesian3.fromDegrees(lon, lat, height);\r\n const screenPosition = this.toWindowCoordinates(position);\r\n\r\n if (this.Cesium.defined(screenPosition)) {\r\n const theme = this.themes[label.theme];\r\n const offset = theme.options?.offset || {};\r\n const offsetX = offset.x || 0;\r\n const offsetY = offset.y || 0;\r\n\r\n label.el.style.left = `${screenPosition.x}px`;\r\n label.el.style.top = `${screenPosition.y}px`;\r\n label.el.style.transform = `translate(${offsetX}px, ${offsetY}px)`;\r\n label.el.style.display = 'block';\r\n } else {\r\n label.el.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 销毁标签池,清理监听器和 DOM\r\n */\r\n destroy() {\r\n this.viewer.scene.postRender.removeEventListener(this._updateFn);\r\n // this.container.remove();\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n }\r\n}\r\n"],"names":["MarkerEventKey","MarkerEventBus","key","listener","overwrite","map","existed","name","data","e","err","DOM_EVENT_MAP","HtmlOverlayLabelPool","Cesium","viewer","containerId","eventBus","openWheel","id","container","themeName","options","lon","lat","height","theme","show","notCreateElement","style","themeOptions","label","el","domEvent","labelData","lastTime","event","dom","currTime","unload","items","ids","newData","filter","scene","positions","heightResult","finalHeight","worldPos","position","st","screenPosition","offset","offsetX","offsetY"],"mappings":"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"}
1
+ {"version":3,"file":"HtmlOverlayLabelPool-DgCFnmr3.js","sources":["../../cesium-core/src/components/MarkerEvent.ts","../../cesium-core/src/components/HtmlOverlayLabelPool.ts"],"sourcesContent":["export enum MarkerEventKey {\r\n Click = 'marker:click',\r\n DoubleClick = 'marker:dblclick',\r\n RightClick = 'marker:rightclick',\r\n MouseEnter = 'marker:mouseenter',\r\n MouseLeave = 'marker:mouseleave',\r\n MouseDown = 'marker:mousedown',\r\n MouseUp = 'marker:mouseup',\r\n}\r\n\r\ninterface ListenerItem<T = any> {\r\n name: string;\r\n fn: (data: T, event: Event) => void;\r\n once?: boolean;\r\n}\r\n\r\nexport { ListenerItem };\r\n\r\nexport class MarkerEventBus {\r\n private listenerMap = new Map<MarkerEventKey, Map<string, ListenerItem>>();\r\n\r\n /**\r\n * 添加监听器\r\n * @param key 事件 key\r\n * @param listener 监听器项\r\n * @param overwrite 是否覆盖同名监听器\r\n * @returns 是否成功添加\r\n */\r\n addListener(key: MarkerEventKey, listener: ListenerItem, overwrite: boolean = false): boolean {\r\n let map = this.listenerMap.get(key);\r\n if (!map) {\r\n map = new Map();\r\n this.listenerMap.set(key, map);\r\n }\r\n\r\n if (map.has(listener.name)) {\r\n if (overwrite) {\r\n console.warn(\r\n `[MarkerEventBus] Overwriting listener \"${listener.name}\" for event \"${key}\".`,\r\n );\r\n map.set(listener.name, listener);\r\n return true;\r\n } else {\r\n console.warn(\r\n `[MarkerEventBus] Listener \"${listener.name}\" for event \"${key}\" already exists. Use overwrite=true to replace it.`,\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n map.set(listener.name, listener);\r\n return true;\r\n }\r\n\r\n /**\r\n * 移除某个 key 的所有监听器\r\n */\r\n removeListenerByKey(key: MarkerEventKey): boolean {\r\n const existed = this.listenerMap.has(key);\r\n this.listenerMap.set(key, new Map());\r\n return existed;\r\n }\r\n\r\n /**\r\n * 移除某个 key 下的指定名字的监听器\r\n */\r\n removeListenerByKeyAndName(key: MarkerEventKey, name: string): boolean {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return false;\r\n return map.delete(name);\r\n }\r\n\r\n /**\r\n * 运行监听器\r\n */\r\n runListener<T = any>(key: MarkerEventKey, data: T, e: Event) {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return;\r\n\r\n for (const [name, listener] of map.entries()) {\r\n try {\r\n listener.fn(data, e);\r\n } catch (err) {\r\n console.error(`Error in listener \"${name}\" for event \"${key}\":`, err);\r\n }\r\n\r\n if (listener.once) {\r\n map.delete(name);\r\n }\r\n }\r\n }\r\n}\r\n","import { MarkerEventKey, MarkerEventBus } from './MarkerEvent';\r\n\r\n/**\r\n * 单个标签实例\r\n */\r\ninterface LabelInstance {\r\n id: string;\r\n el: HTMLDivElement;\r\n theme: string;\r\n data?: any;\r\n notCreateElement?: boolean;\r\n unload?: any;\r\n}\r\n\r\n/**\r\n * 主题配置项\r\n */\r\ninterface ThemeOptions {\r\n /**\r\n * 创建标签 DOM 内容的方法\r\n */\r\n createElement: (\r\n el: HTMLDivElement,\r\n context: { id: string; theme: string; data: any },\r\n options: ThemeOptions,\r\n ) => any;\r\n\r\n /**\r\n * 可选配置,如偏移量\r\n */\r\n options?: {\r\n offset?: { x?: number; y?: number };\r\n };\r\n}\r\n\r\n/**\r\n * 标签添加时的参数\r\n */\r\ninterface LabelOptions {\r\n id: string;\r\n lon: number;\r\n lat: number;\r\n height?: number;\r\n theme: string;\r\n show?: boolean;\r\n notCreateElement?: boolean;\r\n style?: {\r\n [key: string]: string;\r\n };\r\n}\r\n\r\nexport { LabelOptions, LabelInstance, ThemeOptions };\r\n\r\n/**\r\n * 自定义事件与 DOM 事件的映射\r\n */\r\nexport const DOM_EVENT_MAP: Record<MarkerEventKey, keyof HTMLElementEventMap> = {\r\n [MarkerEventKey.Click]: 'click',\r\n [MarkerEventKey.DoubleClick]: 'dblclick',\r\n [MarkerEventKey.RightClick]: 'contextmenu',\r\n [MarkerEventKey.MouseEnter]: 'mouseenter',\r\n [MarkerEventKey.MouseLeave]: 'mouseleave',\r\n [MarkerEventKey.MouseDown]: 'mousedown',\r\n [MarkerEventKey.MouseUp]: 'mouseup',\r\n};\r\n\r\n/**\r\n * 用于管理 Cesium HTML 标签的池,支持主题渲染、事件分发、动态更新等功能\r\n */\r\nexport class HtmlOverlayLabelPool {\r\n private viewer: any;\r\n private Cesium: any;\r\n private container: HTMLDivElement;\r\n private labels: Map<string, LabelInstance> = new Map();\r\n private activeIds: Set<string> = new Set();\r\n private _updateFn: () => void;\r\n private themes: Record<string, ThemeOptions> = {};\r\n public eventBus: MarkerEventBus;\r\n public openWheel = true;\r\n /**\r\n * 构造函数\r\n * @param Cesium Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param containerId HTML 容器 ID(默认:\"html-label-container\")\r\n * @param eventBus 可选:自定义事件总线\r\n */\r\n constructor(\r\n Cesium: any,\r\n viewer: any,\r\n containerId: string = 'html-label-container',\r\n eventBus?: MarkerEventBus,\r\n openWheel: boolean = true,\r\n ) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.container = this._createContainer(containerId);\r\n this._updateFn = this._update.bind(this);\r\n this.viewer.scene.postRender.addEventListener(this._updateFn);\r\n this.eventBus = eventBus || new MarkerEventBus();\r\n this.openWheel = openWheel;\r\n }\r\n\r\n /**\r\n * 创建标签容器\r\n */\r\n private _createContainer(id: string): HTMLDivElement {\r\n let container = document.getElementById(id) as HTMLDivElement;\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.id = id;\r\n Object.assign(container.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n pointerEvents: 'none',\r\n width: '100%',\r\n height: '100%',\r\n zIndex: '100',\r\n overflow: 'hidden',\r\n });\r\n document.body.appendChild(container);\r\n }\r\n return container;\r\n }\r\n\r\n /**\r\n * 注册标签主题\r\n */\r\n registerTheme(themeName: string, options: ThemeOptions) {\r\n this.themes[themeName] = options;\r\n }\r\n\r\n /**\r\n * 添加单个标签\r\n */\r\n add(data: any, options: LabelOptions) {\r\n const {\r\n id,\r\n lon,\r\n lat,\r\n height = 0,\r\n theme,\r\n show = true,\r\n notCreateElement = false,\r\n style,\r\n } = options;\r\n\r\n const themeOptions = this.themes[theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${theme}\" not registered`);\r\n return;\r\n }\r\n\r\n let label = this.labels.get(id);\r\n if (!label) {\r\n const el = document.createElement('div');\r\n Object.assign(el.style, {\r\n position: 'absolute',\r\n transform: 'translate(0, 0)',\r\n pointerEvents: 'auto',\r\n ...(options.style || {}),\r\n });\r\n\r\n // 绑定 DOM 事件到事件总线\r\n for (const [key, domEvent] of Object.entries(DOM_EVENT_MAP)) {\r\n el.addEventListener(domEvent, (e: Event) => {\r\n e.stopPropagation();\r\n const labelData = this.labels.get(id);\r\n this.eventBus.runListener(key as MarkerEventKey, labelData, e);\r\n });\r\n\r\n // 滚轮期间禁止点击\r\n let lastTime = 0;\r\n el.addEventListener('wheel', (event) => {\r\n if (!this.openWheel) return;\r\n const dom = event.currentTarget as HTMLElement;\r\n lastTime = Date.now();\r\n const currTime = lastTime;\r\n dom.style.pointerEvents = 'none';\r\n setTimeout(() => {\r\n if (lastTime === currTime) {\r\n dom.style.pointerEvents = 'auto';\r\n }\r\n }, 2000);\r\n });\r\n }\r\n\r\n let unload = null;\r\n if (!notCreateElement || show) {\r\n try {\r\n unload = themeOptions.createElement(el, { id, theme, data }, themeOptions) || {};\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n this.container.appendChild(el);\r\n }\r\n label = { id, el, theme, data, notCreateElement, unload: unload };\r\n this.labels.set(id, label);\r\n } else {\r\n label.theme = theme;\r\n label.data = data;\r\n label.notCreateElement = notCreateElement;\r\n\r\n // 若已存在,则更新 DOM 内容\r\n try {\r\n label.unload = themeOptions.createElement(label.el, { id, theme, data }, themeOptions);\r\n if (!notCreateElement || show) {\r\n this.container.appendChild(label.el);\r\n }\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n }\r\n\r\n // 存储坐标用于后续位置更新\r\n label.el.dataset.lon = String(lon);\r\n label.el.dataset.lat = String(lat);\r\n label.el.dataset.height = String(height);\r\n\r\n label.el.style.zIndex = style?.zIndex || '1';\r\n label.el.style.display = show ? 'block' : 'none';\r\n if (show) {\r\n this.activeIds.add(id);\r\n }\r\n }\r\n\r\n /**\r\n * 批量添加标签\r\n */\r\n addBatch(items: Array<{ data: any; options: LabelOptions }>) {\r\n for (const { data, options } of items) {\r\n this.add(data, options);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量移除标签\r\n */\r\n removeByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n this.unloadByLabel(label);\r\n this.labels.delete(id);\r\n this.activeIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n unloadByLabel(label: LabelInstance) {\r\n label.el.remove();\r\n if (label?.unload && typeof label.unload === 'function') label?.unload();\r\n label.unload = null;\r\n }\r\n\r\n /**\r\n * 移除所有标签\r\n */\r\n removeAll() {\r\n for (const label of this.labels.values()) {\r\n this.unloadByLabel(label);\r\n }\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n }\r\n\r\n /**\r\n * 更新标签的数据并刷新内容\r\n */\r\n update(id: string, newData: any) {\r\n const label = this.labels.get(id);\r\n if (!label) {\r\n console.warn(`Label with id \"${id}\" not found for update.`);\r\n return;\r\n }\r\n\r\n const theme = this.themes[label.theme];\r\n if (!theme) {\r\n console.warn(`Theme \"${label.theme}\" not registered.`);\r\n return;\r\n }\r\n\r\n try {\r\n theme.createElement(label.el, { id, theme: label.theme, data: newData }, theme);\r\n } catch (err) {\r\n console.error(`Failed to update label \"${id}\":`, err);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量隐藏标签\r\n */\r\n hideByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏所有标签\r\n */\r\n hideAll() {\r\n for (const label of this.labels.values()) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 条件过滤隐藏标签\r\n */\r\n hideFilter(filter: (data: any) => boolean) {\r\n for (const label of this.labels.values()) {\r\n if (!filter(label.data)) continue;\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 显示标签\r\n */\r\n showByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement || !label.el.parentNode) {\r\n this.container.appendChild(label.el);\r\n }\r\n if (!label.unload) {\r\n try {\r\n const themeOptions = this.themes[label.theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${label.theme}\" not registered`);\r\n return;\r\n }\r\n label.unload =\r\n themeOptions.createElement(\r\n label.el,\r\n { id, theme: label.theme, data: label.data },\r\n themeOptions,\r\n ) || {};\r\n } catch (err) {\r\n console.error(`Error creating label element for theme \"${label.theme}\":`, err);\r\n return;\r\n }\r\n }\r\n\r\n label.el.style.display = 'block';\r\n this.activeIds.add(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 检查标签是否存在\r\n */\r\n has(id: string): boolean {\r\n return this.labels.has(id);\r\n }\r\n\r\n /**\r\n * 清空活跃 ID 列表(不影响 DOM)\r\n */\r\n reset() {\r\n for (const id of this.activeIds.values()) {\r\n let label = this.labels.get(id);\r\n label && this.unloadByLabel(label);\r\n }\r\n this.activeIds.clear();\r\n }\r\n\r\n /**\r\n * 清理当前未活跃的标签(隐藏而不移除 DOM)\r\n */\r\n cleanup() {\r\n for (const [id, label] of this.labels.entries()) {\r\n if (!this.activeIds.has(id)) {\r\n label.el.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 经纬度 -> 自动地形高度修正 -> Cartesian3 -> 屏幕坐标\r\n */\r\n async toWindowPositionByLonLat(lon: number, lat: number): Promise<any> {\r\n const Cesium = this.Cesium;\r\n const scene = this.viewer.scene;\r\n\r\n // 1. 经纬度列表\r\n const positions = [Cesium.Cartographic.fromDegrees(lon, lat)];\r\n\r\n // 2. 使用 clampToHeightMostDetailed 获取真实地形高度\r\n let heightResult;\r\n try {\r\n heightResult = await scene.clampToHeightMostDetailed(positions);\r\n } catch (e) {\r\n console.warn('clampToHeightMostDetailed failed, fallback to ellipsoid height.');\r\n }\r\n\r\n let finalHeight = 0;\r\n if (heightResult && heightResult[0] && heightResult[0].height != null) {\r\n finalHeight = heightResult[0].height; // 用户偏好:height[0].height\r\n } else {\r\n // 如果地形未开启,则 fallback 椭球高度\r\n finalHeight = 0;\r\n }\r\n\r\n // 3. 生成真实位置 Cartesian3\r\n const worldPos = Cesium.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n\r\n // 4. 转屏幕像素坐标\r\n return this.toWindowCoordinates(worldPos);\r\n }\r\n\r\n /**\r\n * 坐标转换:经纬度 -> 屏幕像素坐标\r\n */\r\n toWindowCoordinates(position: any): any {\r\n const scene = this.viewer.scene;\r\n const st = this.Cesium.SceneTransforms;\r\n if (typeof st?.wgs84ToWindowCoordinates === 'function') {\r\n return st.wgs84ToWindowCoordinates(scene, position);\r\n }\r\n if (typeof st?.worldToWindowCoordinates === 'function') {\r\n return st.worldToWindowCoordinates(scene, position);\r\n }\r\n\r\n console.warn('No compatible window coordinate transform function found.');\r\n return undefined;\r\n }\r\n\r\n /**\r\n * 检查经纬度是否有效\r\n * @param lon 经度\r\n * @param lat 纬度\r\n * @returns 是否有效\r\n */\r\n private _isValidCoordinate(lon: number, lat: number): boolean {\r\n // 检查是否为 NaN\r\n if (Number.isNaN(lon) || Number.isNaN(lat)) return false;\r\n // 检查是否为 0(用户要求 0,0 时不显示)\r\n if (lon === 0 && lat === 0) return false;\r\n // 检查是否在有效范围内\r\n if (lon < -180 || lon > 180 || lat < -90 || lat > 90) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * 每帧刷新所有活跃标签的位置\r\n */\r\n private async _update() {\r\n for (const id of this.activeIds) {\r\n const label = this.labels.get(id);\r\n if (!label) continue;\r\n\r\n const lon = parseFloat(label.el.dataset.lon!);\r\n const lat = parseFloat(label.el.dataset.lat!);\r\n const height = parseFloat(label.el.dataset.height || '0');\r\n\r\n // 检查经纬度是否有效,无效则隐藏标签\r\n if (!this._isValidCoordinate(lon, lat)) {\r\n label.el.style.display = 'none';\r\n continue;\r\n }\r\n\r\n const position = this.Cesium.Cartesian3.fromDegrees(lon, lat, height);\r\n const screenPosition = this.toWindowCoordinates(position);\r\n\r\n if (this.Cesium.defined(screenPosition)) {\r\n const theme = this.themes[label.theme];\r\n const offset = theme.options?.offset || {};\r\n const offsetX = offset.x || 0;\r\n const offsetY = offset.y || 0;\r\n\r\n label.el.style.left = `${screenPosition.x}px`;\r\n label.el.style.top = `${screenPosition.y}px`;\r\n label.el.style.transform = `translate(${offsetX}px, ${offsetY}px)`;\r\n label.el.style.display = 'block';\r\n } else {\r\n label.el.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 销毁标签池,清理监听器和 DOM\r\n */\r\n destroy() {\r\n this.viewer.scene.postRender.removeEventListener(this._updateFn);\r\n // this.container.remove();\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n }\r\n}\r\n"],"names":["MarkerEventKey","MarkerEventBus","key","listener","overwrite","map","existed","name","data","e","err","DOM_EVENT_MAP","HtmlOverlayLabelPool","Cesium","viewer","containerId","eventBus","openWheel","id","container","themeName","options","lon","lat","height","theme","show","notCreateElement","style","themeOptions","label","el","domEvent","labelData","lastTime","event","dom","currTime","unload","items","ids","newData","filter","scene","positions","heightResult","finalHeight","worldPos","position","st","screenPosition","offset","offsetX","offsetY"],"mappings":"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"}