# CM95 → NavSea PBF 映射设计报告 v1 日期:2026-09-03 状态:`PBF-02 / IMPLEMENTATION_DRAFT` 测试 AOI:`z10/914/385` ## 1. 本轮输入 CM95 MySQL AOI 审计: ```text AOI Cells : 7 AOI Spatial Features : 3605 Object class/geom groups : 80 Attribute groups : 177 Feature samples : 600 ``` 现有 NavSea/NEWPEC 对照 PBF: ```text z10 tiles : 1 z11 tiles : 4 z12 tiles : 16 total : 21 observed source-layers : 37 ``` 实际 extent: ```text z10 : 4096 z11 : 4096 z12 : 1048576 ``` 因此 CM95 generator 不应把“所有 zoom 固定 extent=4096”当成既有生产事实。首版 generator 必须把 extent 作为显式策略,并在输出审计中记录实际值。 ## 2. CM95 AOI 主要对象 当前 AOI 具备完整的安全对象闭环: ```text WRECKS POINT : 480 DEPCNT LINE : 451 DEPARE AREA : 414 SBDARE POINT : 287 SLCONS LINE : 209 UWTROC POINT : 176 COALNE LINE : 171 LNDARE AREA : 159 SLCONS AREA : 119 LIGHTS POINT : 96 OBSTRN AREA : 70 ITDARE AREA : 69 ``` 同时存在 Beacon/Buoy、Bridge、overhead cable、submarine cable、pilot boarding、anchorage 等对象,可覆盖第一阶段 hard-gate。 ## 3. 现有 NavSea PBF 实际契约 当前 21 张参考 PBF 中最主要的 source-layer: ```text onshore_structure_line 12940 baseline_outline 2129 baseline_area 1146 bathymetry_line 1128 anchor_caution_hazard_point 897 depth_contour 821 hole_area 563 land_area 321 seabed_text_point 273 baseline_line 234 anchor_caution_hazard_area 172 anchor_caution_hazard_outline 172 onshore_structure_area 137 place_label_land 136 onshore_structure_point 124 ``` 当前 unified style 实际消费 37 个 NavSea source-layer。 参考 PBF 与 style 之间存在少量“PBF 有但当前 style 不消费”的历史层: ```text depth_contour_overview route_area route_outline ``` 因此 CM95 v1 不因为参考 PBF 中存在 `route_area` 就自动输出它。 例如 `FAIRWY` 首版保留在工程版,避免违反“只改 tile URL 即可使用当前 style”的目标。 ## 4. 第一版映射覆盖 `cm95_to_navsea_v1.yaml` 已覆盖本 AOI 全部 80 个 `object_class + geometry_type` 组合。 映射状态(按组合数): ```text MAPPED 33 ENGINEERING_ONLY 12 MAPPED_CONDITIONAL 11 REVIEW_STYLE_GAP 11 COMPOSITE 5 REVIEW_CONDITIONAL 4 ENGINEERING_COMPONENT 1 UNMAPPED_REVIEW 1 DERIVED_LABEL_ONLY 1 MAPPED_DERIVED_POINTS 1 ``` 可以直接进入映射/合成实现的 Feature 数: ```text 3239 / 3605 = 89.8% ``` 其余对象没有静默丢弃,全部明确进入: ```text REVIEW_CONDITIONAL REVIEW_STYLE_GAP ENGINEERING_ONLY ENGINEERING_COMPONENT UNMAPPED_REVIEW ``` 正式 delivery 不会因为未映射而“假装成功”。 ## 5. Hard-gate 映射 ### DEPARE ```text DEPARE AREA → baseline_area → DRVAL1 / DRVAL2 → canonical depth range → chart_fill_style=depth_zone_* ``` 原 polygon 不重建。 ### DEPCNT ```text DEPCNT LINE → depth_contour VALDCO → least_depth_m VALDCO → chart_label_text ``` ### WRECKS ```text WRECKS POINT → navigation_hazard_point VALSOU present → wreck_surveyed otherwise → wreck_submerged_dangerous ``` Area wreck 保持 area,不降级为 point,并额外派生 boundary 到 `navigation_hazard_outline`。 ### UWTROC ```text UWTROC POINT → navigation_hazard_point WATLEV submerged → rock_submerged WATLEV awash/drying → rock_awash VALSOU → least_depth_m ``` 必须保留水上/水下语义。 ### OBSTRN Point 与 Area 分开: ```text POINT → navigation_hazard_point AREA → navigation_hazard_area + derived outline ``` ### FSHHAV ```text FSHHAV POINT → anchor_caution_hazard_point → reef_fish ``` ### BRIDGE / CBLOHD / TELPHC / PIPOHD 净空/架空安全对象使用现有: ```text bridge_structure clearance_limit_line clearance_limit_point ``` 存在 `VERCLR` 时才写净空数值;没有值时不伪造。 ## 6. 助航对象必须合成,而不是简单逐对象输出 本轮最重要的新结论是: CM93 中: ```text LIGHTS BCNLAT BCNSPP BOYSPP RTPBCN TOWERS _extgn ``` 可能是同一个现实助航标的多个对象组件。 AOI 样本已经观察到共享: ```text cell_id + attributes._cm93_relation20_raw ``` 并且共享 relation20 的样本坐标完全一致。 样本证据包括: - cell `693` relation20 `2273` → `BCNLAT, LIGHTS`;坐标组数 `1` - cell `693` relation20 `2272` → `BCNLAT, LIGHTS`;坐标组数 `1` - cell `693` relation20 `2254` → `BCNLAT, LIGHTS`;坐标组数 `1` - cell `693` relation20 `2266` → `LIGHTS, _extgn`;坐标组数 `1` - cell `693` relation20 `2270` → `LIGHTS, _extgn`;坐标组数 `1` - cell `693` relation20 `2276` → `LIGHTS, _extgn`;坐标组数 `1` - cell `693` relation20 `2239` → `LIGHTS, TOWERS`;坐标组数 `1` - cell `693` relation20 `2241` → `LIGHTS, TOWERS`;坐标组数 `1` 因此 CM95 PBF Adapter 第一版采用: ```text primary composition key = cell_id + _cm93_relation20_raw ``` 而不是仅凭经纬度 proximity 合并。 规则: 1. relation20 相同且坐标一致 → 合成一个 `navigation_marks` Feature; 2. LIGHTS 的灯色、灯质、周期、高度、射程、扇区等属性并入基体; 3. Beacon/Buoy/Tower 提供主体 symbol 语义; 4. `_extgn` 只作为组件/trace,不单独 delivery; 5. relation20 缺失时才允许进入 fallback; 6. fallback 必须被审计标记,不能静默按邻近点合并。 在真正写 generator 前,需要用全 AOI 数据验证 relation20,而不是只依赖 600 条采样记录。 本包已经提供: ```text tools/cm95_nav_aid_relation_audit_v1.py ``` ## 7. Light 字段 本 AOI 实际出现的 CM93/S-57 `COLOUR` 值: ```text 1 → white 3 → red 4 → green 6 → yellow ``` 首版只对当前实际出现值建立冻结映射;其它值先进入 mapping gap,不猜值。 `LIGHTS` 输出至少包括: ```text light_color_code chart_label_text chart_label_subtext chart_text_style chart_text_color light_sector_mode chart_icon_image ``` 灯略记由: ```text LITCHR SIGGRP SIGPER COLOUR HEIGHT VALNMR ``` 组合生成。 ## 8. Sounding 当前 AOI 有 `SOUNDG` Feature,并由 `chart_sounding_point` 保存多个真实 sounding points。 因为当前 style 没有独立 `sounding_point` source-layer,v1 采用: ```text chart_sounding_point → derived point label → seabed_text_point ``` 这是额外 render artifact,不修改/替换数据库里的原 sounding。 ## 9. Stable identity 禁止把: ```text chart_feature.id ``` 当成长期 PBF identity。 v1 冻结 source identity: ```text cm95: dataset_id + source_relative_path + source_record_index + geometry_role ``` 下一阶段 generator 会在此基础上建立稳定 FID manifest,再接现有 NavSea numeric feature-id 体系。 ## 10. 当前尚未正式进入 delivery 的内容 主要包括: ```text _texto 文本归属 land/sea/facility 尚需关联判断 BUISGL POINT 当前 style 表达不明确 行政边界类 当前 style 不需要 FAIRWY 参考 PBF 有 route_area,但当前 unified style 不消费 若干一般陆上点对象 不属于 hard-gate,后续补 symbol 映射 ``` 这些对象全部保留在工程 trace / `cm95_unmapped`,没有删除。 ## 11. 下一步门禁 先执行 relation20 全 AOI 审计。 通过条件: ```text LIGHTS relation20 可覆盖主要灯标 relation group 不出现明显坐标冲突 跨 Cell 不发生错误合并 无法合并的 LIGHTS 数量明确 ``` 通过后进入: ```text PBF-03 CM95 MySQL → z10/914/385 单 tile generator ``` 第一版 generator 将只实现当前已经冻结的映射,并同时输出: ```text delivery PBF engineering PBF / trace cm95_unmapped report FID audit sprite closure audit object preservation audit ```