1647 lines
37 KiB
Markdown
1647 lines
37 KiB
Markdown
# NavSea 物体统一判定、点击查询与审计设计
|
||
|
||
最后更新:`2026-04-09`
|
||
项目根:`/root/sourceserver/pbf`
|
||
|
||
## 1. 文档目标
|
||
|
||
本文用于把 `NavSea PBF` 项目的物体模型正式收口为一套可实现、可审计、可交付的设计。
|
||
|
||
当前项目的核心目标有三项:
|
||
|
||
1. 点击海图物体时,能够稳定回答“这是什么”,并返回桥高、水深、灯光、净空、名称等关键细节。
|
||
2. 能与 `NewPEC` 原体系稳定对应,并通过审计确认“对象没有丢、没有错归、没有错误合并”。
|
||
3. 能渲染出与 `NewPEC` 等价的图标、文字、线型、面样式和安全语义。
|
||
|
||
本文把这三项目标统一到一套模型里,并明确:
|
||
|
||
- 哪些字段服务于点击查询
|
||
- 哪些字段服务于对象对回与审计
|
||
- 哪些字段服务于样式渲染
|
||
- 审计应该如何分层,哪些门禁是硬门禁
|
||
|
||
## 2. 设计结论
|
||
|
||
最重要的结论只有一条:
|
||
|
||
- 不应再试图用单一字段同时承担“身份锚点”“本体分类”“渲染控制”三种职责。
|
||
|
||
正确做法是把一个 `feature` 拆成 3 个主维度:
|
||
|
||
1. `identity / trace`
|
||
2. `object semantics`
|
||
3. `render semantics`
|
||
|
||
其中:
|
||
|
||
- `identity / trace` 用于和 `NewPEC` 对回、做对象保真审计
|
||
- `object semantics` 用于点击查询、业务解释、CPA 相关判断
|
||
- `render semantics` 用于让最终渲染表现与 `NewPEC` 等价
|
||
|
||
`canonical_object_type` 可以保留并继续使用,但它应被定位为:
|
||
|
||
- `NavSea` 统一语义子类名
|
||
|
||
而不是:
|
||
|
||
- 唯一身份键
|
||
- 唯一审计锚点
|
||
- 唯一渲染控制字段
|
||
|
||
## 3. 现有问题
|
||
|
||
当前项目里,一个 `feature` 的字段来源混杂了多个维度:
|
||
|
||
- `fid`、`source_layer` 这类追踪字段
|
||
- `class_code`、`display_code` 这类 `NewPEC` 原生分类码
|
||
- `canonical_object_type` 这类统一语义名
|
||
- `chart_icon_image`、`chart_symbol_code` 这类渲染结果字段
|
||
- `depth_value_m`、`clearance_height_m`、`light_color_code` 这类业务属性字段
|
||
|
||
如果不先分层,就会出现三个问题:
|
||
|
||
1. 点击后不知道“应该信哪个字段来判定物体是什么”。
|
||
2. 审计时容易把“画出来了”误当成“对象还在”。
|
||
3. 渲染字段容易反过来污染本体分类,导致“画成什么”与“它是什么”混淆。
|
||
|
||
## 4. 总体设计原则
|
||
|
||
### 4.1 物体本体优先于渲染结果
|
||
|
||
- 一个对象是什么,必须优先由对象语义决定
|
||
- 不能用 `chart_icon_image`、`chart_fill_style` 等渲染字段反推本体
|
||
|
||
### 4.2 对象审计优先于视觉相似
|
||
|
||
正式顺序必须保持为:
|
||
|
||
1. 对象保真审计
|
||
2. 渲染一致性审计
|
||
3. AOI / 视觉审计
|
||
|
||
如果对象已经丢失、错归或被错误合并,则视觉相似不能判定为通过。
|
||
|
||
### 4.3 原生码值保留,但不再让它们直接统治上层业务
|
||
|
||
- `class_code`、`display_code` 必须保留
|
||
- 但上层点击查询、业务接口、CPA 判断不应直接依赖 `NewPEC` 原始码值
|
||
- 应把这些码值映射进 `NavSea` 自有对象分类体系
|
||
|
||
### 4.4 交付版不能只顾渲染,还必须可查询
|
||
|
||
最终交付版 `PBF` 不能只保留“刚好够 style 用”的字段。
|
||
|
||
至少对以下查询能力,必须保留足够字段:
|
||
|
||
- 点击知道对象是什么
|
||
- 点击读取桥高 / 水深 / 净空 / 灯光属性
|
||
- 点击读取危险物或航标的细类信息
|
||
- 为 CPA / 安全判断提供必要业务属性
|
||
|
||
## 5. 统一物体模型
|
||
|
||
### 5.1 三层主模型
|
||
|
||
建议每个 `feature` 的逻辑模型固定为下面三层。
|
||
|
||
#### A. identity / trace
|
||
|
||
回答:
|
||
|
||
- 这是哪个原始对象
|
||
- 它来自哪个 `NewPEC` layer
|
||
- 它能否稳定对回原始对象
|
||
|
||
建议字段:
|
||
|
||
- `fid`
|
||
- `source_layer_native`
|
||
- `source_layer_std`
|
||
- `geometry_type`
|
||
- `feature_id`
|
||
- `native_code_type`
|
||
- `native_code_value`
|
||
|
||
其中:
|
||
|
||
- `fid` 是第一锚点
|
||
- `source_layer_native + geometry_type` 是第二锚点
|
||
- `native_code_type + native_code_value` 是第三锚点
|
||
|
||
#### B. object semantics
|
||
|
||
回答:
|
||
|
||
- 这个物体本体是什么
|
||
- 它属于哪个业务域、哪一类、哪一个子类
|
||
- 它有哪些业务属性
|
||
|
||
建议字段:
|
||
|
||
- `object_domain`
|
||
- `object_class`
|
||
- `object_subclass`
|
||
- `canonical_object_type`
|
||
- `object_display_name`
|
||
- `object_properties`
|
||
|
||
其中:
|
||
|
||
- `canonical_object_type` 建议保留并作为 `object_subclass` 的稳定值
|
||
- `object_display_name` 用于 UI 展示
|
||
- `object_properties` 用于承载查询和业务细节
|
||
|
||
#### C. render semantics
|
||
|
||
回答:
|
||
|
||
- 这个物体应该如何渲染
|
||
- 应该命中什么 icon、text、fill、line
|
||
|
||
建议字段:
|
||
|
||
- `chart_icon_image`
|
||
- `chart_symbol_code`
|
||
- `chart_label_text`
|
||
- `chart_label_subtext`
|
||
- `chart_fill_style`
|
||
- `chart_fill_pattern`
|
||
- `chart_line_color`
|
||
- `chart_line_width`
|
||
- `chart_text_style`
|
||
- `chart_text_color`
|
||
|
||
### 5.2 NavSea 自有分类体系
|
||
|
||
建议正式建立一套 `NavSea` 自有分类体系,不再让上层业务直接依赖旧码值。
|
||
|
||
建议结构:
|
||
|
||
- `object_domain`
|
||
- 业务大域
|
||
- `object_class`
|
||
- 业务大类
|
||
- `object_subclass`
|
||
- 业务细类
|
||
- `native_code_type`
|
||
- 原生码种类
|
||
- `native_code_value`
|
||
- 原生码值
|
||
|
||
建议示例:
|
||
|
||
- `object_domain = navigation_mark`
|
||
- `object_class = buoy`
|
||
- `object_subclass = pillar_buoy`
|
||
- `native_code_type = display_code`
|
||
- `native_code_value = 31300003`
|
||
|
||
再例如:
|
||
|
||
- `object_domain = hazard`
|
||
- `object_class = wreck`
|
||
- `object_subclass = dangerous_fully_submerged_wreck`
|
||
- `native_code_type = class_code`
|
||
- `native_code_value = 404`
|
||
|
||
### 5.3 object_domain 建议集合
|
||
|
||
建议首批固定为:
|
||
|
||
- `navigation_mark`
|
||
- `hazard`
|
||
- `facility`
|
||
- `boundary`
|
||
- `depth`
|
||
- `clearance`
|
||
- `toponym`
|
||
- `seabed`
|
||
- `route`
|
||
- `area_usage`
|
||
- `landform`
|
||
- `support`
|
||
- `unclassified`
|
||
|
||
### 5.4 object_class / object_subclass 的职责
|
||
|
||
- `object_class` 用于稳定业务分组和 API 过滤
|
||
- `object_subclass` 用于更细粒度判定和 UI 展示
|
||
|
||
例如:
|
||
|
||
- `object_domain = navigation_mark`
|
||
- `object_class = lighthouse`
|
||
- `object_subclass = breakwater_lighthouse`
|
||
|
||
或者:
|
||
|
||
- `object_domain = hazard`
|
||
- `object_class = rock`
|
||
- `object_subclass = awash_rock`
|
||
|
||
### 5.5 原生码与自有体系并存
|
||
|
||
新的 `NavSea` 体系不是要删除 `NewPEC` 码值,而是要把原生码值纳入可映射、可审计的结构中。
|
||
|
||
因此应保留:
|
||
|
||
- `native_code_type`
|
||
- `native_code_value`
|
||
- `source_layer_native`
|
||
|
||
并新增:
|
||
|
||
- `object_domain`
|
||
- `object_class`
|
||
- `object_subclass`
|
||
|
||
这样:
|
||
|
||
- 审计仍能稳定回到 `NewPEC`
|
||
- 业务和 UI 则可以直接消费 `NavSea` 自有语义体系
|
||
|
||
## 6. 字段设计建议
|
||
|
||
### 6.1 必保留的身份与审计字段
|
||
|
||
无论工程版还是交付版,建议至少保留:
|
||
|
||
- `fid`
|
||
- `source_layer_native`
|
||
- `source_layer_std`
|
||
- `geometry_type`
|
||
- `native_code_type`
|
||
- `native_code_value`
|
||
- `canonical_object_type`
|
||
|
||
说明:
|
||
|
||
- 如果交付版完全移除这些字段,将直接削弱点击查询能力和对象审计能力
|
||
- 当前项目如果要长期支持“点击解释 + CPA + 安全判断”,这些字段不能被视为纯工程期字段
|
||
|
||
### 6.2 必保留的业务查询字段
|
||
|
||
建议按对象类型保留以下关键字段:
|
||
|
||
- `depth_value_m`
|
||
- `least_depth_m`
|
||
- `clearance_height_m`
|
||
- `light_color_code`
|
||
- `light_sector_mode`
|
||
- `bearing_deg`
|
||
- `name_ja`
|
||
- `place_name_en`
|
||
- `shape_class_code`
|
||
|
||
必要时还应扩展:
|
||
|
||
- 灯质
|
||
- 周期
|
||
- 射程
|
||
- 桥名
|
||
- 净空类别
|
||
- 航标附注
|
||
|
||
### 6.3 必保留的渲染字段
|
||
|
||
建议保留:
|
||
|
||
- `chart_icon_image`
|
||
- `chart_symbol_code`
|
||
- `chart_label_text`
|
||
- `chart_label_subtext`
|
||
- `chart_fill_style`
|
||
- `chart_fill_pattern`
|
||
- `chart_line_color`
|
||
- `chart_line_width`
|
||
- `chart_text_style`
|
||
- `chart_text_color`
|
||
|
||
### 6.4 建议新增的统一字段
|
||
|
||
为降低上层复杂度,建议新增:
|
||
|
||
- `object_domain`
|
||
- `object_class`
|
||
- `object_subclass`
|
||
- `object_display_name`
|
||
- `source_layer_native`
|
||
- `native_code_type`
|
||
- `native_code_value`
|
||
|
||
其中:
|
||
|
||
- `source_layer_native` 可直接承接现有 `source_layer`
|
||
- `object_subclass` 可直接复用 `canonical_object_type`
|
||
|
||
## 7. NewPEC 到 NavSea 的映射设计
|
||
|
||
### 7.1 映射目标
|
||
|
||
映射的目标不是简单改名字,而是建立一套完整、可回查、可审计的自我体系。
|
||
|
||
映射应回答:
|
||
|
||
1. 一个 `NewPEC` feature 属于哪个 `NavSea object_domain`
|
||
2. 它属于哪个 `object_class`
|
||
3. 它属于哪个 `object_subclass`
|
||
4. 映射依据是什么
|
||
5. 是否仍能回到原始 `class_code / display_code`
|
||
|
||
### 7.2 建议映射键
|
||
|
||
建议映射规则至少按以下组合匹配:
|
||
|
||
- `source_layer_native`
|
||
- `geometry_type`
|
||
- `native_code_type`
|
||
- `native_code_value`
|
||
- 必要时加 `canonical_object_type`
|
||
|
||
说明:
|
||
|
||
- 航标类通常以 `display_code` 为主
|
||
- 危险物 / 设施类通常以 `class_code` 为主
|
||
- 地名、深度、净空类则常常以 `source_layer + 业务字段` 判定
|
||
|
||
### 7.3 建议规则表
|
||
|
||
建议新增一张正式映射表,例如:
|
||
|
||
- `navsea_object_taxonomy_rules`
|
||
|
||
建议字段:
|
||
|
||
- `taxonomy_rule_id`
|
||
- `bundle_id`
|
||
- `source_layer_native`
|
||
- `geometry_type`
|
||
- `native_code_type`
|
||
- `native_code_value`
|
||
- `canonical_object_type_in`
|
||
- `object_domain`
|
||
- `object_class`
|
||
- `object_subclass`
|
||
- `object_display_name`
|
||
- `rule_priority`
|
||
- `rule_reason`
|
||
- `status`
|
||
|
||
### 7.4 规则来源要求
|
||
|
||
每条映射规则都应有明确来源,来源可以是:
|
||
|
||
- 原始 `NewPEC` 码值定义
|
||
- 既有 style / sprite 行为
|
||
- 现有数据库映射规则
|
||
- 既有审计结论
|
||
- 专家确认
|
||
|
||
禁止出现:
|
||
|
||
- 无来源、不可解释的“拍脑袋分类”
|
||
|
||
## 8. 点击查询模型
|
||
|
||
### 8.1 点击查询的目标
|
||
|
||
点击查询返回结果不应只告诉用户“命中了哪个 style layer”,而应返回:
|
||
|
||
1. 命中了哪个真实海图对象
|
||
2. 这个对象是什么
|
||
3. 它有哪些业务细节
|
||
4. 当前它如何被渲染
|
||
|
||
### 8.2 推荐返回结构
|
||
|
||
建议 `native MapLibre` 点击拾取最终返回如下结构:
|
||
|
||
```json
|
||
{
|
||
"identity": {
|
||
"fid": "13025299",
|
||
"source_layer_native": "p航行危険障害物",
|
||
"source_layer_std": "navigation_hazard_point",
|
||
"geometry_type": "Point",
|
||
"native_code_type": "class_code",
|
||
"native_code_value": "404"
|
||
},
|
||
"object": {
|
||
"object_domain": "hazard",
|
||
"object_class": "wreck",
|
||
"object_subclass": "dangerous_fully_submerged_wreck",
|
||
"canonical_object_type": "dangerous_fully_submerged_wreck",
|
||
"object_display_name": "危险全沉没船"
|
||
},
|
||
"properties": {
|
||
"least_depth_m": 7.2,
|
||
"light_color_code": null,
|
||
"clearance_height_m": null,
|
||
"name_ja": null
|
||
},
|
||
"render": {
|
||
"chart_icon_image": "symbol-daytime-404",
|
||
"chart_symbol_code": "wreck",
|
||
"chart_label_text": null
|
||
}
|
||
}
|
||
```
|
||
|
||
### 8.3 点击判定逻辑
|
||
|
||
推荐顺序:
|
||
|
||
1. 先取点击范围内所有可见候选 feature
|
||
2. 先按 `fid` 聚合
|
||
3. 再按 `source_layer_native + native_code_type + native_code_value + geometry_type` 兜底聚合
|
||
4. 聚合后返回一个“真实物体”而不是多个分裂的 render hit
|
||
|
||
### 8.4 点击展示逻辑
|
||
|
||
面板建议固定分为四块:
|
||
|
||
- `物体身份`
|
||
- `物体分类`
|
||
- `物体细节`
|
||
- `当前渲染`
|
||
|
||
这样可以清楚区分:
|
||
|
||
- 它是谁
|
||
- 它是什么
|
||
- 它有哪些航行含义
|
||
- 它在地图上为何画成现在这样
|
||
|
||
## 9. 与 CPA / 安全判断的关系
|
||
|
||
### 9.1 设计原则
|
||
|
||
CPA 或其他安全判断不应直接依赖渲染字段,而应依赖对象语义和业务属性。
|
||
|
||
也就是说:
|
||
|
||
- `chart_icon_image` 不能作为安全逻辑输入
|
||
- `object_domain / object_class / object_subclass` 才是主要业务入口
|
||
|
||
### 9.2 对 CPA 重要的对象属性
|
||
|
||
至少应能稳定读取:
|
||
|
||
- `least_depth_m`
|
||
- `depth_value_m`
|
||
- `clearance_height_m`
|
||
- `light_color_code`
|
||
- `light_sector_mode`
|
||
- `bearing_deg`
|
||
- `object_domain`
|
||
- `object_class`
|
||
- `hazard severity` 或等价危险等级字段
|
||
|
||
### 9.3 安全对象建议单独分层
|
||
|
||
建议在 `object_domain` 之上再建立一个轻量级安全标签:
|
||
|
||
- `safety_category`
|
||
|
||
例如:
|
||
|
||
- `navigation_aid`
|
||
- `navigation_hazard`
|
||
- `depth_constraint`
|
||
- `clearance_constraint`
|
||
- `facility_reference`
|
||
|
||
这样上层业务不必每次都回读复杂 `source_layer` 判定。
|
||
|
||
## 10. 审计设计
|
||
|
||
本文最重要的部分是审计。
|
||
|
||
本设计把审计收口为两条核心硬门禁,外加若干辅助审计。
|
||
|
||
### 10.1 两条核心硬门禁
|
||
|
||
#### A. 物体不丢
|
||
|
||
必须回答:
|
||
|
||
- 原始对象是否在 NavSea 输出中仍能找到等价对象
|
||
- 是否发生:
|
||
- `missing object`
|
||
- `wrong relayer`
|
||
- `identifier lost`
|
||
- `identifier mismatch`
|
||
- `over-merged object`
|
||
|
||
这是第一硬门禁。
|
||
|
||
只要这一条不过,后面渲染相似也不能判通过。
|
||
|
||
#### B. 渲染结果一致
|
||
|
||
必须回答:
|
||
|
||
- 原始版有 icon/text/line/fill 的对象,在 NavSea 输出中是否仍以等价语义渲染
|
||
- 是否出现:
|
||
- icon 丢失
|
||
- 文字丢失
|
||
- 线型/面样式语义画反
|
||
- 危险物 / 航标被画成错误类别
|
||
|
||
这是第二硬门禁。
|
||
|
||
### 10.2 审计总顺序
|
||
|
||
正式顺序固定为:
|
||
|
||
1. 对象保真审计
|
||
2. 分类映射审计
|
||
3. 查询字段完整性审计
|
||
4. render-hit 一致性审计
|
||
5. style 语义审计
|
||
6. AOI / 视觉审计
|
||
7. 公开部署一致性审计
|
||
|
||
其中:
|
||
|
||
- 第 1 层和第 4 层是两条核心硬门禁
|
||
- 第 2、3、5、6、7 层是配套强制审计
|
||
|
||
## 11. 对象保真审计
|
||
|
||
### 11.1 审计目标
|
||
|
||
确认“对象没有丢”。
|
||
|
||
### 11.2 审计对齐键
|
||
|
||
推荐优先级:
|
||
|
||
1. `fid`
|
||
2. `source_layer_native + geometry_type + native_code_type + native_code_value`
|
||
3. `geometry + 稳定业务字段`
|
||
|
||
### 11.3 必查问题
|
||
|
||
- `missing object`
|
||
- `wrong relayer`
|
||
- `identifier lost`
|
||
- `identifier mismatch`
|
||
- `native_code lost`
|
||
- `semantic collapse`
|
||
|
||
其中新增重点:
|
||
|
||
- `native_code lost`
|
||
- 原始 `class_code / display_code` 无法追回
|
||
- `semantic collapse`
|
||
- 多个原始细类被错误压成一个过粗的 NavSea 细类
|
||
|
||
### 11.4 通过条件
|
||
|
||
- 安全关键对象丢失数必须为 `0`
|
||
- `wrong relayer` 必须为 `0`
|
||
- `identifier lost` 必须为 `0`
|
||
- 原始关键码值不可大规模丢失
|
||
|
||
## 12. 分类映射审计
|
||
|
||
### 12.1 审计目标
|
||
|
||
确认从 `NewPEC` 原生码值到 `NavSea` 自有体系的映射是完整、稳定、可解释的。
|
||
|
||
### 12.2 必查问题
|
||
|
||
- 是否存在 `source_layer` 无法映射到任何 `object_domain`
|
||
- 是否存在 `class_code / display_code` 无法映射到任何 `object_class`
|
||
- 是否存在同一原生码被映射到多个冲突分类
|
||
- 是否存在重要对象被映射到 `unclassified`
|
||
|
||
### 12.3 建议输出
|
||
|
||
- `feature_count by object_domain`
|
||
- `feature_count by object_class`
|
||
- `feature_count by object_subclass`
|
||
- `unmapped native_code top list`
|
||
- `conflicting mapping rules`
|
||
|
||
### 12.4 通过条件
|
||
|
||
- 正式输出对象必须都有:
|
||
- `object_domain`
|
||
- `object_class`
|
||
- `object_subclass`
|
||
- 安全关键对象不允许进入:
|
||
- `unclassified`
|
||
|
||
## 13. 查询字段完整性审计
|
||
|
||
### 13.1 审计目标
|
||
|
||
确认交付版不仅“能画”,还“能点开查到关键细节”。
|
||
|
||
### 13.2 必查对象组
|
||
|
||
至少包括:
|
||
|
||
- 桥梁 / 净空限制
|
||
- 深度数字 / 等深线
|
||
- 航标 / 灯标
|
||
- 危险物 / 沉船 / 暗岩 / 洗岩
|
||
- 锚地 / 航路 / 主要设施
|
||
|
||
### 13.3 必查字段
|
||
|
||
按对象组检查:
|
||
|
||
- 桥高 / 净空:
|
||
- `clearance_height_m`
|
||
- 深度:
|
||
- `depth_value_m`
|
||
- `least_depth_m`
|
||
- 灯标:
|
||
- `light_color_code`
|
||
- `light_sector_mode`
|
||
- 危险物:
|
||
- `object_class`
|
||
- `object_subclass`
|
||
- `native_code_value`
|
||
|
||
### 13.4 通过条件
|
||
|
||
- 与航行判断直接相关的关键查询字段不能大面积缺失
|
||
- 如果对象在地图上可点击,但关键数字或关键语义字段缺失,应判为不通过
|
||
|
||
## 14. render-hit 一致性审计
|
||
|
||
### 14.1 审计目标
|
||
|
||
确认“渲染结果一致”。
|
||
|
||
### 14.2 审计粒度
|
||
|
||
保持当前项目正式口径:
|
||
|
||
- 按 `feature instance` 粒度审计
|
||
- 保留 tile / zoom 敏感性
|
||
|
||
### 14.3 必比内容
|
||
|
||
- `hit_count_old`
|
||
- `hit_count_new`
|
||
- `hit_types_old`
|
||
- `hit_types_new`
|
||
- icon 名
|
||
- text 值
|
||
- fill 语义
|
||
- line 语义
|
||
- opacity / width / pattern
|
||
|
||
### 14.4 通过条件
|
||
|
||
- 不允许关键对象从“有有效渲染”变成“无有效渲染”
|
||
- 不允许命中层数量相同但语义画反
|
||
- 不允许图标 fallback 误导本体判断
|
||
|
||
## 15. style 语义审计
|
||
|
||
### 15.1 审计目标
|
||
|
||
确认新版 style 忠于旧版 style 的表现语义,而不是重新设计。
|
||
|
||
### 15.2 重点专项
|
||
|
||
- 陆海主判定一致
|
||
- 水上 / 水下 / 露出 / 干出语义一致
|
||
- 危险物、潜堤、暗礁、洗岩、浅水区语义一致
|
||
- render-support 层没有被错误强化
|
||
- 深度数字、净空数字、灯标辅助信息没有被丢掉
|
||
|
||
### 15.3 通过条件
|
||
|
||
- 不允许“画得很像,但安全语义已经反了”
|
||
|
||
## 16. AOI / 视觉审计
|
||
|
||
### 16.1 定位
|
||
|
||
AOI / 视觉审计是强制层,但它不能替代对象保真审计。
|
||
|
||
### 16.2 用途
|
||
|
||
- 校准 backend 审计盲区
|
||
- 复核用户实际看到的问题是否真的被修复
|
||
- 核对密集区点击对象和渲染对象是否一致
|
||
|
||
### 16.3 当前固定基线
|
||
|
||
当前仍应固定使用:
|
||
|
||
- `http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html`
|
||
|
||
不要用视觉相似去覆盖对象丢失事实。
|
||
|
||
## 17. 公开部署一致性审计
|
||
|
||
必须确认:
|
||
|
||
- 页面加载的是当前候选 style
|
||
- 页面加载的是当前候选 tile
|
||
- 版本号已经更新
|
||
- compare 页与候选构建产物一致
|
||
|
||
只要公开页面和候选产物不一致,放行审计就应视为未完成。
|
||
|
||
## 18. 工程版与交付版的职责划分
|
||
|
||
### 18.1 工程版
|
||
|
||
工程版应保留更多 trace 与审计字段,用于:
|
||
|
||
- 规则定位
|
||
- 审计追踪
|
||
- 对象回查
|
||
- 映射调试
|
||
|
||
### 18.2 交付版
|
||
|
||
交付版可以做裁剪,但不应裁掉:
|
||
|
||
- 点击查询必要字段
|
||
- 安全判断必要字段
|
||
- 与原始对象对回必要字段
|
||
|
||
因此建议未来不要把交付版收缩成“只够 style 渲染”的极小集合,而是收缩成:
|
||
|
||
- “足够渲染”
|
||
- “足够查询”
|
||
- “足够审计兜底”
|
||
|
||
## 19. 实施顺序建议
|
||
|
||
建议分 4 步落地。
|
||
|
||
### 第一步:先固定字段模型
|
||
|
||
在 builder 中新增并固化:
|
||
|
||
- `source_layer_native`
|
||
- `native_code_type`
|
||
- `native_code_value`
|
||
- `object_domain`
|
||
- `object_class`
|
||
- `object_subclass`
|
||
- `object_display_name`
|
||
|
||
### 第二步:建立正式映射规则表
|
||
|
||
为 `class_code / display_code -> NavSea taxonomy` 建规则表与 trace。
|
||
|
||
### 第三步:补查询字段清单
|
||
|
||
按对象组梳理交付版必须保留的查询字段,避免“能画不能查”。
|
||
|
||
### 第四步:扩展审计脚本
|
||
|
||
在现有脚本上补 3 类审计:
|
||
|
||
1. 分类映射审计
|
||
2. 查询字段完整性审计
|
||
3. `native_code` 保留审计
|
||
|
||
## 20. 最终放行口径
|
||
|
||
未来正式放行建议固定为以下口径:
|
||
|
||
### 必须全部通过
|
||
|
||
- 对象保真审计通过
|
||
- 分类映射审计通过
|
||
- 查询字段完整性审计通过
|
||
- render-hit 一致性审计通过
|
||
- style 语义审计通过
|
||
- AOI / 视觉审计通过
|
||
- 公开部署一致性审计通过
|
||
|
||
### 其中两条是核心硬门禁
|
||
|
||
- 物体不丢
|
||
- 渲染结果一致
|
||
|
||
### 一句总括
|
||
|
||
`NavSea PBF` 的交付标准不应再是“图大致像了”,而应是:
|
||
|
||
- 对象能对回
|
||
- 语义能解释
|
||
- 细节能查询
|
||
- 渲染能等价
|
||
- 审计能闭环
|
||
|
||
只有这样,这套 PBF 才既能做图,也能做查询、做安全判断、做长期工程演进。
|
||
|
||
## 21. 首版语义定义草案
|
||
|
||
这一节给出当前 `NavSea` 可以直接采用的首版语义定义。
|
||
|
||
目的不是一次性把所有历史对象都做成最终完美 taxonomy,而是先建立一套:
|
||
|
||
- 可解释
|
||
- 可映射
|
||
- 可审计
|
||
- 可逐步细化
|
||
|
||
的统一语义口径。
|
||
|
||
### 21.1 定义层级
|
||
|
||
建议把每个对象的语义定义固定分成三层:
|
||
|
||
1. `object_domain`
|
||
2. `object_class`
|
||
3. `object_subclass`
|
||
|
||
其中:
|
||
|
||
- `object_domain`
|
||
- 业务大域
|
||
- 用于上层筛选、CPA、离线包、风险分组
|
||
- `object_class`
|
||
- 业务大类
|
||
- 用于稳定 API 与审计聚合
|
||
- `object_subclass`
|
||
- 细粒度对象子类
|
||
- 用于 pickup 解释与精细渲染映射
|
||
|
||
### 21.2 首版 object_domain 定义
|
||
|
||
建议当前正式采用以下 `object_domain`。
|
||
|
||
- `navigation_mark`
|
||
- 助航与导航标识对象
|
||
- `hazard`
|
||
- 危险物、障碍物、潜在碍航对象
|
||
- `depth`
|
||
- 深度、等深、深度分带
|
||
- `clearance`
|
||
- 净空、高度、通行限制
|
||
- `anchorage`
|
||
- 锚地、锚泊、抛锚限制
|
||
- `route`
|
||
- 航路、航道、通行边界
|
||
- `facility`
|
||
- 港湾设施、边界设施、结构物
|
||
- `landsea`
|
||
- 陆海主判定对象
|
||
- `seabed`
|
||
- 底质、海底支撑对象
|
||
- `toponym`
|
||
- 地名标注对象
|
||
- `fishery`
|
||
- 渔具、鱼礁、渔业相关对象
|
||
- `support`
|
||
- 仅承担支撑语义、不应直接作为业务主对象的图层
|
||
- `pending`
|
||
- 当前仍未完成语义收口的编码层
|
||
|
||
### 21.3 当前标准层语义定义
|
||
|
||
以下定义基于当前 `Karatsu 20nm final` 实际标准层,以及现有 Domain 原型中的语义口径。
|
||
|
||
#### A. `navigation_mark`
|
||
|
||
- `navigation_marks`
|
||
- 语义定义:
|
||
- 航标、灯标、浮标、灯塔、信标、AIS 航标等导航辅助对象
|
||
- `object_class` 建议:
|
||
- `lighthouse`
|
||
- `beacon`
|
||
- `buoy`
|
||
- `light_buoy`
|
||
- `leading_light`
|
||
- `virtual_aid_to_navigation`
|
||
- `object_subclass` 建议主要来自:
|
||
- `canonical_object_type`
|
||
- `display_code`
|
||
- `shape_class_code`
|
||
- 说明:
|
||
- 这是最典型需要“原生码值 + NavSea 统一语义名”并存的对象组
|
||
|
||
#### B. `hazard`
|
||
|
||
- `navigation_hazard_point`
|
||
- 语义定义:
|
||
- 对航行构成直接危险的点状障碍物
|
||
- `object_class` 建议:
|
||
- `wreck`
|
||
- `rock`
|
||
- `reef`
|
||
- `obstruction`
|
||
|
||
- `navigation_hazard_area`
|
||
- 语义定义:
|
||
- 对航行构成直接危险的面状障碍区
|
||
|
||
- `navigation_hazard_outline`
|
||
- 语义定义:
|
||
- 航行危险区域的边界线
|
||
|
||
- `anchor_caution_hazard_point`
|
||
- 语义定义:
|
||
- 对抛锚、泊船、近岸操作构成注意/限制的点状障碍物
|
||
|
||
- `anchor_caution_hazard_area`
|
||
- 语义定义:
|
||
- 抛锚注意障碍区
|
||
|
||
- `anchor_caution_hazard_outline`
|
||
- 语义定义:
|
||
- 抛锚注意障碍区边界
|
||
|
||
- `submerged_reef_area`
|
||
- 语义定义:
|
||
- 潜堤、潜礁、浅下危险地形区域
|
||
|
||
- `hazard_boundary_outline`
|
||
- 语义定义:
|
||
- 危险界、危险区域外缘边界
|
||
|
||
#### C. `depth`
|
||
|
||
- `depth_contour`
|
||
- 语义定义:
|
||
- 等深线
|
||
|
||
- `depth_contour_overview`
|
||
- 语义定义:
|
||
- 概略等深线
|
||
|
||
- `depth_zone_739`
|
||
- 语义定义:
|
||
- 当前仍带旧编码痕迹的深度分带层
|
||
- 当前域建议:
|
||
- `pending`
|
||
|
||
- `depth_zone_741`
|
||
- 语义定义:
|
||
- 当前仍带旧编码痕迹的深度分带层
|
||
- 当前域建议:
|
||
- `pending`
|
||
|
||
说明:
|
||
|
||
- `depth_zone_*` 当前不建议直接当最终业务语义层
|
||
- 更合理的最终形态应是:
|
||
- `depth_band`
|
||
- `shallow_water_band`
|
||
- `deep_water_band`
|
||
等可解释层名
|
||
|
||
#### D. `clearance`
|
||
|
||
- `clearance_limit_point`
|
||
- 语义定义:
|
||
- 高度/净空限制点标注对象
|
||
- 关键查询字段:
|
||
- `clearance_height_m`
|
||
|
||
- `clearance_limit_line`
|
||
- 语义定义:
|
||
- 高度/净空限制线或关联约束线
|
||
|
||
- `bridge_structure`
|
||
- 语义定义:
|
||
- 桥梁等与净空判断相关的重要结构物
|
||
|
||
#### E. `anchorage`
|
||
|
||
- `anchorage_point`
|
||
- 语义定义:
|
||
- 锚地符号或锚泊点状标识
|
||
|
||
- `anchorage_area`
|
||
- 语义定义:
|
||
- 锚地、锚泊区域
|
||
|
||
- `anchorage_outline`
|
||
- 语义定义:
|
||
- 锚地边界线
|
||
|
||
#### F. `route`
|
||
|
||
- `route_outline`
|
||
- 语义定义:
|
||
- 航路、航道、通行带边界
|
||
|
||
说明:
|
||
|
||
- 当前 `20nm final` style 里主要暴露的是 `route_outline`
|
||
- 未来若要做更完整 route 语义,应进一步引入:
|
||
- `route_area`
|
||
- `route_axis_line`
|
||
- `route_boundary_point`
|
||
|
||
#### G. `facility`
|
||
|
||
- `facility_boundary_point`
|
||
- 语义定义:
|
||
- 港湾设施、边界设施、港口辅助设施等点状对象
|
||
- 说明:
|
||
- 当前语义仍偏宽,后续建议继续细分
|
||
|
||
- `facility_boundary_area`
|
||
- 语义定义:
|
||
- 设施/边界相关区域
|
||
- 当前域建议:
|
||
- `detail`
|
||
- 说明:
|
||
- 更像容器层,后续需继续拆清
|
||
|
||
- `facility_boundary_outline`
|
||
- 语义定义:
|
||
- 设施/边界边线
|
||
|
||
- `onshore_structure_area`
|
||
- 语义定义:
|
||
- 陆上结构物面
|
||
|
||
- `onshore_structure_line`
|
||
- 语义定义:
|
||
- 陆上结构物线
|
||
|
||
- `onshore_structure_point`
|
||
- 语义定义:
|
||
- 陆上结构物点
|
||
|
||
- `pilot_station_point`
|
||
- 语义定义:
|
||
- 引航站点
|
||
|
||
- `clip_outline_754`
|
||
- 语义定义:
|
||
- 旧编码型边界辅助层
|
||
- 当前域建议:
|
||
- `pending`
|
||
|
||
#### H. `landsea`
|
||
|
||
- `land_area`
|
||
- 语义定义:
|
||
- 陆海主判定层中的陆地区域
|
||
- 说明:
|
||
- `land_area` 应继续作为陆海主判定唯一主来源
|
||
|
||
- `baseline_area`
|
||
- 语义定义:
|
||
- 基本线相关面
|
||
- 当前域建议:
|
||
- `safety_extended`
|
||
- 说明:
|
||
- 当前仍偏容器/组合语义,后续需继续收口
|
||
|
||
- `baseline_line`
|
||
- 语义定义:
|
||
- 基本线线层
|
||
|
||
- `baseline_outline`
|
||
- 语义定义:
|
||
- 基本线边界
|
||
|
||
#### I. `seabed`
|
||
|
||
- `seabed_text_point`
|
||
- 语义定义:
|
||
- 底质标注点
|
||
|
||
- `seabed_line`
|
||
- 语义定义:
|
||
- 海底线
|
||
|
||
- `bathymetry_line`
|
||
- 语义定义:
|
||
- 海底地形支撑线
|
||
- 当前域建议:
|
||
- `support`
|
||
- 说明:
|
||
- 它更像支撑线,不宜直接作为最终业务主对象
|
||
|
||
- `hole_area`
|
||
- 语义定义:
|
||
- 穴/凹地/透明支撑区域
|
||
- 当前域建议:
|
||
- `support`
|
||
- 说明:
|
||
- 不应被误解释为陆地或实体设施
|
||
|
||
#### J. `toponym`
|
||
|
||
- `place_label_sea`
|
||
- 语义定义:
|
||
- 海上地名标注
|
||
|
||
- `place_label_land`
|
||
- 语义定义:
|
||
- 陆上地名标注
|
||
|
||
#### K. `fishery`
|
||
|
||
- `fixed_fishing_gear_area`
|
||
- 语义定义:
|
||
- 定置渔具或渔业占用区域
|
||
|
||
### 21.4 当前仍属于待收敛或容器语义的层
|
||
|
||
以下层当前不建议被视为最终稳定的业务语义层,应继续在后续 builder / taxonomy 中细化:
|
||
|
||
- `baseline_area`
|
||
- `baseline_line`
|
||
- `baseline_outline`
|
||
- `facility_boundary_area`
|
||
- `facility_boundary_outline`
|
||
- `bathymetry_line`
|
||
- `hole_area`
|
||
- `depth_zone_739`
|
||
- `depth_zone_741`
|
||
- `clip_outline_754`
|
||
|
||
这些层的问题不是不能用,而是:
|
||
|
||
- 语义过宽
|
||
- 仍带旧编码/制图容器痕迹
|
||
- 容易被错误当作业务主对象
|
||
|
||
### 21.5 当前可以直接作为稳定业务对象层的部分
|
||
|
||
以下层已经足够接近稳定业务语义,可直接作为 pickup 和业务查询的首版入口:
|
||
|
||
- `navigation_marks`
|
||
- `navigation_hazard_point`
|
||
- `anchor_caution_hazard_point`
|
||
- `depth_contour`
|
||
- `depth_contour_overview`
|
||
- `clearance_limit_point`
|
||
- `clearance_limit_line`
|
||
- `anchorage_area`
|
||
- `anchorage_point`
|
||
- `route_outline`
|
||
- `pilot_station_point`
|
||
- `place_label_sea`
|
||
- `place_label_land`
|
||
- `seabed_text_point`
|
||
- `land_area`
|
||
|
||
### 21.6 语义定义与审计的关系
|
||
|
||
语义定义不是写出来就结束,必须进入审计。
|
||
|
||
至少应新增以下检查:
|
||
|
||
1. 每个正式输出 `feature` 必须有:
|
||
- `object_domain`
|
||
- `object_class`
|
||
- `object_subclass`
|
||
|
||
2. 每个标准层必须有明确语义定义,不能长期停留在:
|
||
- `unknown`
|
||
- `pending`
|
||
|
||
3. 所有安全关键层不得退回到纯容器语义或支撑语义
|
||
|
||
4. 视觉审计时,不允许:
|
||
- 用 `support` 对象冒充业务主对象
|
||
- 用容器层视觉相似掩盖真实对象语义漂移
|
||
|
||
## 22. 核心规则记录
|
||
|
||
本节把当前已经讨论收口、后续不应再反复摇摆的核心规则固定下来。
|
||
|
||
### 22.1 唯一对象主键
|
||
|
||
- 每个原始 `NewPEC` 对象只认一个主键:
|
||
- `fid`
|
||
- `NewPEC fid` 与 `NavSea fid` 允许采用不同编码形式
|
||
- 但两者必须:
|
||
- 一对一
|
||
- 稳定
|
||
- 可逆
|
||
|
||
这意味着:
|
||
|
||
- 对象 identity 只有一个
|
||
- 不再为对象对应额外发明第二套 identity 字段
|
||
|
||
### 22.2 主对象一对一
|
||
|
||
- 当前正式口径坚持:
|
||
- `1 raw object -> 1 primary NavSea feature`
|
||
- 不把一个原始对象默认拆成多个业务主 feature
|
||
- 如后续确需派生辅助 feature,也只能作为:
|
||
- `helper / support feature`
|
||
- 不得替代主对象
|
||
|
||
### 22.3 统一对象载荷
|
||
|
||
- 同一个 `feature` 的同一套属性同时服务:
|
||
- 渲染
|
||
- pickup
|
||
- CPA / 安全判断
|
||
- 审计
|
||
- 不再设计:
|
||
- 一套只给渲染的对象模型
|
||
- 一套只给查询的对象模型
|
||
- 一套只给安全判断的对象模型
|
||
|
||
### 22.4 审计全部围绕 fid
|
||
|
||
- 对象保真审计主键:
|
||
- `fid`
|
||
- 语义漂移审计:
|
||
- 看同一 `fid` 的语义属性是否漂移
|
||
- 渲染一致性审计:
|
||
- 看同一 `fid` 的渲染结果是否等价
|
||
|
||
因此审计结构固定为:
|
||
|
||
1. `fid` 是否还在
|
||
2. 该 `fid` 的语义是否还对
|
||
3. 该 `fid` 的渲染是否仍与 `NewPEC` 等价
|
||
|
||
### 22.5 不做“查询字段 vs 渲染字段”硬分离
|
||
|
||
- 当前项目不建议把:
|
||
- `pickup` 查询字段
|
||
- 渲染字段
|
||
完全拆成两套数据源
|
||
- 原因:
|
||
- 二者高度重合
|
||
- 容易形成双真相源
|
||
- 不利于离线、native、本地判断与审计闭环
|
||
|
||
正确方向是:
|
||
|
||
- 一个统一对象载荷
|
||
- 但做“必要最小集”裁剪
|
||
- 剔除纯 debug / 纯 trace / 纯中间推导字段
|
||
|
||
## 23. 当前 Karatsu 20nm Final 的调整判断
|
||
|
||
本节回答一个现实问题:
|
||
|
||
- 当前 `Karatsu 20nm final` 是否需要重写 PBF / style
|
||
|
||
结论:
|
||
|
||
- 当前不建议重写整体架构
|
||
- 建议在现有 `20nm final` 基础上做增量调整
|
||
|
||
### 23.1 当前 20nm final 已具备的基础
|
||
|
||
当前这条线已经具备:
|
||
|
||
- 标准层收口
|
||
- 对象保真通过
|
||
- 视觉 compare 基线稳定
|
||
- 关键分类/渲染字段已物化
|
||
|
||
因此它已经是一条:
|
||
|
||
- 可交付
|
||
- 可审计
|
||
- 可继续演进
|
||
|
||
的基础线,而不是需要推倒重来。
|
||
|
||
### 23.2 当前不建议做的事
|
||
|
||
当前不建议:
|
||
|
||
- 改成完全新的分层体系后再重做整套 style
|
||
- 为 pickup 单独再造第二套 query 数据模型
|
||
- 把查询与渲染彻底拆成两套接口
|
||
- 仅为了语义理想化而破坏当前 compare 审计基线
|
||
|
||
### 23.3 当前建议调整 PBF 的部分
|
||
|
||
当前更应优先调整的是:
|
||
|
||
#### A. 补统一语义字段
|
||
|
||
建议在当前 `20nm final` PBF 中增量补入:
|
||
|
||
- `object_domain`
|
||
- `object_class`
|
||
- `object_subclass`
|
||
|
||
说明:
|
||
|
||
- 这三个字段是当前统一对象模型最缺的一层
|
||
- 它们直接服务 pickup、CPA 和业务消费
|
||
- 加它们不要求推翻现有标准层和 style
|
||
|
||
#### B. 保留现有关键原生码与渲染字段
|
||
|
||
继续保留:
|
||
|
||
- `class_code`
|
||
- `display_code`
|
||
- `shape_class_code`
|
||
- `canonical_object_type`
|
||
- 关键 `chart_*`
|
||
- 关键数值字段
|
||
|
||
说明:
|
||
|
||
- 这些字段当前已经被 style、解释和审计共同依赖
|
||
- 不应为了追求“纯新体系”而过早删掉
|
||
|
||
#### C. 保持 fid 作为 primary feature id
|
||
|
||
建议继续坚持:
|
||
|
||
- `feature.id = fid` 或与之等价的稳定主键口径
|
||
|
||
这样 native 端 pickup、对象保真审计、左右对照都最直接。
|
||
|
||
### 23.4 当前建议调整 style 的部分
|
||
|
||
style 当前不建议大改架构,但建议注意以下原则:
|
||
|
||
#### A. style 继续主要消费标准层 + 物化渲染字段
|
||
|
||
- 继续使用当前标准层
|
||
- 继续优先消费:
|
||
- `chart_icon_image`
|
||
- `chart_label_text`
|
||
- `chart_fill_style`
|
||
- `chart_line_color`
|
||
等物化字段
|
||
|
||
#### B. style 不承担对象 identity 解释职责
|
||
|
||
- style 的职责是“画”
|
||
- 不负责“定义对象身份”
|
||
- pickup 与审计都应围绕 `fid` 和统一语义字段解释对象
|
||
|
||
#### C. compare 页不换基线,只升级 pickup 逻辑
|
||
|
||
- 不切换当前固定 compare URL
|
||
- 不另建新的主视觉对比页
|
||
- 若要改动优先改:
|
||
- 点击拾取逻辑
|
||
- 面板展示结构
|
||
- 左右对照方式
|
||
|
||
### 23.5 当前最推荐的调整顺序
|
||
|
||
建议按下面顺序进行:
|
||
|
||
1. 先给当前 builder 增补统一语义字段
|
||
2. 再用同一批字段改 pickup 解释层
|
||
3. 再补相关审计
|
||
4. 最后才考虑是否需要进一步精简或重构 style
|
||
|
||
## 24. Pickup 消费方案
|
||
|
||
本节定义 native 侧如何消费当前及后续增强后的 `NavSea PBF`。
|
||
|
||
### 24.1 Pickup 的目标
|
||
|
||
pickup 的目标不是“点中了哪个 render layer”,而是:
|
||
|
||
1. 找到点击命中的真实对象
|
||
2. 返回这个对象的统一语义
|
||
3. 返回该对象的关键查询属性
|
||
4. 返回当前命中的渲染层信息
|
||
|
||
### 24.2 输入
|
||
|
||
native 端输入:
|
||
|
||
- 点击屏幕坐标
|
||
- 当前地图缩放级
|
||
- 当前视图内已加载的 `NavSea` source
|
||
|
||
### 24.3 查询方式
|
||
|
||
建议使用:
|
||
|
||
- `queryRenderedFeatures`
|
||
|
||
但不要只查单像素点,建议用:
|
||
|
||
- 点击点周围 `6px ~ 10px` 小范围
|
||
|
||
说明:
|
||
|
||
- 海图符号小且密集
|
||
- 单点查询容易错过目标
|
||
|
||
### 24.4 候选过滤
|
||
|
||
先过滤到:
|
||
|
||
- 当前 `NavSea` source
|
||
- 当前业务关注的渲染层
|
||
|
||
必要时对 support/background 降权。
|
||
|
||
### 24.5 候选聚合主键
|
||
|
||
所有候选 feature 必须先按:
|
||
|
||
- `feature.id`
|
||
|
||
聚合。
|
||
|
||
这里的设计前提是:
|
||
|
||
- `feature.id` 与 `fid` 等价或可稳定映射
|
||
|
||
这一步非常关键,因为:
|
||
|
||
- 同一个对象可能命中 icon/text/outline 多个 render layer
|
||
- pickup 最终应返回一个对象,不是多个分裂的 render hit
|
||
|
||
### 24.6 候选排序
|
||
|
||
同一点击区域内多个 `fid` 候选时,建议排序优先级:
|
||
|
||
1. `navigation_marks`
|
||
2. `navigation_hazard_point`
|
||
3. `anchor_caution_hazard_point`
|
||
4. `clearance_limit_point`
|
||
5. 其他点对象
|
||
6. 线对象
|
||
7. 面对象
|
||
8. support / background
|
||
|
||
如果同一对象内部有多个 render hit,展示时可保留全部命中层,但只选一个代表对象。
|
||
|
||
### 24.7 Pickup 返回结构
|
||
|
||
建议 native 层最终统一返回:
|
||
|
||
```json
|
||
{
|
||
"fid": 12007897,
|
||
"source_layer_std": "navigation_marks",
|
||
"geometry_type": "Point",
|
||
"object_domain": "navigation_mark",
|
||
"object_class": "lighthouse",
|
||
"object_subclass": "harbor_lighthouse",
|
||
"canonical_object_type": "harbor_lighthouse",
|
||
"properties": {
|
||
"display_code": "30100005",
|
||
"class_code": null,
|
||
"shape_class_code": null,
|
||
"depth_value_m": null,
|
||
"least_depth_m": null,
|
||
"clearance_height_m": null,
|
||
"light_color_code": "white",
|
||
"light_sector_mode": "sector",
|
||
"name_ja": "平戸牛ケ首灯台"
|
||
},
|
||
"render": {
|
||
"chart_icon_image": "symbol-daytime-301",
|
||
"chart_symbol_code": "lighthouse",
|
||
"render_hit_layers": [
|
||
"navigation-mark-icon",
|
||
"navigation-mark-text"
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 24.8 Pickup 面板展示建议
|
||
|
||
建议 pickup UI 固定展示四块:
|
||
|
||
1. `对象`
|
||
- `fid`
|
||
- `source_layer_std`
|
||
2. `分类`
|
||
- `object_domain`
|
||
- `object_class`
|
||
- `object_subclass`
|
||
3. `细节`
|
||
- 水深
|
||
- 净空
|
||
- 灯光
|
||
- 名称
|
||
4. `渲染`
|
||
- 当前命中 render layer
|
||
- icon
|
||
- text
|
||
|
||
### 24.9 Pickup 与 CPA 的关系
|
||
|
||
pickup 不应定义一套独立于安全判断的数据模型。
|
||
|
||
正确做法是:
|
||
|
||
- pickup 展示的就是对象统一语义模型的一部分
|
||
- CPA / 安全判断消费的也是同一对象上的同一组语义字段
|
||
|
||
也就是说:
|
||
|
||
- `pickup` 是展示层
|
||
- `CPA` 是判定层
|
||
- 但二者读取同一份对象语义
|
||
|
||
### 24.10 当前 compare 页建议改法
|
||
|
||
当前 compare 页的点击逻辑还是:
|
||
|
||
- `queryRenderedFeatures(event.point)`
|
||
- 直接取 `features[0]`
|
||
|
||
这只适合临时 inspect,不适合作为正式 pickup 逻辑。
|
||
|
||
建议后续改成:
|
||
|
||
1. 查询点击小范围候选
|
||
2. 先按 `feature.id` 聚合
|
||
3. 再按对象优先级选代表对象
|
||
4. 面板展示统一对象结构
|
||
5. 左右页如果命中同一 `fid`,则做并排对照
|
||
|
||
## 25. Pickup 规则字典与解释器
|
||
|
||
当前建议正式采用:
|
||
|
||
- 规则字典:
|
||
- [navsea-pickup-rules.v1.json](/root/sourceserver/pbf/src/pbf/navsea-pickup-rules.v1.json)
|
||
- JS 前端解释器:
|
||
- [navsea-pickup-interpreter.js](/root/sourceserver/pbf/src/pbf/navsea-pickup-interpreter.js)
|
||
- TS 前端解释器:
|
||
- [navsea-pickup-interpreter.ts](/root/sourceserver/pbf/src/pbf/navsea-pickup-interpreter.ts)
|
||
|
||
### 25.1 为什么采用“规则字典 + 薄解释器”
|
||
|
||
原因:
|
||
|
||
- 前端可以本地判读,不增加 PBF 容量
|
||
- 规则可版本化、可审计、可和 builder / style 同步管理
|
||
- 不把所有解释逻辑写死在前端 if/else 中
|
||
- 后续补 `object_domain / object_class / object_subclass` 后,可以平滑过渡
|
||
|
||
### 25.2 当前解释器职责
|
||
|
||
解释器当前职责固定为:
|
||
|
||
1. 接收 `queryRenderedFeatures` 返回的候选 feature
|
||
2. 按 `feature.id` 聚合
|
||
3. 按规则字典匹配 `source_layer_std`
|
||
4. 若前端传入 `click_lnglat`,则在同分候选间优先选离点击点最近的对象
|
||
5. 结合规则字典中的 `interaction_role` 与 `pickup_priority` 选主对象
|
||
6. 生成统一 pickup 结果
|
||
|
||
解释器不负责:
|
||
|
||
- 再造对象 identity
|
||
- 替代 style 做渲染判断
|
||
- 替代审计脚本做最终放行判定
|
||
|
||
### 25.3 当前规则字典职责
|
||
|
||
规则字典负责声明:
|
||
|
||
- 每个标准层属于哪个 `object_domain`
|
||
- 当前默认 `object_class`
|
||
- 当前优先看的原生码字段
|
||
- pickup 标题字段优先级
|
||
- pickup 细节字段清单
|
||
- render 信息回显字段清单
|
||
- `semantic_status`
|
||
- `interaction_role`
|
||
- `pickup_priority`
|
||
- `render_layer_groups.primary / area / info / ignore`
|
||
|
||
### 25.4 更新规则
|
||
|
||
规则字典不是要求每次纯视觉微调都改。
|
||
|
||
必须同步更新的情形是:
|
||
|
||
- PBF 标准层发生变化
|
||
- 某层的关键分类字段发生变化
|
||
- style 对某层的主渲染字段依赖发生变化
|
||
- 新增正式支持 pickup 的层
|
||
- 可交互 render layer 分组发生变化
|
||
|
||
### 25.5 当前消费建议
|
||
|
||
当前 native / web 端消费建议:
|
||
|
||
1. 加载 `navsea-pickup-rules.v1.json`
|
||
2. 优先读取 `render_layer_groups.primary / area / info / ignore`
|
||
3. 先做精确点查:
|
||
- `area + primary + info`
|
||
4. 精确点查未命中时,再做小范围补查:
|
||
- `primary + info`
|
||
5. 把候选数组喂给对应解释器
|
||
6. 直接展示返回的:
|
||
- `primary`
|
||
- `candidates`
|
||
7. 后续如果补入统一语义字段,再逐步把规则字典从“判读主来源”降为“兼容补充层”
|