单站平面、单站射线、风暴追踪和组网格点都能按同一要素播 2~6 个时次。从 单站平面、单站射线、风暴属性、组网格点 各产品的「能力」进入。图层只画当前一场。组网时序默认 fill: 'gradient',可再 setFill 切逐格 / 等值面。平面 / 射线 / 风暴没有这套填色。轴和按钮由页面自己画,库不提供控件。对照着图看:平面时序、射线时序、风暴时序、组网时序。
parse 一次解开全部场,工厂只拿第一场。切帧只 setOption({ data }),不再解析。不调 play 就不会播。文档站示例自己用 3 秒一轮的动画,不调库的 play()。
调用
import { parse } from '@dingnl/ltvis-globe/parse'
import { bindSequence, createMosaicLayer, createRadarGridLayer } from '@dingnl/ltvis-globe/layer'
const frames = await parse([bufferA, bufferB, bufferC], {
format: 'diamond',
// 一次只出这一列,多份必须相同
product: 'dcr'
})
const layer = createMosaicLayer({
// 第一场
data: frames[0].values,
// 画哪一列,与 parse 相同
product: 'dcr',
// 组网时序默认渐变填色
fill: 'gradient'
})
layer.addTo(globe)
const sequence = bindSequence(layer, frames)
// 切到第 3 场。只换 data,不再解析
sequence.setIndex(2)
const box = layer.getBounds()切帧后 getBounds() 跟当前场。套合视野由地球宿主相机做。
单站平面同一套,format: 'rstm',工厂换 createRadarGridLayer,必须传 site。射线换 createRadarPolarLayer,site 同样必填。风暴换 createStiLayer,site 同样必填;空表也算合法场。
const frames = await parse([bufferA, bufferB], {
format: 'rstm',
// 一次只出这一列,多份必须相同
product: 'cr'
})
const layer = createRadarGridLayer({
// 第一场
data: frames[0].values,
// 画哪一列,与 parse 相同
product: 'cr',
// 雷达站心,投影原点
site: frames[0].site
})
layer.addTo(globe)
const sequence = bindSequence(layer, frames)射线把工厂换成 createRadarPolarLayer,风暴换成 createStiLayer,site 同样写 frames[0].site。某一场可以是空表(消亡),仍算合法时序帧。
解析
传入 2~6 份同 format / 同 product 的 buffer,返回 ParseResult[]。每一项和单文件相同,不要把多场拼进一个 values。解析走 @dingnl/ltvis-globe/parse。
| 字段 | 说明 |
|---|---|
format | 组网写 diamond;平面 / 射线 / 风暴写 rstm |
product | 一次只出这一列。多份必须相同 |
1 份不要包成数组,按单文件 parse(buffer, { format, product })。超过 6 份会报错。开播前一次解完。
frames[i] 上常用:
| 字段 | 说明 |
|---|---|
values | 这一场的记录,交给工厂或 setOption({ data }) |
product | 与 parse 相同 |
site | 单站平面 / 射线 / 风暴必填,投影原点。组网不要当范围用 |
dateTime | 有则是字符串。缺的是空串,不编时间 |
会话方法
| 名称 | 说明 |
|---|---|
index | 当前场,从 0 起。只读 |
length | 场数,2~6。只读 |
dateTimes | 各场 dateTime。缺的是空串。只读 |
setIndex(index) | 切到指定场。只 setOption({ data })。越界会报错 |
play({ interval }) | 按间隔循环切下一场。不调不播 |
pause() | 停在当前场。再 play 从下一场继续 |
同一图层再 bindSequence 会先停上一份播放。卸图层会停播放。
播放
不调 play 就不会播。interval 单位毫秒,必须大于 0。
| 字段 | 说明 | 默认 |
|---|---|---|
interval | 一场停留多久 | 800 |
// 不传间隔,800ms 一场循环
sequence.play()
// 2 秒一场
sequence.play({ interval: 2000 })
// 停在当前场
sequence.pause()播放中只换当前场,不要再 parse。轴和按钮由调用侧画:
const ticks = sequence.dateTimes.map((time, index) => ({
index,
// 缺时间就空着,不编
label: time
}))
sequence.setIndex(0)
// 读当前场,用来高亮轴
sequence.index
sequence.length换要素
换 product 时重新 parse、重建图层、再 bindSequence。不要在旧图层上换列硬切。
sequence.pause()
layer.remove()
const nextFrames = await parse([bufferA, bufferB], {
format: 'diamond',
// 换列
product: 'rfst'
})
const nextLayer = createMosaicLayer({
// 第一场
data: nextFrames[0].values,
// 换列
product: 'rfst',
// 组网时序默认渐变填色
fill: 'gradient'
})
nextLayer.addTo(globe)
const nextSequence = bindSequence(nextLayer, nextFrames)约束
对不上就拒,不会静默跳过。
| 情况 | 结果 |
|---|---|
| 1 份包成数组 | 报错 |
| 不是 2~6 份 | 报「时序一次只认 2~6 份文件」 |
product 不同 | 报第几份产品对不上 |
| 几何不同 | 报第几份几何对不上 |
组网 rows / cols / 西界 / 北界 / 步长对不上 | 报网格对不上 |
平面 rows / cols / cellSize 或站心对不上 | 报网格 / 站心对不上 |
| 射线门数 / 库长或站心对不上 | 报射线 / 站心对不上 |
| 风暴站心对不上 | 报站心对不上 |
setIndex 越界 | 报索引必须是 0~N |
play 的 interval ≤ 0 | 报间隔必须大于 0 |
风暴某一场可以是空表(消亡),仍算合法时序帧,只比站心。组网 Diamond 才有真时间;RSTM 的 dateTimes 常是空串,不编时间。