单站平面、单站射线、风暴追踪和组网格点都能按同一要素播 2~6 个时次。从 单站平面、单站射线、风暴属性、组网格点 各产品的「能力」进入。图层只画当前一场。组网时序默认 fill: 'gradient',可再 setFill 切逐格 / 等值面。平面 / 射线 / 风暴没有这套填色。轴和按钮由调用侧画,库不提供控件。对照着图看:基本数据、导出、风暴、组网。
parse 一次解开全部场,工厂只拿第一场。切帧只 setOption({ data }),不再解析。不调 play 就不会播。文档站示例自己用 3 秒一轮的动画,不调库的 play()。
调用
组网格点:
import { parse } from '@dingnl/ltvis-map/parse'
import { bindSequence, createMosaicLayer } from '@dingnl/ltvis-map/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(map)
const sequence = bindSequence(layer, frames)
// 切到第 3 场。只换 data,不再解析
sequence.setIndex(2)
const box = layer.getBounds()切帧后 getBounds() 跟当前场。套合视野由调用侧做。
单站平面 / 射线 / 风暴必须带站心:
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(map)
const sequence = bindSequence(layer, frames)射线把工厂换成 createRadarPolarLayer,风暴换成 createStiLayer,site 同样写 frames[0].site。
解析
传入 2~6 份同 format / 同 product 的 buffer,返回 ParseResult[]。每一项和单文件相同,不要把多场拼进一个 values。
| 字段 | 说明 |
|---|---|
format | 与单文件相同。平面 / 射线 / 风暴是 rstm,组网是 diamond |
product | 一次只出这一列。多份必须相同 |
1 份不要包成数组,按单文件 parse(buffer, { format, product })。超过 6 份会报错。开播前一次解完。
frames[i] 上调用侧常用:
| 字段 | 说明 |
|---|---|
values | 这一场的记录,交给工厂或 setOption({ data }) |
product | 与 parse 相同 |
site | 雷达站心。单站平面 / 射线 / 风暴必填 |
dateTime | 有则是字符串。缺的是空串,不编时间。RSTM 头时间本期未锁 |
会话方法
| 名称 | 说明 |
|---|---|
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: 'rstm',
// 换列
product: 'et'
})
const nextLayer = createRadarGridLayer({
data: nextFrames[0].values,
product: 'et',
site: nextFrames[0].site
})
nextLayer.addTo(map)
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 常是空串,不编时间。