cesium-multi-target-framework 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +474 -0
- package/dist/assets/renderWorker-118e8f3b.js +1 -0
- package/dist/cesium-multi-target-framework.js +4605 -0
- package/dist/cesium-multi-target-framework.umd.cjs +101 -0
- package/dist/cluster/QuadCluster.d.ts +66 -0
- package/dist/cluster/clusterClient.d.ts +44 -0
- package/dist/cluster/clusterWorker.d.ts +1 -0
- package/dist/config/types.d.ts +266 -0
- package/dist/core/EventEmitter.d.ts +9 -0
- package/dist/core/MultiTargetFramework.d.ts +184 -0
- package/dist/core/MultiTargetScene.d.ts +224 -0
- package/dist/data/types.d.ts +67 -0
- package/dist/events/bus.d.ts +336 -0
- package/dist/index.d.ts +22 -0
- package/dist/render/AirGroundReferenceRenderer.d.ts +20 -0
- package/dist/render/InstancedGltfBatch.d.ts +37 -0
- package/dist/render/InstancedSymbolRenderer.d.ts +65 -0
- package/dist/render/LowModelInstancedRenderer.d.ts +39 -0
- package/dist/render/ModelPoolRenderer.d.ts +43 -0
- package/dist/render/PointCloudRenderer.d.ts +135 -0
- package/dist/render/SelectionOverlayRenderer.d.ts +37 -0
- package/dist/render/targetVisualMetrics.d.ts +9 -0
- package/dist/site/SiteLayer.d.ts +43 -0
- package/dist/site/SiteLowModelRenderer.d.ts +12 -0
- package/dist/site/SiteSpatialIndex.d.ts +10 -0
- package/dist/site/types.d.ts +72 -0
- package/dist/track/TrackHoverPicker.d.ts +26 -0
- package/dist/track/TrackManager.d.ts +42 -0
- package/dist/track/TrackRenderer.d.ts +29 -0
- package/dist/track/types.d.ts +27 -0
- package/dist/worker/protocol.d.ts +182 -0
- package/dist/worker/renderWorker.d.ts +1 -0
- package/doc//345/244/232/347/233/256/346/240/207/344/274/230/345/214/226/344/270/216/351/242/204/346/265/213/346/270/262/346/237/223/350/257/264/346/230/216.md +186 -0
- package/doc//345/244/232/347/273/204/344/273/266/344/272/213/344/273/266/346/226/271/346/241/210.md +410 -0
- package/doc//345/257/271/345/244/226/346/216/245/345/217/243/350/257/264/346/230/216.md +519 -0
- package/doc//345/267/245/344/275/234/350/256/241/345/210/222.md +59 -0
- package/doc//346/270/262/346/237/223/344/270/232/345/212/241/351/200/273/350/276/221.md +202 -0
- package/doc//347/253/231/347/202/271/346/270/262/346/237/223/344/270/216/345/217/263/351/224/256/350/217/234/345/215/225/345/256/236/347/216/260/350/257/264/346/230/216.md +49 -0
- package/doc//350/247/206/345/217/243/351/251/261/345/212/250/346/225/260/346/215/256/346/265/201/347/250/213/344/277/256/346/224/271/350/256/241/345/210/222.md +69 -0
- package/doc//351/241/271/347/233/256/350/257/264/346/230/216/344/271/246.md +729 -0
- package/package.json +51 -0
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
# 对外接口说明
|
|
2
|
+
|
|
3
|
+
本文档按 `src/index.ts` 的包根入口整理当前对外能力,适用于从 `cesium-multi-target-framework` 接入的业务方。
|
|
4
|
+
|
|
5
|
+
## 一、包根导出
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import {
|
|
9
|
+
Viewer,
|
|
10
|
+
MultiTargetFramework,
|
|
11
|
+
createMultiTargetFramework,
|
|
12
|
+
SiteLayer,
|
|
13
|
+
TrackManager,
|
|
14
|
+
createQuadClusterer,
|
|
15
|
+
clusterProgressive,
|
|
16
|
+
lonLatToLocalPlane,
|
|
17
|
+
createClusterWorkerClient,
|
|
18
|
+
bindFrameworkEventBus,
|
|
19
|
+
bindSiteLayerEventBus,
|
|
20
|
+
getFrameworkEventBus,
|
|
21
|
+
} from "cesium-multi-target-framework";
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
包根导出分为七类:
|
|
25
|
+
|
|
26
|
+
| 类别 | 导出 |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| Cesium | `export * from "cesium"`,可直接导入 `Viewer`、`Cartesian3` 等 Cesium API |
|
|
29
|
+
| 高层目标框架 | `MultiTargetFramework`、`createMultiTargetFramework` |
|
|
30
|
+
| 底层目标场景 | `MultiTargetScene` |
|
|
31
|
+
| 轨迹和站点 | `TrackManager`、`SiteLayer` |
|
|
32
|
+
| Web Event Bus | `bindFrameworkEventBus`、`bindSiteLayerEventBus`、`getFrameworkEventBus`、`tryGetFrameworkEventBus`、`createFrameworkEventBus` |
|
|
33
|
+
| 聚类工具 | `createQuadClusterer`、`clusterProgressive`、`lonLatToLocalPlane`、`createClusterWorkerClient` |
|
|
34
|
+
| 常量 | `VERSION`、`DEFAULT_LOD`、`DEFAULT_POOL`、`DEFAULT_ANIMATED_POOL`、`DEFAULT_SCENE`、`TARGET_DOMAINS` |
|
|
35
|
+
|
|
36
|
+
常用类型包括:`TargetData`、`StandardTargetData`、`TrackPoint`、`IncrementalPayload`、`PackedTargetData`、`SceneConfig`、`MultiTargetFrameworkOptions`、`MultiTargetTypeConfig`、`TargetSnapshot`、`ContextMenuContext`、`SiteData`、`SiteLayerOptions`、`TrackRecord`、`ClusterWorkerClient`、`FrameworkEventBus`、`FrameworkBusActionMap`、`FrameworkBusEventMap` 等。
|
|
37
|
+
|
|
38
|
+
## 二、高层入口 `MultiTargetFramework`
|
|
39
|
+
|
|
40
|
+
推荐业务优先使用该入口。它不改写原始 `Viewer`,而是在内部持有 `scene`、`viewer`、`tracks`。
|
|
41
|
+
|
|
42
|
+
### 创建
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
const framework = new MultiTargetFramework(viewer, {
|
|
46
|
+
targetTypes: [
|
|
47
|
+
{
|
|
48
|
+
type: "ship",
|
|
49
|
+
name: "船舶",
|
|
50
|
+
iconPath: "/icons/target-ship-mask.png",
|
|
51
|
+
defaultColor: "#25e65c",
|
|
52
|
+
smoothMove: true,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
scene: {
|
|
56
|
+
data: { commitIntervalMs: 2000, leading: true, worker: true },
|
|
57
|
+
merge: { enabled: true, maxVisible: 30000 },
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// 等价工厂(异步:等引擎就绪后 resolve)
|
|
62
|
+
const framework2 = await createMultiTargetFramework(viewer, options);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`MultiTargetFramework` 内部会启动一个 Web Worker,构造函数同步返回时引擎尚未就绪。需要「初始化完成后再加载依赖底座的其它组件」时,有两种等价写法:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
// 写法一:同步 new,可立即挂事件/调方法,需要就绪时再 await
|
|
69
|
+
const framework = new MultiTargetFramework(viewer, options);
|
|
70
|
+
framework.scene.on("perf", console.log);
|
|
71
|
+
await framework.ready; // 引擎(Worker 握手)就绪
|
|
72
|
+
loadOtherComponents(framework);
|
|
73
|
+
|
|
74
|
+
// 写法二:异步工厂,拿到的实例已就绪
|
|
75
|
+
const framework3 = await MultiTargetFramework.create(viewer, options);
|
|
76
|
+
loadOtherComponents(framework3);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
> `ready` 只等引擎就绪(Worker init 握手完成);glTF 模型按需懒加载,不纳入就绪范围。
|
|
80
|
+
|
|
81
|
+
`MultiTargetFrameworkOptions`:
|
|
82
|
+
|
|
83
|
+
| 字段 | 说明 |
|
|
84
|
+
| --- | --- |
|
|
85
|
+
| `targetTypes` | 必填,目标类型数组 |
|
|
86
|
+
| `scene` | 可选,除 `nodeTypes` 之外的 `SceneConfig` |
|
|
87
|
+
|
|
88
|
+
`MultiTargetTypeConfig` 重点字段:`type`、`name`、`targetDomain`、`iconPath`、`defaultColor`、`highModel`、`lowModel`、`highModelUrl`、`lowModelUrl`、`scale`、`modelHeadingOffset`、`modelPitchOffset`、`modelRollOffset`、`smoothMove`、`smoothMoveMinCameraHeight`、`smoothMoveDurationMs`、`predict`、`predictMove`、`predictMinCameraHeight`、`predictSeconds`、`predictFitSeconds`。
|
|
89
|
+
|
|
90
|
+
### 数据方法
|
|
91
|
+
|
|
92
|
+
| 方法 | 说明 |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| `setData(targets)` | `setTargetData` 的别名,全量替换目标数据 |
|
|
95
|
+
| `upsert(targets)` | `upsertTargetData` 的别名,增量新增或更新 |
|
|
96
|
+
| `remove(ids)` | `removeTargetData` 的别名,按 id 删除 |
|
|
97
|
+
| `addTarget(target)` | 校验并实时 upsert 单目标,返回校验后的目标 |
|
|
98
|
+
| `updateTarget(target)` | 校验并实时 upsert 单目标,返回校验后的目标 |
|
|
99
|
+
| `setTargetData(targets)` | 全量替换目标数据 |
|
|
100
|
+
| `upsertTargetData(targets)` | 增量新增或更新目标数据 |
|
|
101
|
+
| `removeTargetData(ids)` | 实时删除目标 |
|
|
102
|
+
| `applyTargetIncremental(payload)` | 应用 `{ upserts, removes }` 增量包 |
|
|
103
|
+
|
|
104
|
+
`MultiTargetFramework` 会校验目标字段,只允许 `id`、`type`、`lon`、`lat`、`height`、`speedH`、`speedV`、`heading`、`renderColor`、`openAnimate`、`animateType`、`animateColor`、`nationality`、`customInfo`、`track`、`secrecy`、`extra`。
|
|
105
|
+
|
|
106
|
+
### 样式和显示
|
|
107
|
+
|
|
108
|
+
| 方法 | 说明 |
|
|
109
|
+
| --- | --- |
|
|
110
|
+
| `setTargetColor(id, color, options?)` | 设置单个或多个目标颜色,颜色格式 `#RRGGBB` 或 `#RRGGBBAA` |
|
|
111
|
+
| `setTargetGlow(id, enabled, color?, options?)` | 开关发光动画 |
|
|
112
|
+
| `hideTarget(id, options?)` | 隐藏目标 |
|
|
113
|
+
| `showTarget(id, options?)` | 显示目标 |
|
|
114
|
+
| `disappearTarget(id, options?)` | `hideTarget` 别名 |
|
|
115
|
+
| `appearTarget(id, options?)` | `showTarget` 别名 |
|
|
116
|
+
| `setNameplateConfig(config)` | 动态更新名称牌/标签配置 |
|
|
117
|
+
|
|
118
|
+
`id` 可传字符串或字符串数组。`TargetStyleOptions.clearBefore` 默认 `true`,表示本次样式补丁会先清理旧同类样式;`clearBefor` 为兼容旧拼写。
|
|
119
|
+
|
|
120
|
+
### 选择、框选和定位
|
|
121
|
+
|
|
122
|
+
| 方法 | 说明 |
|
|
123
|
+
| --- | --- |
|
|
124
|
+
| `selectTarget(id, options?)` | 选中目标,返回 `TargetSnapshot | null` |
|
|
125
|
+
| `selectTargets(ids, options?)` | 批量选中目标,返回存在的快照数组 |
|
|
126
|
+
| `unselectTarget(id)` | 取消单目标选中 |
|
|
127
|
+
| `clearSelection()` | 清空选中和框选状态 |
|
|
128
|
+
| `boxTarget(id, enabled?, options?)` | 设置黄色框选覆盖层,`enabled` 默认 `true` |
|
|
129
|
+
| `unboxTarget(id, options?)` | 取消框选 |
|
|
130
|
+
| `locateTarget(id, options?)` | 飞行定位目标,返回目标快照 |
|
|
131
|
+
|
|
132
|
+
`LocateTargetOptions`:
|
|
133
|
+
|
|
134
|
+
| 字段 | 默认 | 说明 |
|
|
135
|
+
| --- | --- | --- |
|
|
136
|
+
| `range` | `18000` | 相机离目标距离,单位米 |
|
|
137
|
+
| `height` | - | 兼容旧字段,低优先级 |
|
|
138
|
+
| `duration` | `0.8` | 飞行时间,秒 |
|
|
139
|
+
| `pitch` | `-65` | 俯仰角,度 |
|
|
140
|
+
| `heading` | `0` | 航向角,度 |
|
|
141
|
+
|
|
142
|
+
### 右键菜单
|
|
143
|
+
|
|
144
|
+
| 方法 | 说明 |
|
|
145
|
+
| --- | --- |
|
|
146
|
+
| `registerContextMenuItem(item)` | 注册菜单项,返回注销函数 |
|
|
147
|
+
| `showContextMenu(ctx)` | 使用统一菜单 DOM 展示上下文 |
|
|
148
|
+
| `closeContextMenu()` | 关闭菜单 |
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
const dispose = framework.registerContextMenuItem({
|
|
152
|
+
key: "locate",
|
|
153
|
+
label: "定位",
|
|
154
|
+
targetKinds: ["target", "site"],
|
|
155
|
+
order: 10,
|
|
156
|
+
visible: (ctx) => ctx.target.kind !== "ground",
|
|
157
|
+
onClick: async (ctx) => {
|
|
158
|
+
if (ctx.target.kind === "target") await ctx.framework.locateTarget(ctx.target.id);
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`ContextMenuContext.target.kind` 支持:
|
|
164
|
+
|
|
165
|
+
| kind | 数据 |
|
|
166
|
+
| --- | --- |
|
|
167
|
+
| `"target"` | `id`、`type`、`data: TargetSnapshot` |
|
|
168
|
+
| `"ground"` | `lon`、`lat`、`height` |
|
|
169
|
+
| `"site"` | `id`、`siteType`、`data?` |
|
|
170
|
+
|
|
171
|
+
### 生命周期
|
|
172
|
+
|
|
173
|
+
| 方法 | 说明 |
|
|
174
|
+
| --- | --- |
|
|
175
|
+
| `destroy()` | 销毁菜单 DOM、事件监听、底层场景和 worker |
|
|
176
|
+
| `MultiTargetFramework.create(viewer, options)` | 静态异步工厂,构造后等 `ready` 就绪再 resolve,返回 `Promise<MultiTargetFramework>` |
|
|
177
|
+
|
|
178
|
+
## 三、底层入口 `MultiTargetScene`
|
|
179
|
+
|
|
180
|
+
`MultiTargetScene` 更接近渲染引擎本体,适合需要 packed 数据、底层事件或自定义封装的场景。高层 `MultiTargetFramework.scene` 即为此实例。
|
|
181
|
+
|
|
182
|
+
### 属性
|
|
183
|
+
|
|
184
|
+
| 属性 | 说明 |
|
|
185
|
+
| --- | --- |
|
|
186
|
+
| `config` | 解析后的 `ResolvedConfig` |
|
|
187
|
+
| `render` | 点云/图标渲染器 |
|
|
188
|
+
| `models` | 低模/高模模型池渲染器 |
|
|
189
|
+
| `symbols` | 可选,地表实例化有向符号渲染器 |
|
|
190
|
+
| `selection` | 选中覆盖层渲染器 |
|
|
191
|
+
| `tracks` | `TrackManager` |
|
|
192
|
+
| `nodes` | `SceneNodeStats` 渲染统计 |
|
|
193
|
+
| `quality` | 当前质量档,当前固定为 `{ tier: "high" }` |
|
|
194
|
+
| `targetCount` | 当前 worker 内目标总数 |
|
|
195
|
+
|
|
196
|
+
### 数据和渲染方法
|
|
197
|
+
|
|
198
|
+
| 方法 | 说明 |
|
|
199
|
+
| --- | --- |
|
|
200
|
+
| `setData(targets)` | 全量目标数据 |
|
|
201
|
+
| `applyIncremental(payload)` | 增量目标数据 |
|
|
202
|
+
| `applyRealtimeUpsert(targets)` | 实时 upsert,不走周期提交等待 |
|
|
203
|
+
| `applyRealtimeRemove(ids)` | 实时删除 |
|
|
204
|
+
| `applyPacked(payload)` | 提交 typed array packed 数据,适合大批量高频输入 |
|
|
205
|
+
| `applyTargetStyle(patches)` | 底层样式补丁 |
|
|
206
|
+
| `setBoxedTargetIds(ids)` | 设置框选 id 集合 |
|
|
207
|
+
| `setLabelConfig(config)` | 更新标签配置 |
|
|
208
|
+
| `flushNow()` | 立即提交当前 staged 数据 |
|
|
209
|
+
| `pause()` | 暂停提交和视口刷新 |
|
|
210
|
+
| `resume()` | 恢复并刷新视口 |
|
|
211
|
+
| `destroy()` | 销毁 worker、渲染器、事件和选择状态 |
|
|
212
|
+
|
|
213
|
+
### 查询和交互方法
|
|
214
|
+
|
|
215
|
+
| 方法 | 说明 |
|
|
216
|
+
| --- | --- |
|
|
217
|
+
| `selectTarget(id, clearBefore?)` | 选中目标,返回 `PickedNodeLike | null` |
|
|
218
|
+
| `selectTargets(ids, clearBefore?)` | 批量选中,返回命中的目标数组 |
|
|
219
|
+
| `unselectTarget(id)` | 取消选中 |
|
|
220
|
+
| `clearSelection(emit?)` | 清空选择,`emit` 默认 `true` |
|
|
221
|
+
| `getTargetSnapshot(id)` | 从 worker 查询目标逻辑快照 |
|
|
222
|
+
| `getRenderedTargetFrame(id, result?)` | 查询当前实际渲染帧位置和航向 |
|
|
223
|
+
| `getRenderedTargetPosition(id, result?)` | 查询当前 render packet 中的渲染坐标 |
|
|
224
|
+
|
|
225
|
+
### 事件
|
|
226
|
+
|
|
227
|
+
`MultiTargetScene` 继承 `EventEmitter`,使用 `scene.on(event, handler)` 监听,返回取消监听函数。
|
|
228
|
+
|
|
229
|
+
| 事件 | 载荷 |
|
|
230
|
+
| --- | --- |
|
|
231
|
+
| `perf` | 输入、worker、渲染慢帧等性能事件 |
|
|
232
|
+
| `dirty` | `{ added, updated, removed }` 普通 diff |
|
|
233
|
+
| `packedDirty` | packed diff |
|
|
234
|
+
| `pick` | `PickedNodeLike | null` |
|
|
235
|
+
| `hover` | `PickedNodeLike | null` |
|
|
236
|
+
| `selection` | `PickedNodeLike[]` |
|
|
237
|
+
| `contextmenu` | 目标或空地右键上下文 |
|
|
238
|
+
|
|
239
|
+
## 四、目标数据类型
|
|
240
|
+
|
|
241
|
+
`TargetData` / `StandardTargetData`:
|
|
242
|
+
|
|
243
|
+
| 字段 | 必填 | 说明 |
|
|
244
|
+
| --- | --- | --- |
|
|
245
|
+
| `id` | 是 | 唯一 id |
|
|
246
|
+
| `type` | 是 | 目标类型,必须命中配置 |
|
|
247
|
+
| `lon` / `lat` / `height` | 是 | WGS84 经纬度和高度 |
|
|
248
|
+
| `speedH` / `speedV` | 是 | 水平/垂直速度,m/s |
|
|
249
|
+
| `heading` | 是 | 航向角,度,正北 0 顺时针 |
|
|
250
|
+
| `renderColor` | 否 | `#RRGGBB` 或 `#RRGGBBAA` |
|
|
251
|
+
| `openAnimate` | 否 | 是否开启动画 |
|
|
252
|
+
| `animateType` | 否 | 当前内置支持 `glow` / `发光` |
|
|
253
|
+
| `animateColor` | 否 | 动画颜色 |
|
|
254
|
+
| `nationality` | 否 | 国籍/归属字符串 |
|
|
255
|
+
| `customInfo` | 否 | 自定义信息对象,可用于名称牌字段 |
|
|
256
|
+
| `track` | 否 | `TrackPoint[]` |
|
|
257
|
+
| `secrecy` | 否 | 密级(预留字段,当前仅透传,未参与聚合/合并逻辑) |
|
|
258
|
+
| `extra` | 否 | 额外内部/业务状态 |
|
|
259
|
+
|
|
260
|
+
`PackedTargetData` 用 typed array 表示大批量数据:`lon`、`lat` 必填;`ids`、`types`、`height`、`speedH`、`speedV`、`heading`、`secrecy`、`renderColor`、`animate`、`animateColor`、`removes` 可选。
|
|
261
|
+
|
|
262
|
+
## 五、配置速查
|
|
263
|
+
|
|
264
|
+
| 配置 | 当前默认 | 说明 |
|
|
265
|
+
| --- | --- | --- |
|
|
266
|
+
| `lod.pointAbove` | `150000` | 高于此高度走点模式 |
|
|
267
|
+
| `lod.animatedBelow` | `10000` | 低于此高度允许高模动画 |
|
|
268
|
+
| `pool.size` | `30000` | 通用目标池容量 |
|
|
269
|
+
| `animatedPool.size` | `64` | 高模动画容量 |
|
|
270
|
+
| `updateFps` | `30` | 渲染/刷新频率 |
|
|
271
|
+
| `predictSeconds` | `10` | 预测窗口秒数 |
|
|
272
|
+
| `predictFitSeconds` | `2` | 新权威数据到达后的拟合秒数 |
|
|
273
|
+
| `fadeMs` | `350` | 显隐淡入淡出时间 |
|
|
274
|
+
| `masterHideHeight` | `150000` | 高于此高度隐藏模型内容 |
|
|
275
|
+
| `merge.mode` | `"global"` | 聚合模式 |
|
|
276
|
+
| `merge.maxVisible` | `pool.size` | 最大渲染目标数 |
|
|
277
|
+
| `merge.globalRootLimit` | `500` | global 顶层根聚合数量上限 |
|
|
278
|
+
| `merge.globalMaxLevels` | `64` | global 最大层级 |
|
|
279
|
+
| `merge.globalRebuildIntervalMs` | `300000` | global 缓存重建间隔 |
|
|
280
|
+
| `merge.globalViewportHeight` | `450000` | 高于此高度按全球视口处理 |
|
|
281
|
+
| `merge.cameraMergeBaseHeight` | `100000` | 低于/等于该高度不随相机增加合并半径 |
|
|
282
|
+
| `merge.cameraMergeStepHeight` | `10000` | 相机高度每增一档的高度 |
|
|
283
|
+
| `merge.cameraMergeStepRadius` | `100` | 每档半径增量 |
|
|
284
|
+
| `pick.enabled` | `true` | 是否启用点击拾取 |
|
|
285
|
+
| `pick.pixelThreshold` | `20` | 拾取像素阈值 |
|
|
286
|
+
| `pick.hover` | `true` | 是否启用 hover |
|
|
287
|
+
| `cull.viewportBufferRatio` | `0.15` | 视口缓冲比例 |
|
|
288
|
+
| `label.enabled` | `true` | 是否显示名称牌 |
|
|
289
|
+
| `label.maxCount` | `200` | 名称牌最多显示数量 |
|
|
290
|
+
| `label.maxCameraHeight` | `5000` | 名称牌最大相机高度 |
|
|
291
|
+
| `frame.maxLowModelRenderItems` | `3000` | 低模后端数量上限 |
|
|
292
|
+
| `frame.maxModelRenderItems` | `2000` | 旧兼容项 |
|
|
293
|
+
| `data.commitIntervalMs` | `2000` | 数据提交周期 |
|
|
294
|
+
| `data.leading` | `true` | 首批数据是否立即提交 |
|
|
295
|
+
| `data.worker` | `true` | 数据处理是否使用 worker |
|
|
296
|
+
| `groundSymbols` | `false` | 点档单目标是否用地表实例化有向符号 |
|
|
297
|
+
| `groundSymbolPixelSize` | `30` | 地表符号像素大小 |
|
|
298
|
+
|
|
299
|
+
## 六、轨迹 `TrackManager`
|
|
300
|
+
|
|
301
|
+
可通过 `framework.tracks` 或 `scene.tracks` 使用。
|
|
302
|
+
|
|
303
|
+
| 方法 | 说明 |
|
|
304
|
+
| --- | --- |
|
|
305
|
+
| `on("hover", handler)` | 监听轨迹点 hover,载荷为 `TrackHoverInfo | null` |
|
|
306
|
+
| `setTracks(tracks)` | 新增或更新轨迹 |
|
|
307
|
+
| `getTracks(targetIds?)` | 查询轨迹,返回拷贝 |
|
|
308
|
+
| `showTracks(targetIds)` | 显示轨迹 |
|
|
309
|
+
| `hideTracks(targetIds)` | 隐藏轨迹 |
|
|
310
|
+
| `removeTracks(targetIds)` | 删除指定轨迹 |
|
|
311
|
+
| `clearTracks()` | 清空轨迹 |
|
|
312
|
+
|
|
313
|
+
`TrackRecord` 支持 `pointList` 或 `trackLine`。`trackLine` 格式为 `LINESTRING (...)` 或 `LINESTRING Z (...)`。
|
|
314
|
+
|
|
315
|
+
## 七、站点层 `SiteLayer`
|
|
316
|
+
|
|
317
|
+
站点层独立于目标系统,用于光电、雷达、AIS 等固定站点图标/低模展示。
|
|
318
|
+
|
|
319
|
+
```ts
|
|
320
|
+
const siteLayer = new SiteLayer(viewer, {
|
|
321
|
+
modelSwitchHeight: 8000,
|
|
322
|
+
siteTypes: [
|
|
323
|
+
{
|
|
324
|
+
type: "radar",
|
|
325
|
+
category: "radar",
|
|
326
|
+
iconPath: "/icons/radar.png",
|
|
327
|
+
lowModel: { url: "/model/radar.glb" },
|
|
328
|
+
},
|
|
329
|
+
],
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
siteLayer.setData([{ id: "radar-1", type: "radar", lon: 121, lat: 31, height: 0 }]);
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### 属性和方法
|
|
336
|
+
|
|
337
|
+
| 方法/属性 | 说明 |
|
|
338
|
+
| --- | --- |
|
|
339
|
+
| `options` | 解析后的站点配置 |
|
|
340
|
+
| `stats` | `{ total, inView, iconCount, lowModelCount, lowModelEligibleCount, mode }` |
|
|
341
|
+
| `setData(sites)` | 全量设置站点 |
|
|
342
|
+
| `pickAt(position, thresholdPx?)` | 按屏幕坐标拾取最近站点 |
|
|
343
|
+
| `clear()` | 清空站点 |
|
|
344
|
+
| `destroy()` | 销毁图标、低模和事件 |
|
|
345
|
+
|
|
346
|
+
事件:
|
|
347
|
+
|
|
348
|
+
| 事件 | 载荷 |
|
|
349
|
+
| --- | --- |
|
|
350
|
+
| `contextmenu` | `{ site, screenX, screenY, cartesian? }` |
|
|
351
|
+
| `pick` | `SiteData | null` |
|
|
352
|
+
|
|
353
|
+
`SiteLayer` 右键站点后可调用 `framework.showContextMenu(...)` 接入统一菜单。
|
|
354
|
+
|
|
355
|
+
## 八、聚类工具
|
|
356
|
+
|
|
357
|
+
### 同步聚类
|
|
358
|
+
|
|
359
|
+
| 方法 | 说明 |
|
|
360
|
+
| --- | --- |
|
|
361
|
+
| `lonLatToLocalPlane(lons, lats, count, lon0?, lat0?)` | 经纬度投影到本地平面米坐标 |
|
|
362
|
+
| `clusterProgressive(xs, ys, count, options?)` | 一次性递进聚类,返回独立数组,适合低频 |
|
|
363
|
+
| `createQuadClusterer(initialCapacity?)` | 创建复用缓冲的高频聚类器 |
|
|
364
|
+
|
|
365
|
+
`ProgressiveClusterOptions`:`baseCellMeters` 默认 `200`、`maxClusters` 默认 `30000`、`maxLevels` 默认 `20`。
|
|
366
|
+
|
|
367
|
+
### Worker 聚类
|
|
368
|
+
|
|
369
|
+
```ts
|
|
370
|
+
const client = createClusterWorkerClient();
|
|
371
|
+
const result = await client.run(lons, lats, count, { baseCellMeters: 200, maxClusters: 30000 });
|
|
372
|
+
client.terminate();
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
`ClusterWorkerClient`:
|
|
376
|
+
|
|
377
|
+
| 方法 | 说明 |
|
|
378
|
+
| --- | --- |
|
|
379
|
+
| `run(lons, lats, count, options?)` | 拷贝输入并在 worker 中聚类;忙时 last-wins,旧排队任务返回 `null` |
|
|
380
|
+
| `inputBuffers(count)` | 借出内部输入缓冲 |
|
|
381
|
+
| `runReusing(count, options?)` | 零拷贝提交内部输入缓冲 |
|
|
382
|
+
| `terminate()` | 结束 worker |
|
|
383
|
+
|
|
384
|
+
## 九、Web Event Bus 自动对外暴露能力
|
|
385
|
+
|
|
386
|
+
本包集成 `web-event-bus`,用于把框架实例的对外方法和事件自动暴露到全局 bus。创建 `MultiTargetFramework` 后会自动注册 framework/tracks 相关 action 并桥接 scene/tracks 事件;创建 `SiteLayer` 后会自动注册 site 相关 action 并桥接站点事件。该能力不会修改 `scene.on(...)`、`siteLayer.on(...)`、`tracks.on(...)` 的原行为,实例 `destroy()` 时会自动解绑本实例注册的 action 和事件桥接。
|
|
387
|
+
|
|
388
|
+
默认使用固定 action 名;如果页面上同时存在多个 `MultiTargetFramework` 或多个 `SiteLayer`,最后创建的同类实例会接管对应 action。旧实例销毁时不会注销已被新实例接管的 action。
|
|
389
|
+
|
|
390
|
+
### 使用方式
|
|
391
|
+
|
|
392
|
+
```ts
|
|
393
|
+
import {
|
|
394
|
+
getFrameworkEventBus,
|
|
395
|
+
} from "cesium-multi-target-framework";
|
|
396
|
+
|
|
397
|
+
const framework = new MultiTargetFramework(viewer, options);
|
|
398
|
+
const siteLayer = new SiteLayer(viewer, siteOptions);
|
|
399
|
+
const bus = getFrameworkEventBus();
|
|
400
|
+
|
|
401
|
+
bus.on("mtf.scene.hover", (payload) => {
|
|
402
|
+
console.log("scene hover", payload);
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
await bus.invoke("mtf.framework.locateTarget", {
|
|
406
|
+
id: "ship-001",
|
|
407
|
+
});
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
| 工具 | 说明 |
|
|
411
|
+
| --- | --- |
|
|
412
|
+
| `getFrameworkEventBus()` | 获取 `web-event-bus` 的浏览器全局 bus;非浏览器环境会抛错 |
|
|
413
|
+
| `tryGetFrameworkEventBus()` | 获取全局 bus;不可用时返回 `null` |
|
|
414
|
+
| `createFrameworkEventBus()` | 创建独立 bus 实例,不挂到全局 |
|
|
415
|
+
| `bindFrameworkEventBus(framework, options?)` | 高级用法:手动把指定 `MultiTargetFramework` 绑定到自定义 bus 或自定义 owner |
|
|
416
|
+
| `bindSiteLayerEventBus(siteLayer, options?)` | 高级用法:手动把指定 `SiteLayer` 绑定到自定义 bus 或自定义 owner |
|
|
417
|
+
|
|
418
|
+
自动绑定内部也使用 `FrameworkBusBinding` 管理生命周期。手动调用 `bindFrameworkEventBus` / `bindSiteLayerEventBus` 时会返回该对象:
|
|
419
|
+
|
|
420
|
+
| 字段/方法 | 说明 |
|
|
421
|
+
| --- | --- |
|
|
422
|
+
| `active` | 是否成功绑定;非浏览器环境且未传入自定义 bus 时为 `false` |
|
|
423
|
+
| `owner` | 注册到 bus 的 owner 名 |
|
|
424
|
+
| `dispose()` | 注销本次注册的 action,并取消事件桥接监听 |
|
|
425
|
+
|
|
426
|
+
绑定选项:
|
|
427
|
+
|
|
428
|
+
| 字段 | 默认 | 说明 |
|
|
429
|
+
| --- | --- | --- |
|
|
430
|
+
| `bus` | 全局 bus | 指定使用的 `FrameworkEventBus` |
|
|
431
|
+
| `owner` | `"cesium-multi-target-framework"` | 注册 action 时写入的 owner |
|
|
432
|
+
| `registerActions` | `true` | 是否注册方法 action |
|
|
433
|
+
| `bridgeEvents` | `true` | 是否桥接框架事件到 bus |
|
|
434
|
+
| `replaceExisting` | `false` | action 已存在时是否先 unregister 再注册 |
|
|
435
|
+
|
|
436
|
+
### 自动暴露的事件
|
|
437
|
+
|
|
438
|
+
事件会在对应实例创建后自动桥接到 bus。bus listener 抛错由 `web-event-bus` 隔离,不影响原本 `.on()` 监听。
|
|
439
|
+
|
|
440
|
+
| event 字符串 | 载荷 |
|
|
441
|
+
| --- | --- |
|
|
442
|
+
| `mtf.scene.perf` | `SceneEvents["perf"]` |
|
|
443
|
+
| `mtf.scene.dirty` | `SceneEvents["dirty"]` |
|
|
444
|
+
| `mtf.scene.packedDirty` | `SceneEvents["packedDirty"]` |
|
|
445
|
+
| `mtf.scene.pick` | `PickedNodeLike \| null` |
|
|
446
|
+
| `mtf.scene.hover` | `PickedNodeLike \| null` |
|
|
447
|
+
| `mtf.scene.selection` | `PickedNodeLike[]` |
|
|
448
|
+
| `mtf.scene.contextmenu` | `SceneContextMenuPayload \| null` |
|
|
449
|
+
| `mtf.track.hover` | `TrackHoverInfo \| null` |
|
|
450
|
+
| `mtf.site.contextmenu` | `SiteContextMenuPayload` |
|
|
451
|
+
| `mtf.site.pick` | `SiteData \| null` |
|
|
452
|
+
| `mtf.site.hover` | `SiteData \| null` |
|
|
453
|
+
|
|
454
|
+
### 自动暴露的方法 action
|
|
455
|
+
|
|
456
|
+
创建 `MultiTargetFramework` 后自动注册 `framework` 和 `framework.tracks` 的对外方法:
|
|
457
|
+
|
|
458
|
+
| action 字符串 | params | result |
|
|
459
|
+
| --- | --- | --- |
|
|
460
|
+
| `mtf.framework.addTarget` | `{ target }` | `StandardTargetData` |
|
|
461
|
+
| `mtf.framework.updateTarget` | `{ target }` | `StandardTargetData` |
|
|
462
|
+
| `mtf.framework.setTargetData` | `{ targets }` | `void` |
|
|
463
|
+
| `mtf.framework.upsertTargetData` | `{ targets }` | `void` |
|
|
464
|
+
| `mtf.framework.removeTargetData` | `{ ids }` | `void` |
|
|
465
|
+
| `mtf.framework.applyTargetIncremental` | `{ payload }` | `void` |
|
|
466
|
+
| `mtf.framework.setTargetColor` | `{ id, color, options? }` | `void` |
|
|
467
|
+
| `mtf.framework.setTargetGlow` | `{ id, enabled, color?, options? }` | `void` |
|
|
468
|
+
| `mtf.framework.hideTarget` | `{ id, options? }` | `void` |
|
|
469
|
+
| `mtf.framework.showTarget` | `{ id, options? }` | `void` |
|
|
470
|
+
| `mtf.framework.disappearTarget` | `{ id, options? }` | `void` |
|
|
471
|
+
| `mtf.framework.appearTarget` | `{ id, options? }` | `void` |
|
|
472
|
+
| `mtf.framework.setNameplateConfig` | `{ config }` | `void` |
|
|
473
|
+
| `mtf.framework.selectTarget` | `{ id, options? }` | `TargetSnapshot \| null` |
|
|
474
|
+
| `mtf.framework.selectTargets` | `{ ids, options? }` | `TargetSnapshot[]` |
|
|
475
|
+
| `mtf.framework.unselectTarget` | `{ id }` | `void` |
|
|
476
|
+
| `mtf.framework.clearSelection` | `undefined` | `void` |
|
|
477
|
+
| `mtf.framework.boxTarget` | `{ id, enabled?, options? }` | `void` |
|
|
478
|
+
| `mtf.framework.unboxTarget` | `{ id, options? }` | `void` |
|
|
479
|
+
| `mtf.framework.locateTarget` | `{ id, options? }` | `TargetSnapshot \| null` |
|
|
480
|
+
| `mtf.framework.registerContextMenuItem` | `{ item }` | `() => void` |
|
|
481
|
+
| `mtf.framework.showContextMenu` | `{ context }` | `void` |
|
|
482
|
+
| `mtf.framework.closeContextMenu` | `undefined` | `void` |
|
|
483
|
+
| `mtf.framework.destroy` | `undefined` | `void` |
|
|
484
|
+
| `mtf.tracks.setTracks` | `{ tracks }` | `void` |
|
|
485
|
+
| `mtf.tracks.getTracks` | `{ targetIds? } \| undefined` | `TrackRecord[]` |
|
|
486
|
+
| `mtf.tracks.showTracks` | `{ targetIds }` | `void` |
|
|
487
|
+
| `mtf.tracks.hideTracks` | `{ targetIds }` | `void` |
|
|
488
|
+
| `mtf.tracks.removeTracks` | `{ targetIds }` | `void` |
|
|
489
|
+
| `mtf.tracks.clearTracks` | `undefined` | `void` |
|
|
490
|
+
|
|
491
|
+
创建 `SiteLayer` 后自动注册站点层方法:
|
|
492
|
+
|
|
493
|
+
| action 字符串 | params | result |
|
|
494
|
+
| --- | --- | --- |
|
|
495
|
+
| `mtf.site.setData` | `{ sites }` | `void` |
|
|
496
|
+
| `mtf.site.clear` | `undefined` | `void` |
|
|
497
|
+
| `mtf.site.pickAt` | `{ position, thresholdPx? }` | `SiteData \| null` |
|
|
498
|
+
| `mtf.site.destroy` | `undefined` | `void` |
|
|
499
|
+
|
|
500
|
+
### TypeScript 类型
|
|
501
|
+
|
|
502
|
+
| 类型 | 说明 |
|
|
503
|
+
| --- | --- |
|
|
504
|
+
| `FrameworkEventBus` | 带框架事件/action 类型提示的 bus |
|
|
505
|
+
| `FrameworkBusEventMap` | event name 到 payload 的映射 |
|
|
506
|
+
| `FrameworkBusActionMap` | action name 到 params/result 的映射 |
|
|
507
|
+
| `FrameworkEventName` / `FrameworkEventPayload` | 事件名和载荷辅助类型 |
|
|
508
|
+
| `FrameworkBusActionName` / `FrameworkBusActionParams` / `FrameworkBusActionResult` | action 名、参数、结果辅助类型 |
|
|
509
|
+
|
|
510
|
+
## 十、事件工具 `EventEmitter`
|
|
511
|
+
|
|
512
|
+
`EventEmitter<EventMap>` 是一个轻量事件类,`MultiTargetScene`、`TrackManager`、`SiteLayer` 都继承它。
|
|
513
|
+
|
|
514
|
+
| 方法 | 说明 |
|
|
515
|
+
| --- | --- |
|
|
516
|
+
| `on(event, handler)` | 注册监听,返回取消函数 |
|
|
517
|
+
| `off(event, handler)` | 取消监听 |
|
|
518
|
+
| `emit(event, payload)` | 触发事件,通常内部使用 |
|
|
519
|
+
| `clear()` | 清空所有监听 |
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Cesium 多目标渲染框架 — 工作计划
|
|
2
|
+
|
|
3
|
+
> 逐项实施,完成一项勾一项。`- [ ]` 未完成,`- [x]` 已完成。
|
|
4
|
+
|
|
5
|
+
## 阶段 0:项目骨架
|
|
6
|
+
- [x] 初始化 `package.json`(TS 库 + Vite,产出 ESM/UMD + .d.ts)
|
|
7
|
+
- [x] `tsconfig.json` / `vite.config.ts`(demo)/ `vite.lib.config.ts`(库构建)
|
|
8
|
+
- [x] `.gitignore`、目录结构、demo 入口 HTML
|
|
9
|
+
- [x] 安装依赖(cesium 1.107.2、vite、vite-plugin-cesium、vite-plugin-dts、typescript)
|
|
10
|
+
|
|
11
|
+
## 阶段 1:数据标准与 DataManager
|
|
12
|
+
- [x] 定义 `TargetData` / 轨迹点 `TrackPoint` 数据标准(统一口径)
|
|
13
|
+
- [x] `DataManager.setData` 全量、`applyIncremental` 增量差分
|
|
14
|
+
- [x] 坐标预处理 + `onPointsDirty` 脏事件派发
|
|
15
|
+
|
|
16
|
+
## 阶段 2:核心包装实例与版本适配
|
|
17
|
+
- [x] `CesiumAdapter` 封装 1.107.2~1.128.0 版本敏感 API
|
|
18
|
+
- [x] `WrappedScene` 用 Proxy 代理原 Cesium 全部方法并叠加框架能力
|
|
19
|
+
- [x] `index.ts` 导出 `createMultiTargetScene`
|
|
20
|
+
|
|
21
|
+
## 阶段 3:节点管理与八叉树
|
|
22
|
+
- [x] `Node` 单节点逻辑态(逻辑位/渲染位/运动状态/交互态)
|
|
23
|
+
- [x] `Octree` 空间索引(插入/更新/删除/范围与射线查询)
|
|
24
|
+
- [x] `NodeManager` 维护节点集合、消费 dirty 事件、投影 RenderItem
|
|
25
|
+
|
|
26
|
+
## 阶段 4:对象池与分帧调度
|
|
27
|
+
- [x] 通用 `ObjectPool`(容量 ~5000,借/还/复用)
|
|
28
|
+
- [x] `FrameScheduler` 分帧计算(大批量计算切片到多帧)
|
|
29
|
+
- [x] `MotionLoop` 帧循环驱动(固定 FPS)
|
|
30
|
+
|
|
31
|
+
## 阶段 5:三级 LOD 渲染
|
|
32
|
+
- [x] `InstanceManager` RenderItem 归一与分桶
|
|
33
|
+
- [x] `PointRenderer`(PointPrimitiveCollection 点模式 + 动态图集)
|
|
34
|
+
- [x] `InstancedModelRenderer`(低模实例化合批)
|
|
35
|
+
- [x] `AnimatedModelRenderer`(高模动画对象池承载)
|
|
36
|
+
- [x] `RenderManager` 按 LOD/renderKind 分发
|
|
37
|
+
|
|
38
|
+
## 阶段 6:预测与平滑渲染
|
|
39
|
+
- [x] `Predictor` 3 秒预测窗口(低/高速分类外推、垂直速率 clamp)
|
|
40
|
+
- [x] 渲染位趋同 blend(按剩余时间比例拉拢,航向 slerp)
|
|
41
|
+
- [x] 无新包时按运动学继续外推
|
|
42
|
+
|
|
43
|
+
## 阶段 7:射线拾取与交互
|
|
44
|
+
- [x] `Picker` 八叉树 + 射线拾取
|
|
45
|
+
- [x] 禁用 Cesium 原生左键查找
|
|
46
|
+
- [x] 选中/悬停优先抢占动画池
|
|
47
|
+
|
|
48
|
+
## 阶段 8:相机分级与合并显示
|
|
49
|
+
- [x] 相机高度分级(逻辑缩放乘子 + 高空总开关隐藏模型)
|
|
50
|
+
- [x] 基于八叉树聚类的密级船舶合并显示
|
|
51
|
+
|
|
52
|
+
## 阶段 9:Demo 与联调验证
|
|
53
|
+
- [x] demo 页面 + 模拟数据源(无人机 2500 + 船舶 800,每秒推权威增量)
|
|
54
|
+
- [x] 验证:tsc 类型检查通过 / dev server 200 / 入口转译正常 / 库构建产物完整
|
|
55
|
+
- [ ] 浏览器可视化复核(合批不卡 / 预测平滑 / LOD 切换 / 拾取选中)— 待本地 `npm run dev` 人工确认
|
|
56
|
+
|
|
57
|
+
## 阶段 10:文档与发布
|
|
58
|
+
- [x] 补全 `README.md` 使用说明与 API 文档
|
|
59
|
+
- [x] 提交并推送 Gitee
|