Files
vue-ts-example/src/components/h-cesium-viewer/managers/HCesiumManager.ts

149 lines
4.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}