@v2x-three/cesium
Version:
V2X Cesium 核心库 - 基于Cesium的高性能地理可视化和车辆动画系统
410 lines (400 loc) • 10.5 kB
TypeScript
import * as Cesium from 'cesium';
export { Cesium };
declare class MockWebSocket {
constructor(url: any);
url: any;
readyState: 0;
onopen: any;
onmessage: any;
onclose: any;
onerror: any;
startSendingMockData(): void;
interval: NodeJS.Timeout | null | undefined;
generateMockRSMData(): {
msgType: string;
rsuId: string;
msgCnt: number;
timestamp: number;
refLongitude: number;
refLatitude: number;
refElevation: number;
uuid: string;
participants: {
ptcId: number;
ptcType: number;
sourceType: number;
ptcTimestamp: number;
longitude: number;
latitude: number;
elevation: number;
speed: number;
heading: number;
width: number;
length: number;
height: number;
vehicleClass: number;
fuelType: number;
transmission: number;
lonAccel: number;
latAccel: number;
vertAccel: number;
yawRate: number;
posConfidence: number;
spdConfidence: number;
headConfidence: number;
}[];
};
close(): void;
send(data: any): void;
}
declare namespace MockWebSocket {
let CONNECTING: number;
let OPEN: number;
let CLOSING: number;
let CLOSED: number;
}
/**
* 智能实体管理器
* 统一处理车辆、非机动车、行人的创建、更新和智能清理
*/
declare class EntityManager {
constructor(viewer: any);
viewer: any;
entities: Map<any, any>;
lastMessageIds: Set<any>;
stats: {
vehicleCount: number;
bicycleCount: number;
pedestrianCount: number;
rsuCount: number;
reservedCount: number;
totalEntities: number;
};
modelUrls: {
vehicle: string;
bicycle: string;
pedestrian: string;
};
realWorldDimensions: {
1: {
length: number;
width: number;
height: number;
scale: number;
modelHeight: number;
};
2: {
length: number;
width: number;
height: number;
scale: number;
modelHeight: number;
};
3: {
length: number;
width: number;
height: number;
scale: number;
modelHeight: number;
};
};
headingOffset: {
1: number;
2: number;
3: number;
};
/**
* 处理RSM参与者数据(主要入口)
*/
processParticipants(participants: any, timestamp: any): void;
/**
* 生成实体ID - 完全基于ptcId的唯一标识
*/
generateEntityId(participant: any): string;
/**
* 更新或创建实体
*/
updateEntity(entityId: any, participant: any, currentTime: any): void;
/**
* 创建实体
*/
createEntity(entityId: any, participant: any): any;
/**
* 更新实体位置和方向
*/
updateEntityTransform(entity: any, participant: any, position: any, currentTime: any): void;
/**
* 智能清理:删除不在当前消息中的实体 - 完全基于ptcId标识
*/
cleanupMissingEntities(currentMessageIds: any): void;
/**
* 更新统计信息
*/
updateStats(): void;
/**
* 如果是第一次有实体,飞到第一个实体位置
*/
flyToFirstEntityIfNeeded(participants: any): void;
/**
* 清除所有实体
*/
clearAllEntities(): void;
/**
* 获取统计信息
*/
getStats(): {
vehicleCount: number;
bicycleCount: number;
pedestrianCount: number;
rsuCount: number;
reservedCount: number;
totalEntities: number;
};
/**
* 获取基于ptcId的设备详细信息 - 用于调试和监控
*/
getDeviceInfo(): {
devices: any[];
totalCount: number;
devicesByType: any;
oldestDevice: number;
};
/**
* 检查是否存在指定ptcId的设备
*/
hasDevice(ptcId: any, ptcType: any): boolean;
/**
* 根据ptcId获取设备实体
*/
getDeviceByPtcId(ptcId: any, ptcType: any): any;
getEntityType(ptcType: any): "vehicle" | "bicycle" | "pedestrian" | "rsu" | "reserved";
getEntityTypeName(ptcType: any): "车辆" | "非机动车" | "行人" | "RSU" | "保留" | "未知";
/**
* 🎯 获取实体缩放比例 - 基于真实世界尺寸
* 确保在任何视角下都显示合理的大小
*/
getEntityScale(ptcType: any): number;
/**
* 🔍 获取最小像素尺寸 - 确保远距离可见性
*/
getMinimumPixelSize(ptcType: any): 10 | 15 | 20;
/**
* 📏 获取最大缩放比例 - 防止近距离过大
*/
getMaximumScale(ptcType: any): 15000 | 12000 | 10000 | 20000;
/**
* 📍 获取点标记大小 - 用于RSU等非3D模型实体
*/
getPointSize(ptcType: any): 15 | 20;
/**
* 🎨 获取点标记颜色 - 用于RSU等非3D模型实体
*/
getPointColor(ptcType: any): Cesium.Color;
getLabelFont(ptcType: any): "12px Arial" | "11px Arial" | "10px Arial";
getLabelColor(ptcType: any): Cesium.Color;
getLabelOffset(ptcType: any): Cesium.Cartesian2;
generateLabelText(participant: any, entityTypeName: any): string;
}
/**
* 🚀 高性能实体管理器 - 使用Cesium Primitive API优化渲染
* 修复版本:解决模型类型、性能卡顿和标签消失问题
*
* 🚀 性能优势:
* - 使用正确的模型URL配置
* - 减少不必要的异步操作
* - 添加插值和平滑移动
* - 修复标签显示系统
*/
interface PrimitiveEntityManagerStats {
totalEntities: number;
vehicleCount: number;
bicycleCount: number;
pedestrianCount: number;
memoryUsage: number;
lastUpdateTime: number;
createCount: number;
updateCount: number;
errorCount: number;
}
interface ModelConfig {
url: string;
scale: number;
minimumPixelSize: number;
maximumScale: number;
headingOffset: number;
}
interface Participant {
ptcId?: string;
id?: string;
ptcType?: number;
lon?: number;
longitude?: number;
lat?: number;
latitude?: number;
height?: number;
elevation?: number;
heading?: number;
pitch?: number;
roll?: number;
speed?: number;
}
interface EntityData {
model: Cesium.Model;
label: Cesium.Label;
ptcType: number;
lastUpdateTime: number;
targetPosition?: Cesium.Cartesian3;
targetHeading?: number;
isAnimating?: boolean;
}
declare class PrimitiveEntityManager {
viewer: Cesium.Viewer;
scene: Cesium.Scene;
primitiveCollection: Cesium.PrimitiveCollection;
labelCollection: Cesium.LabelCollection;
entities: Map<string, EntityData>;
stats: PrimitiveEntityManagerStats;
modelConfigs: Record<number, ModelConfig>;
lastMessageIds: Set<string>;
constructor(viewer: Cesium.Viewer);
/**
* 🏗️ 初始化集合
*/
private initialize;
/**
* 🚗 处理参与者数据 - 主要入口(同步处理,避免性能问题)
*/
processParticipants(participants: Participant[]): void;
/**
* 📝 生成实体ID
*/
private generateEntityId;
/**
* 🔄 更新或创建实体
*/
private updateEntity;
/**
* 🏗️ 创建新实体(同步创建,解决性能问题)
*/
private createEntity;
/**
* 🔧 更新实体位置和方向(添加平滑移动)
*/
private updateEntityTransform;
/**
* 🧹 清理不在当前消息中的实体
*/
private cleanupMissingEntities;
/**
* 🗑️ 移除实体
*/
private removeEntity;
/**
* 📊 更新统计信息
*/
private updateStats;
/**
* 💾 估算内存使用
*/
private estimateMemoryUsage;
/**
* 🧹 清除所有实体
*/
clearAllEntities(): void;
/**
* 📊 获取统计信息
*/
getStats(): PrimitiveEntityManagerStats;
/**
* 🔨 销毁管理器
*/
destroy(): void;
private getEntityTypeName;
private getLabelFont;
private getLabelColor;
private getLabelOffset;
private generateLabelText;
}
/**
* 优化的WebSocket管理器
* 集成RSM数据处理和智能回调机制
*/
declare class WebSocketManager {
constructor(config: any);
config: any;
ws: MockWebSocket | WebSocket | null;
reconnectAttempts: number;
reconnectTimer: NodeJS.Timeout | null;
isConnected: boolean;
callbacks: {
onConnectionChange: null;
onRSMData: null;
onStatsUpdate: null;
onError: null;
};
stats: {
messageCount: number;
participantCount: number;
lastMessageTime: null;
};
/**
* 设置回调函数
*/
setCallbacks(callbacks: any): void;
/**
* 连接WebSocket
*/
connect(): void;
/**
* 处理WebSocket消息
*/
handleMessage(event: any): void;
/**
* 处理RSM消息
*/
handleRSMMessage(rsmData: any): void;
/**
* 断开连接
*/
disconnect(): void;
/**
* 完全销毁WebSocketManager实例
* 调用此方法后,实例将无法再使用
*/
destroy(): void;
/**
* 切换模拟模式
*/
toggleMockMode(): any;
/**
* 安排重连
*/
scheduleReconnect(): void;
/**
* 触发连接状态变化回调
*/
triggerConnectionChange(status: any): void;
/**
* 触发错误回调
*/
triggerError(error: any): void;
/**
* 获取连接状态
*/
getConnectionStatus(): "connected" | "connecting" | "disconnected";
/**
* 获取统计信息
*/
getStats(): {
messageCount: number;
participantCount: number;
lastMessageTime: null;
};
}
declare function initViewer(options?: {}): Promise<Cesium.Viewer>;
declare class MousePosition {
constructor(viewer: any);
}
declare function modifyBuild(viewer: any): Promise<void>;
export { EntityManager, MockWebSocket, MousePosition, PrimitiveEntityManager, WebSocketManager, initViewer, modifyBuild };
export type { ModelConfig, Participant, PrimitiveEntityManagerStats };