149 lines
4.7 KiB
TypeScript
149 lines
4.7 KiB
TypeScript
import * as Cesium from 'cesium';
|
||
|
||
import { VIEWER_OPTIONS_FN } from '../helper/_VIEWER_OPTIONS';
|
||
import { configureCesium } from '../helper/configureCesium';
|
||
import { configureTimeLine } from '../helper/configureTimeLine';
|
||
|
||
// Cesium Ion Token 和全局配置,暂时保留在此处,也可考虑移至更全局的初始化位置
|
||
Cesium.Ion.defaultAccessToken = import.meta.env.VITE_CESIUM_ION_TOKEN;
|
||
Object.assign(globalThis, { Cesium });
|
||
configureCesium();
|
||
|
||
export class HCesiumManager {
|
||
viewer: Cesium.Viewer | null = null;
|
||
|
||
/**
|
||
* 初始化 Cesium Viewer。
|
||
* @param container - 用于承载 Cesium Viewer 的 DOM 元素或其 ID。
|
||
* @returns 返回创建的 Viewer 实例,如果失败则返回 null。
|
||
*/
|
||
init(container: ConstructorParameters<typeof Cesium.Viewer>[0]): Cesium.Viewer | null {
|
||
if (this.viewer) {
|
||
console.warn('Cesium Viewer 已初始化,请先销毁再重新初始化。');
|
||
return this.viewer;
|
||
}
|
||
|
||
try {
|
||
this.viewer = new Cesium.Viewer(container, VIEWER_OPTIONS_FN());
|
||
if (__DEV__) Object.assign(globalThis, { viewer: this.viewer });
|
||
|
||
configureTimeLine(this.viewer);
|
||
|
||
// 可以在这里添加其他 Viewer 级别的配置
|
||
this.viewer.scene.debugShowFramesPerSecond = true; // 例如 FPS 显示
|
||
|
||
console.log('Cesium Viewer 初始化成功。');
|
||
return this.viewer;
|
||
} catch (error) {
|
||
console.error('Cesium Viewer 初始化失败:', error);
|
||
this.viewer = null;
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 销毁 Cesium Viewer 实例。
|
||
*/
|
||
destroy(): void {
|
||
if (this.viewer && !this.viewer.isDestroyed()) {
|
||
try {
|
||
// 在销毁 Viewer 前,确保所有通过此 Manager 添加的实体或数据源已被移除
|
||
// (或者依赖各个子 Manager 在销毁前自行清理)
|
||
// this.viewer.entities.removeAll(); // 谨慎使用,可能会移除不应移除的实体
|
||
// this.viewer.dataSources.removeAll(true); // 谨慎使用
|
||
|
||
this.viewer.destroy();
|
||
console.log('Cesium Viewer 已销毁。');
|
||
} catch (error) {
|
||
console.error('销毁 Cesium Viewer 时出错:', error);
|
||
} finally {
|
||
this.viewer = null;
|
||
}
|
||
} else {
|
||
// console.log('Cesium Viewer 未初始化或已被销毁,无需再次销毁。');
|
||
this.viewer = null; // 确保 viewer 为 null
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 向 Viewer 添加一个实体。
|
||
* @param entity - 要添加的 Cesium 实体。
|
||
* @returns 返回添加的实体,如果 Viewer 未初始化则返回 null。
|
||
*/
|
||
addEntity(entity: Cesium.Entity): Cesium.Entity | null {
|
||
console.debug(`[HCesiumManager] 添加实体: ${entity.name}`);
|
||
if (!this.viewer) {
|
||
console.error('Viewer 未初始化,无法添加实体。');
|
||
return null;
|
||
}
|
||
try {
|
||
return this.viewer.entities.add(entity);
|
||
} catch (error) {
|
||
console.error('添加实体时出错:', error, entity);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 根据 ID 从 Viewer 移除一个实体。
|
||
* @param entityId - 要移除的实体的 ID。
|
||
* @returns 如果成功移除则返回 true,否则返回 false。
|
||
*/
|
||
removeEntityById(entityId: string): boolean {
|
||
if (!this.viewer) {
|
||
console.error('Viewer 未初始化,无法移除实体。');
|
||
return false;
|
||
}
|
||
try {
|
||
return this.viewer.entities.removeById(entityId);
|
||
} catch (error) {
|
||
console.error(`移除 ID 为 "${entityId}" 的实体时出错:`, error);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 根据实体对象从 Viewer 移除一个实体。
|
||
* @param entity - 要移除的实体对象。
|
||
* @returns 如果成功移除则返回 true,否则返回 false。
|
||
*/
|
||
removeEntity(entity: Cesium.Entity): boolean {
|
||
if (!this.viewer) {
|
||
console.error('Viewer 未初始化,无法移除实体。');
|
||
return false;
|
||
}
|
||
try {
|
||
return this.viewer.entities.remove(entity);
|
||
} catch (error) {
|
||
console.error('移除实体时出错:', error, entity);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 根据 ID 获取 Viewer 中的实体。
|
||
* @param entityId - 要获取的实体的 ID。
|
||
* @returns 返回找到的实体,如果未找到或 Viewer 未初始化则返回 undefined。
|
||
*/
|
||
getEntityById(entityId: string): Cesium.Entity | undefined {
|
||
if (!this.viewer) {
|
||
console.error('Viewer 未初始化,无法获取实体。');
|
||
return undefined;
|
||
}
|
||
try {
|
||
return this.viewer.entities.getById(entityId);
|
||
} catch (error) {
|
||
console.error(`获取 ID 为 "${entityId}" 的实体时出错:`, error);
|
||
return undefined;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取当前的 Cesium Viewer 实例。
|
||
* @returns 返回 Viewer 实例,如果未初始化则返回 null。
|
||
*/
|
||
getViewer(): Cesium.Viewer | null {
|
||
return this.viewer;
|
||
}
|
||
}
|