7.9 KiB
CM95 S-52 NavSea 运行时呈现契约 v1
1. 目标
本契约定义 NavSea 如何消费 CM95 Delivery PBF 中的 S-52 海图事实,并在用户修改水深、安全等深线或颜色设置后立即重新呈现,而不重新生成、下载或替换 PBF。
本契约只规定数据与算法责任边界,不在 CM95 Server 中实现 NavSea UI,也不把 NavSea Store/业务生命周期引入 PBF Builder。
2. 总体责任
CM95/PBF 负责
- 几何;
- 原始水深事实的规范化数值;
- Lookup identity 与静态 S-52 Presentation 提示;
- 与用户设置无关的属性派生;
- runtime CSP 所需的最小事实;
- 不可从单个 Feature 自身恢复的必要空间上下文摘要。
NavSea Runtime 负责
- 当前用户的水深颜色设置;
shallowContour / safetyContour / safetyDepth / deepContour;twoShades;- safety contour 实际选择;
- SOUNDG 深/浅字形;
- OBSTRN/WRECKS isolated danger;
- isolated danger 引起的 DisplayBase / priority promotion;
- 设置变化后的即时重算和 MapLibre style 更新。
3. Runtime Settings
建议 NavSea 运行时形成一个统一的只读快照,例如:
S52MarinerRuntimeSettings
shallowContourM
safetyContourM
safetyDepthM
deepContourM
twoShades
depthColorRules
depthColorRules 属于 NavSea 现有的用户自定义显示能力,可以独立于 S-52 四个标准深度阈值。服务器不得把用户颜色写入 PBF。
一次重算必须使用同一个 settings snapshot,避免 DEPARE、DEPCNT、SOUNDG 与 hazard 在同一帧使用不同设置。
4. PBF Runtime 字段
DEPARE / DRGARE
主要字段:
depth_min_mdepth_max_ms52_runtime_csp = DEPARE01 | DEPARE02
chart_fill_style 仅作为当前 NavSea 既有 style 的兼容语义,不应覆盖精确 depth_min_m/depth_max_m 的事实地位。
DEPCNT
主要字段:
contour_depth_mleast_depth_m(兼容)s52_runtime_csp = DEPCNT02s52_quapos_code(有值时)
SOUNDG
主要字段:
depth_value_ms52_sounding_depth_ms52_sounding_swepts52_sounding_low_qualitys52_runtime_csp = SOUNDG02
OBSTRN / UWTROC / WRECKS
主要字段:
s52_hazard_depth_ms52_surrounding_max_drval1_ms52_surrounding_min_drval2_ms52_watlev_codes52_expsou_codes52_catobs_codes52_catwrk_codes52_quapos_codes52_quasou_codess52_tecsou_codess52_status_codess52_runtime_csp = OBSTRN04 | WRECKS02
数组类 code 在 Delivery MVT 中以 JSON 字符串保存,NavSea Adapter 负责一次标准化解析,不由 MapLibre style 直接解析 JSON。
5. DEPARE 运行时规则
NavSea 可以有两层规则:
- 用户自定义
depthColorRules优先决定颜色; - 未启用自定义颜色时,可按 S-52
DEPARE01/02的 shallow/safety/deep/twoShades 规则得到标准颜色角色。
颜色计算以 PBF 的精确 depth_min_m/depth_max_m 为输入。用户修改阈值只改变已有 DEPARE polygon 的显示,不生成原海图不存在的新等深边界,也不在客户端重新切割 polygon。
因此,例如原始海图区间为 5–10m,用户将颜色阈值设为 7m,NavSea 可以按规则重新给整个 5–10m 区域着色,但不能假装原数据中存在一条精确的 7m 面边界。
6. DEPCNT 与 safety contour
contour_depth_m 是事实;s52_is_safety_contour 是运行时结果。
规则语义保持:
- 若存在与
safetyContourM相等的实际等深线,选该深度; - 否则选择下一条更深的实际等深线;
- 不允许服务器把默认
3m的选择永久写入 runtime PBF。
这里不能只靠单个 Feature 的 MapLibre expression 完成“下一条更深”判断,因为它需要知道可用 contour depth 集合。
NavSea Runtime 因此需要维护稳定的 ContourCatalog(按当前有效海图/尺度上下文的已知等深值排序),先计算:
effectiveSafetyContourM = min(depth >= safetyContourM)
再把该值注入 DEPCNT style expression。
若当前没有足够的 ContourCatalog 信息,必须 fail-closed:不错误突出某一条线为 safety contour。后续若 Runtime 收集 catalog 的成本过高,可在 PBF 契约增加相邻等深值元数据,但 v1 不先制造新的冗余字段。
7. SOUNDG 运行时规则
SOUNDG 的数值深度、扫测状态和质量状态是事实;SOUNDS* / SOUNDG* 前缀及最终 symbol sequence 属于运行时结果。
核心规则:
depth <= safetyDepthM -> shallow sounding family
otherwise -> normal sounding family
随后根据 swept / low-quality 和数值位数生成最终 S-52 symbol sequence。
用户修改 safetyDepthM 后只需重新计算当前可见 SOUNDG 的 presentation,不重新加载 PBF。
8. Hazard / isolated danger 运行时规则
OBSTRN/WRECKS 必须根据同一个 safetyContourM settings snapshot 重新执行对应 CSP。
PBF 中的 hazard depth、WATLEV、EXPSOU、QUASOU 等是输入事实;以下均为运行时输出,不能直接信任旧 tile 中的固定值:
- isolated danger yes/no;
ISODGR51等最终符号;- DisplayBase promotion;
- Hazards priority promotion;
- hazard 内附带 sounding 的 shallow/normal 字形。
当前 PBF 已将相交 DEPARE 的必要深度摘要一起交付,避免 NavSea 为每个 hazard 再做昂贵的 polygon 空间相交。
9. 静态 Presentation
以下不依赖水深 mariner settings 的属性仍可直接消费 PBF 物化结果:
- LIGHTS05 静态结果;
- TOPMAR01;
- 静态 TX/TE;
- 静态 SY/LS/LC/AP/AC/CA;
s52_symbol_sequence/s52_line_sequence;s52_symbol_rotation_deg;- 静态
OP已应用后的s52_display_priority。
NavSea 不应为这些规则重复实现一套与 Server 不同的 Lookup 解释器。
10. MapLibre Adapter 边界
建议 NavSea 增加一个纯 Presentation Adapter,而不是把判断分散到各个 UI/Layer:
PBF feature properties
+
S52MarinerRuntimeSettings snapshot
+
ContourCatalog
↓
S52RuntimePresentationAdapter
↓
normalized render properties / style expressions
↓
MapLibre
Adapter 不获取网络、不修改用户设置、不拥有 PBF 下载生命周期,只做确定性转换。
11. 设置变化
用户修改任何 mariner setting 后:
- 形成新的 settings snapshot;
- 更新 effective safety contour;
- 重新生成/更新 DEPARE、DEPCNT、SOUNDG、hazard 对应 style/runtime properties;
- 请求 MapLibre repaint;
- 不清 tile cache,不重新下载 PBF,不重新生成 Server 数据。
禁止继续显示基于旧 settings 推导的 safety contour / isolated danger / sounding shallow 状态。
12. Fail-closed
- 缺少精确水深事实时,不凭颜色或旧派生字段反推水深;
- 缺少 ContourCatalog 时,不伪造 safety contour;
- hazard 所需事实不足时,保留普通危险物显示,但不错误声明 isolated danger;
- JSON code 字段解析失败时,视为空集合并记录诊断;
- 运行时设置无效时回退 NavSea 明确定义的默认 settings snapshot,而不是使用 PBF 内历史派生值。
13. v1 暂未纳入
Plain / Symbolized Boundaries 会改变 Area Lookup Table 选择,尚未完全纳入上述 runtime Adapter。第一版继续沿用当前 boundary table 编译路径;待 NavSea/Style Compiler 能同时持有 Plain 与 Symbolized 两套 Area rule 后再统一运行时切换。
14. 接入门槛
NavSea 正式消费 runtime PBF 前至少验证:
- 修改水深颜色不触发 PBF 网络请求;
- 修改 safety depth 后 SOUNDG 即时变化;
- 修改 safety contour 后 DEPCNT 和 hazard 使用同一个新值;
- runtime PBF 中不存在旧固定
s52_is_safety_contour/s52_isolated_danger等结果; - reference PBF 仍可用于 OpenCPN 对照;
- 同一设置、同一 Feature 输入必须得到确定性相同输出。