import * as Cesium from 'cesium'; import type { HCesiumManager } from './HCesiumManager'; import type { I站点 } from './HCesiumManager.types'; export class HCesiumStationManager { private viewerManager: HCesiumManager; // 用于存储当前由此管理器管理的地面站实体的 Map private currentStationEntities: Map = new Map(); constructor(viewerManager: HCesiumManager) { this.viewerManager = viewerManager; } /** * 向视图中添加或更新地面站实体。 * 注意:当前实现仅添加,如果已存在则警告并返回现有实体。 */ addOrUpdateStation(options: I站点): undefined { const existingEntity = this.currentStationEntities.get(options.id); if (existingEntity) { console.warn(`ID 为 "${options.id}" 的地面站实体已由管理器追踪,跳过添加。`); return; } // 解构赋值获取站点信息 const { height = 0, id, latitude, longitude, name, pixelSize = 10 } = options; const position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height); const stationEntity = this._createStationEntity(id, name, position, pixelSize); const addedEntity = this.viewerManager.addEntity(stationEntity); if (addedEntity) { this.currentStationEntities.set(id, addedEntity); // 添加成功后,将其存入 Map } else { console.error(`通过 ViewerManager 添加 ID 为 "${id}" 的地面站实体失败。`); } } /** * 创建地面站点的 Cesium 实体对象。 * 这是一个内部辅助方法,封装了实体创建的细节。 */ private _createStationEntity( id: string, name: string, position: Cesium.Cartesian3, pixelSize: number, ): Cesium.Entity { return new Cesium.Entity({ id, // 使用传入的 id 作为实体的唯一标识符 name, position, point: { pixelSize, color: Cesium.Color.fromRandom({ alpha: 1 }), // 确保 alpha 为 1 outlineColor: Cesium.Color.WHITE, outlineWidth: 2, }, label: { text: name, font: '14pt sans-serif', style: Cesium.LabelStyle.FILL_AND_OUTLINE, outlineWidth: 2, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, pixelOffset: new Cesium.Cartesian2(0, -12), // 标签略微偏移到点的上方 }, }); } /** * 从视图中移除指定的地面站实体 (通过 ID)。 */ removeStation(entityId: string): boolean { const entityToRemove = this.currentStationEntities.get(entityId); if (!entityToRemove) { // console.warn(`未在 GroundStationManager 中找到 ID 为 "${entityId}" 的实体,无法移除。`); return false; // 不在管理范围内 } const removed = this.viewerManager.removeEntity(entityToRemove); // 优先使用实体对象移除 if (removed) { // 移除成功后,从 Map 中删除 this.currentStationEntities.delete(entityId); return true; } else { console.warn(`尝试通过 ViewerManager 移除 ID 为 "${entityId}" 的地面站实体失败。`); // 即使 ViewerManager 移除失败,也尝试从内部 Map 中移除,以保持一致性? // 或者保留在 Map 中以供调试?暂时选择移除。 this.currentStationEntities.delete(entityId); return false; } } /** * 清除所有由此管理器管理的地面站实体。 */ clearAllStations(): void { // 迭代 Map 的 ID 进行移除,避免在迭代 Map 值时修改 Map const idsToRemove = [...this.currentStationEntities.keys()]; let removalFailed = false; for (const id of idsToRemove) { if (!this.removeStation(id)) { removalFailed = true; // 记录是否有移除失败的情况 } } if (removalFailed) { console.warn('清除部分地面站实体时遇到问题。'); } // 确保最终清空 Map this.currentStationEntities.clear(); } /** * 获取当前管理的地面站实体 Map。 * @returns 返回包含当前地面站实体的 Map。 */ getCurrentStationEntities(): Map { return this.currentStationEntities; } /** * 销毁管理器,清理资源。 */ destroy(): void { this.clearAllStations(); } }