Skip to content

实体管理

提供作战实体建模、批量管理、事件通知等能力,支持模型/标签/公告板/轨迹/传感器等组件

概述

实体管理模块由三部分组成:

  • CombatEntity — 作战实体类,封装 Cesium Entity,以数据接口管理模型/标签等组件
  • EntityManager — 实体管理器,管理多个 CombatEntity 实例,提供增删查改和事件通知
  • viewerEntityMixin — Viewer 插件,通过 viewer.extend() 注入,挂载便捷方法

快速开始

typescript
import { CesiumViewer, viewerEntityMixin } from '@space-air/gis-cesium'

const airGis = new CesiumViewer('container')
const viewer = airGis.viewer

// 加载实体管理插件
viewer.extend(viewerEntityMixin)

// 创建作战实体
const entity = viewer.createEntity({
  name: 'F-22 猛禽',
  entityType: 'fighter',
  position: { x: -2350000, y: 4650000, z: 3660000 },
  model: { url: '/models/f22.glb', scale: 1 },
  label: { text: 'F-22', color: '#00ff00', font: '14px sans-serif' },
})

通过 EntityManager 直接使用

typescript
import { CesiumViewer, EntityManager } from '@space-air/gis-cesium'

const airGis = new CesiumViewer('container')
const manager = new EntityManager({ viewer: airGis.viewer })

const entity = manager.create({
  name: '预警机',
  entityType: 'fighter',
  position: { x: -2350000, y: 4650000, z: 3660000 },
})

CombatEntity 详解

实体类型

枚举值说明
'fighter'战斗机
'ship'舰船
'vehicle'地面车辆
'missile'导弹
'satellite'卫星
'radar'雷达站
'base'基地
'other'其他

组件接口

模型组件 CombatModelOptions

参数类型默认值描述
urlstring-模型文件 URL(.glb/.gltf)
scalenumber-模型缩放比例

标签组件 CombatLabelOptions

参数类型默认值描述
textstring-标签文字
colorstring-文字颜色(CSS 颜色值)
fontstring-字体(如 '14px sans-serif'

公告板组件 CombatBillboardOptions

参数类型默认值描述
urlstring-图标图片 URL
scalenumber-缩放比例
colorstring-着色颜色

轨迹组件 CombatTrajectoryOptions

参数类型默认值描述
colorstring-轨迹颜色
widthnumber-轨迹线宽

传感器组件 CombatSensorOptions

参数类型默认值描述
type'cone' | 'pyramid' | 'hemisphere' | 'custom'-传感器形状
radiusnumber-传感器范围半径(米)
colorstring-传感器颜色

朝向组件 CombatOrientationOptions

参数类型默认值描述
headingnumber-偏航角(度)
pitchnumber-俯仰角(度)
rollnumber-翻滚角(度)

CombatEntity 属性与方法

名称类型描述
idstring (readonly)实体唯一标识
namestring (readonly)实体名称
entityTypeCombatEntityType | undefined实体类型
entityCesium.Entity (readonly)底层 Cesium Entity
position{x,y,z} | undefined笛卡尔坐标
orientationCombatOrientationOptions | undefined实体朝向
sync()void手动同步所有组件
destroy()void销毁实体
show() / hide()void显示/隐藏
setShow(show)void设置显隐

EntityManager API

查询

方法返回描述
get(id)CombatEntity | undefined按 ID 获取
getAll()CombatEntity[]获取所有
getByType(type)CombatEntity[]按类型过滤
getByName(name)CombatEntity[]按名称搜索
count()number实体数量

操作

方法返回描述
create(data)CombatEntity创建并添加
add(entity)void添加已有实体
remove(id)boolean移除指定实体
removeAll()void移除所有
show(id)void显示实体
hide(id)void隐藏实体
toggle(id)void切换显隐
update(id, changes)void部分更新
clone(id, newId?)CombatEntity | undefined克隆实体
createBatch(list)CombatEntity[]批量创建
destroy()void销毁所有并清理

事件系统

typescript
const off = manager.on((event) => {
  console.log(event.type, event.entity.name)
})

// 取消监听
off()

事件类型:'add' | 'remove' | 'show' | 'hide' | 'update'

viewerEntityMixin 插件

typescript
viewer.extend(viewerEntityMixin)

// 1. 实体管理器实例
const manager = viewer.entityManager

// 2. 快速创建实体
const entity = viewer.createEntity({ name: '目标', ... })

使用案例

案例1:创建多种类型的实体

typescript
viewer.extend(viewerEntityMixin)

// 战斗机(带模型和标签)
const fighter = viewer.createEntity({
  name: '歼-20',
  entityType: 'fighter',
  position: { x: -2350000, y: 4650000, z: 3660000 },
  model: { url: '/models/j20.glb', scale: 1 },
  label: { text: '歼-20', color: '#ff4444' },
})

// 卫星(带标签和轨迹)
const satellite = viewer.createEntity({
  name: '遥感卫星',
  entityType: 'satellite',
  position: { x: -7000000, y: 0, z: 0 },
  label: { text: '卫星-01', color: '#44aaff' },
  trajectory: { color: '#44aaff', width: 2 },
})

案例2:实体搜索与批量操作

typescript
const fighters = manager.getByType('fighter')
manager.getAll().forEach(e => e.hide())
manager.getByType('satellite').forEach(e => e.show())
console.log('实体总数:', manager.count())

案例3:事件监听与响应

typescript
const off = manager.on(({ type, entity, changes }) => {
  switch (type) {
    case 'add': console.log(`新增: ${entity.name}`); break
    case 'remove': console.log(`移除: ${entity.name}`); break
    case 'update': console.log(`更新: ${entity.name}`, changes); break
  }
})

注意事项

  • 位置使用 {x, y, z} 笛卡尔坐标格式
  • 模型 URL 建议放在 public/ 目录下
  • destroy() 会从 viewer 的 entity collection 中移除实体,移除后不可复用
  • 事件监听器发生错误不会影响其他监听器
  • EntityManager.update() 采用浅合并方式更新组件