chore: 全量快照提交以防磁盘风险

This commit is contained in:
OpenAI Codex
2026-04-08 19:32:25 +08:00
parent 86726e3247
commit 4f96d7be91
243 changed files with 49757 additions and 343 deletions

View File

@@ -0,0 +1,105 @@
# NavSea Chart Domain Layer Catalog
本文列出当前 `NavSea_Chart_Domain_Model_v1` 中三层逻辑域的全部 layer并说明每个 layer 主要承载什么对象/内容。
## Safety Core
这一层属于最低安全底线,缺失时不应被视为可安全航行表达。
| Layer | 中文语义 | 主要包含内容 |
|---|---|---|
| `depth_contour` | 等深线 | 主要等深线、本航海尺度下的重要水深分界线及其水深数字承载线。 |
| `depth_contour_overview` | 概略等深线 | 小比例尺或概略表达下的等深线,用于补充整体海底起伏和水深梯度。 |
| `hazard_boundary_line` | 危险界线 | 直接表达危险范围或危险界的线性对象。 |
| `hazard_boundary_outline` | 危险界边界 | 危险区域的边框、轮廓或强调线。 |
| `land_area` | 陆地区域 | 陆地面,岸线内陆地区域,是最低安全判断必须存在的地形基础,同时也是陆海二分的主判定层。 |
| `navigation_hazard_area` | 航行危险障害物面 | 会直接影响通航安全的危险区域面,如航行危险障碍区。 |
| `navigation_hazard_outline` | 航行危险障害物边界 | 航行危险区域的边界轮廓线。 |
| `navigation_hazard_point` | 航行危险障害物点 | 航行危险点对象,如暗礁、危险障碍点、沉船类危险点等。 |
| `navigation_marks` | 航标/灯标/浮标点 | 灯台、灯浮标、航标、浮标等直接承担导助航作用的点对象。 |
| `fixed_fishing_gear_area` | 定置渔具区域 | 定置渔具、渔业相关作业区域面,属于航行规避时必须感知的安全底线信息。 |
| `submerged_reef_area` | 潜堤/潜礁区域 | 潜堤、潜礁等低于水面的危险地形区域。 |
## Safety Extended
这一层属于重要航海信息,但缺失时不一定立刻构成最低安全失效。
| Layer | 中文语义 | 主要包含内容 |
|---|---|---|
| `anchor_caution_hazard_area` | 抛锚注意障害物面 | 会影响抛锚决策的障碍区域面,例如锚泊注意障碍区域、鱼礁/障碍物相关警示面容器。 |
| `anchor_caution_hazard_outline` | 抛锚注意障害物边界 | 上述抛锚注意障碍区域的边线、虚线或边界轮廓。 |
| `anchor_caution_hazard_point` | 抛锚注意障害物点 | 与抛锚行为直接相关的点状障碍物、鱼礁、险恶物等点对象。 |
| `anchorage_area` | 锚地/锚泊地区域 | 锚地、锚泊区、检疫锚地等可锚泊区域面。 |
| `anchorage_outline` | 锚地边界 | 锚地边界线、锚泊区域轮廓。 |
| `anchorage_point` | 锚地符号点 | 锚地图标、锚泊区点状符号。 |
| `baseline_area` | 基本线相关面 | 与基本线体系相关的面性容器,目前仍偏制图容器语义。 |
| `baseline_line` | 基本线线层 | 基本线主线。 |
| `baseline_outline` | 基本线边界 | 基本线轮廓或配套边线。 |
| `bridge_structure` | 桥梁等结构物面 | 桥梁、桥区等可能影响通航净空或航道通过的结构物。 |
| `clearance_limit_line` | 高度/净空限制线 | 高度限制、净空限制相关线对象。 |
| `clearance_limit_point` | 高度限制点标注 | 高度限制点、净空值标注点。 |
| `leading_line_outline` | 导标/引导线边界 | 导标线、引导线等边界或强调线。 |
| `onshore_structure_area` | 陆上结构物面 | 靠近岸线、与海图表达相关的陆上结构物面。 |
| `onshore_structure_line` | 陆上结构物线 | 上述陆上结构物的线性表达。 |
| `onshore_structure_point` | 陆上结构物点 | 陆上结构物点对象或点符号。 |
| `pilot_station_point` | 引航站点 | 引航站、引航相关服务点。 |
| `route_area` | 航路区域 | 航路面、通航区域面。 |
| `route_axis_line` | 航路线/航路轴线 | 航路中线、航路轴线。 |
| `route_boundary_point` | 航路边界标注点 | 航路边界相关点标注或点状符号。 |
| `route_outline` | 航路边界 | 航路外框、边界轮廓。 |
## Detail
这一层属于细节信息层,缺失不会破坏最低安全表达,但会降低海图完整性和可读性。
| Layer | 中文语义 | 主要包含内容 |
|---|---|---|
| `bathymetry_line` | 海底地形支撑线 | 海底地形辅助线、非最终业务语义主层,但对海底起伏阅读有帮助。 |
| `facility_boundary_area` | 设施/边界相关区域 | 港区设施、边界性容器面、辅助设施面等。 |
| `facility_boundary_area_transparent` | 透明设施/边界区域 | 透明面表达的设施/边界区域。 |
| `facility_boundary_outline` | 设施/边界边线 | 设施边线、边界轮廓。 |
| `facility_boundary_point` | 设施/边界符号点 | 设施相关点符号、辅助边界点符号。 |
| `hole_area` | 穴/凹地区域 | 穴地、凹地等面性补充表达。 |
| `place_label_land` | 陆上地名标注 | 陆上地名、岛屿名称、山体名称等。 |
| `place_label_sea` | 海上地名标注 | 海湾、海域、岛礁相关海上名称。 |
| `seabed_line` | 海底线 | 海底相关线性对象,通常是底质/海底辅助线。 |
| `seabed_text_point` | 底质标注点 | 底质文字,如泥、沙、砾、壳等底质缩写/名称。 |
## 说明
### 1. 这里列的是逻辑语义层,不是旧样式 `layer id`
例如:
- `depth_contour`
- `navigation_marks`
- `land_area`
这些是 Domain 标准 layer。
它们不同于旧样式里的 `layer id`,例如:
- `#b#L等深線`
- `#b#d2#d5#d10#at#S3#S航路標識群`
旧样式 `layer id` 只是制图层命名,不是 Domain 语义层命名。
### 2. 这里列的是当前 v1 域模型,不包含 `domain_pending`
像下面这些仍属于待重建层:
- `depth_zone_739`
- `depth_zone_741`
- `clip_outline_754`
它们不在本清单的三层正式域里。
### 3. 某些 layer 仍带“容器”性质
例如:
- `baseline_area`
- `facility_boundary_area`
- `bathymetry_line`
这些当前已足够支持 `v1`,但后续可能继续细拆成更明确的业务语义层。

View File

@@ -0,0 +1,596 @@
# NavSea Chart Domain Model v1
## 1. 目的
本文件定义 NavSea 在“去掉交付版 `pbf` 对旧日文 layer 体系依赖”之后面向渲染、离线包、Tile Resolver 和业务消费的 **语义分层模型**
这不是旧 `source-layer` 的简单改名,而是一次 **按语义重建 layer domain** 的设计。
目标:
- 让交付版 `pbf` 的 layer 结构按航海语义组织
- 为离线最小包 / 增强包 / 细节包提供稳定结构
- 为 Tile Resolver 提供明确的优先级
- 为后续“去旧字段依赖”“去日文化技术依赖”提供域模型基础
- 为审计提供明确的验收口径
## 2. 核心结论
NavSea 不应只分成 `Safety / Detail` 两层,而应分成 **三层语义域**
1. `safety_core`
2. `safety_extended`
3. `detail`
同时再保留一个过渡状态:
4. `domain_pending`
其中:
- `safety_core`
- 生存核心层
- 离线最小包必须包含
- Tile Resolver 永远优先返回
- `safety_extended`
- 增强安全层
- 对航海有价值,但缺失不会立刻致命
- 建议缓存,可离线降级
- `detail`
- 细节层
- 信息丰富,但不是安全底线
- 可延迟加载,甚至可完全缺失
- `domain_pending`
- 语义尚未完成重建的过渡层
- 不能直接进入最终交付域模型
## 3. 设计原则
### 3.1 这是“语义分层”,不是“旧 layer 改英文名”
域模型的判断依据应是:
- 航海风险
- 是否属于安全底线
- 是否必须离线存在
- 是否属于细节补充
不应只依据:
-`source-layer`
- 旧编码号
- 当前样式中是否好画
### 3.2 物体优先,图层其次
最终分层应该优先考虑对象语义,而不是历史制图层名。
例如:
- `navigation_marks`
- 虽然来自点层,但本质是安全核心对象
- `place_label_sea`
- 虽然在视觉上重要,但不属于安全底线
### 3.3 逻辑层三层,物理分发两包
推荐结构:
- 逻辑域模型:三层
- `safety_core`
- `safety_extended`
- `detail`
- 物理分发模型:两包
- `safety`
- `detail`
其中:
- `safety = safety_core + safety_extended`
- `detail = detail`
如果需要极简离线模式,可额外定义:
- `base_pack = safety_core`
### 3.4 安全层不得被细节层替代
这是一个硬约束:
- 任意 `detail` feature 不得被视为 `safety_core` 的替代来源
即使某个 `detail` 对象在视觉上“看起来像”危险物、边界或航标,也不能因为它恰好被画出来,就把它当作安全底线的一部分。
原因:
- `detail` 本来就是允许缺失的
- 离线模式下,`detail` 可能根本不下载
- 如果系统把 `detail` 当作 `safety_core` 的替代,会导致错误安全感
因此:
- `safety_core` 必须由明确归入 `safety_core` 的对象独立构成
- 不允许通过 `detail` 的“视觉相似性”补齐安全层
### 3.5 Resolver 以物理包为最小分发单位
`v1` 阶段必须明确限制客户端复杂度:
- Tile Resolver 的最小分发单位是物理包
- 不在客户端做 feature 级或 layer 级重组
也就是说Resolver 优先返回:
- `safety`
- `detail`
而不是:
- 从某个 tile 中抽几个 `safety_core` layer
- 再拼几个 `detail` layer
- 然后在客户端重新生成一块新 `pbf`
原因:
- 客户端复杂度会显著增加
- 缓存模型会被打碎
- 调试、审计、回放都会变复杂
- 第一阶段很容易陷入过度工程
因此 `v1` 原则是:
- 逻辑上按 domain 建模
- 物理上按包分发
- 客户端只做“选包”,不做“重组包”
### 3.6 `land_area` 是陆海主判定层
为了支持快速、稳定地将陆地与海洋分开渲染,`v1` 明确规定:
- `land_area` 是陆海二分的唯一主来源
- `land_area` 内部视为陆地
- `land_area` 外部默认视为海域/水域背景
同时明确:
- `baseline_area`
- `baseline_line`
- `baseline_outline`
- `onshore_structure_*`
- 港岸结构、防波堤、码头边线
这些对象可以辅助表达岸线和港湾结构,但**不作为陆海主判定层**。
这条规则的目的,是让显示层和后续 Resolver / 切包逻辑都能用一条简单规则完成陆海分离,而不需要在多个 layer 之间做启发式拼接判断。
## 4. 域定义
### 4.1 `safety_core`
定义:
- 没有它就不该航行
- 离线底线包必须存在
- 缺失会直接影响最低安全判断
典型特征:
- 航行危险
- 航标
- 水深核心
- 危险地形
- 地形基础参考
### 4.2 `safety_extended`
定义:
- 对航行明显重要
- 但缺失不会立刻让系统失去最低安全能力
典型特征:
- 锚地
- 净空/限制
- 重要结构物
- 基本边界参考
### 4.3 `detail`
定义:
- 丰富表达、增强理解、提升体验
- 但不影响最低安全底线
典型特征:
- 地名
- 底质
- 次级边界
- 支撑线
- 展示性文字
### 4.4 `domain_pending`
定义:
- 当前尚未完成语义重建
- 仍然带旧编码痕迹
- 只能作为过渡层,不得直接当最终域模型交付
典型特征:
- 编码型 layer
- 仅具“稳定占位名”,不具业务语义
## 5. 第一轮域归类
以下归类是当前讨论后的 `v1` 基线。
### 5.1 `safety_core`
- `navigation_hazard_area`
- `navigation_hazard_outline`
- `navigation_hazard_point`
- `depth_contour`
- `depth_contour_overview`
- `navigation_marks`
- `fixed_fishing_gear_area`
- `land_area`
- `submerged_reef_area`
### 5.2 `safety_extended`
- `anchor_caution_hazard_area`
- `anchor_caution_hazard_outline`
- `anchor_caution_hazard_point`
- `anchorage_area`
- `anchorage_outline`
- `anchorage_point`
- `clearance_limit_line`
- `clearance_limit_point`
- `bridge_structure`
- `onshore_structure_area`
- `onshore_structure_line`
- `onshore_structure_point`
- `baseline_area`
- `baseline_line`
- `baseline_outline`
- `route_area`
- `route_outline`
- `route_axis_line`
- `route_boundary_point`
- `leading_line_outline`
- `pilot_station_point`
### 5.3 `detail`
- `place_label_sea`
- `place_label_land`
- `seabed_text_point`
- `facility_boundary_area`
- `facility_boundary_outline`
- `facility_boundary_point`
- `hole_area`
- `bathymetry_line`
- `seabed_line`
### 5.4 `domain_pending`
这几类当前不得直接进入最终 Chart Domain
- `depth_zone_739`
- `depth_zone_741`
- `clip_outline_754`
原因:
- 仍然依赖旧编码
- 语义不够明确
- Resolver 和离线模型无法稳定消费
## 6. 对当前层命名的解释
本模型中的 layer 名,指的是 **建议标准语义层名**,不是当前交付版实际使用的旧日文 `source-layer`
也就是说,像:
- `P錨泊地等`
- `p航路標識群`
- `L等深線`
应先标准化为:
- `anchorage_area`
- `navigation_marks`
- `depth_contour`
再进入 Chart Domain 分类。
## 7. 面向 Tile Resolver 的结构建议
未来 Tile Resolver 不应只拿“某个标准 layer 名”做决策,还应同时读取:
- `chart_domain`
- `resolver_priority`
- `offline_pack`
建议输出字段:
- `chart_domain`
- `safety_core | safety_extended | detail | domain_pending`
- `resolver_priority`
- 整数,数值越小优先级越高
- `offline_pack`
- `base | safety | detail | pending`
- `domain_status`
- `active | pending | deprecated`
建议默认优先级:
- `safety_core`: `10`
- `safety_extended`: `20`
- `detail`: `30`
- `domain_pending`: `99`
## 8. 面向分包的结构建议
推荐的物理输出结构:
```text
tiles/
├── safety/{z}/{x}/{y}.pbf
└── detail/{z}/{x}/{y}.pbf
```
其中:
- `safety`
- 包含 `safety_core + safety_extended`
- `detail`
- 包含 `detail`
如果后续确实需要更细粒度离线控制,可扩展为:
```text
tiles/
├── safety-core/{z}/{x}/{y}.pbf
├── safety-extended/{z}/{x}/{y}.pbf
└── detail/{z}/{x}/{y}.pbf
```
但当前 `v1` 建议先不要切太细,以免:
- 分发复杂
- 前端消费复杂
- 缓存策略过碎
## 9. 审计设计
这部分是本文件最重要的配套要求:**域模型不是写出来就算完成,必须可以审计。**
### 9.1 审计目标
要能回答:
1. 每个标准 layer 是否被正确归入某个 Chart Domain
2. 是否有对象被错分到不合适的域
3. 是否有 `domain_pending` 层被错误放入正式交付
4. 按当前 style 渲染时,域变化是否破坏原始渲染
5. 离线包拆分后,是否仍满足“安全底线”
### 9.2 审计分层
建议分 4 层审计。
#### A. 规则审计
检查内容:
- 每个标准 layer 是否有明确域归属
- 每个域归属是否有规则来源
- 是否存在重复归类或冲突归类
建议表结构:
- `chart_domain_rules`
- `chart_domain_rule_trace`
建议最小字段:
- `domain_rule_id`
- `bundle_id`
- `layer_std`
- `chart_domain`
- `resolver_priority`
- `offline_pack`
- `rule_reason`
#### B. 数据审计
检查内容:
- 当前交付版/工程版 `pbf` 中,每个 feature 属于哪个标准 layer
- 是否存在 feature 无法映射到任何域
- 是否存在 `domain_pending` layer 进入了正式输出
建议输出:
- `feature_count by chart_domain`
- `feature_count by layer_std`
- `feature_count by domain_pending`
关键断言:
- 每个正式输出 feature 必须有 `chart_domain`
- `domain_pending` 不得进入最终交付版
#### C. Resolver 审计
检查内容:
- `safety_core` 是否总是优先被 Resolver 选择
- `detail` 是否不会覆盖 `safety_core`
- 离线模式下 Base Pack 是否真的包含全部 `safety_core`
- Resolver 是否始终按物理包返回,而不是按 layer/feature 临时拼装
关键断言:
- `safety_core` 丢失即判定不通过
- `detail` 缺失不影响 `base_pack` 合格
- 不允许 `detail` 被当作 `safety_core` 的替代来源
- 不允许客户端执行 feature 级或 layer 级重组后再返回 tile
#### D. 渲染审计
检查内容:
- 在 layer domain 切换后,原始样式与新样式是否仍然等价
- 是否有 feature 因域拆分而不再被渲染
- 是否有对象在新样式中出现“语义画反”
- 水下对象被画成陆地/露出
- 水上对象被画成水下/危险物
- render-support 层被错误强化成业务语义对象
##### D-1. Style 语义审计
这是渲染审计中的强制子项,目的不是只看“有没有画出来”,而是看:
- 新版 style 是否忠于旧版 style 的表现语义
- 是否把旧版的弱语义/辅助语义误画成强语义
- 是否把航行关键语义画反
重点检查:
- 陆海主判定是否与旧版一致
- 水上 / 水下 / 露出 / 干出语义是否与旧版一致
- 危险物、潜堤、暗礁、浅水区等是否被误画成普通背景
- render-support 层是否仍保持旧版的支撑性表现
- 例如 `P穴 -> hole_area` 必须忠于旧版透明/孔洞式表现,不得画成陆地区块
- 文字与符号是否仍表达旧版相同含义
- 有对象、无数字
- 有线、无深度标注
- 有主符号、无关键辅助注记
审计口径:
- 旧版 style 是表现基准
- 新版 style 是对旧版 style 的语义转译,不是重新设计
- 只要旧版表现会影响航行判断,该表现就必须被视为“语义表现”,纳入审计
- 交付前执行规范详见 [`NavSea_Delivery_Preflight_Audit_Spec.md`](/root/sourceserver/pbf/NavSea_Delivery_Preflight_Audit_Spec.md)
关键断言:
- 不允许把水域对象画成陆地感对象
- 不允许把陆地/露出对象画成水下对象
- 不允许把 render-support 层画成会误导航行判断的实体语义对象
- 不允许因样式转译而丢失关键深度数字、净空数字、灯标说明、危险物标记
审计口径:
- 原始 `pbf` + 原始 style
- 工程版/交付版 `pbf` + 对应 style
- 按 feature instance 级别比较 icon/text/line/fill
关键断言:
- 不允许因为域重组导致“原来有渲染、现在完全没渲染”
- 不允许 `safety_core` 对象被错误降到 `detail`
## 10. 审计通过条件
本模型建议的最低通过条件如下:
### 10.1 命名通过
- 所有正式输出 layer 必须使用标准层名
- 不再直接暴露旧日文 layer 名
### 10.2 域归类通过
- 所有正式输出 layer 必须属于:
- `safety_core`
- `safety_extended`
- `detail`
- 不允许正式交付 layer 仍停留在 `domain_pending`
### 10.3 渲染通过
- 原始版 vs 新版渲染审计通过
- 不存在 feature 完全失去渲染观察
- Style 语义审计通过
- 不存在会影响航行判断的“语义画反”
- render-support 层未被误画为强业务语义对象
### 10.4 离线通过
- `base_pack` 能独立支撑 `safety_core`
- `safety_pack` 能完整支撑安全域
- 缺失 `detail` 时,不得靠 `detail` 外观相似对象替代 `safety_core`
- Resolver 返回应保持物理包边界,不做客户端临时重组
## 11. 当前已知风险
### 11.1 编码层风险
当前最大的风险仍然是:
- `depth_zone_739`
- `depth_zone_741`
- `clip_outline_754`
如果这些层不先做语义拆解,后续:
- Resolver 无法稳定使用
- 离线打包会失真
- Chart Domain 会夹杂“编码占位层”
### 11.2 容器层风险
这几层当前仍偏“容器命名”:
- `baseline_area`
- `facility_boundary_area`
- `bathymetry_line`
它们虽然比旧日文层名好,但还不是最终最清晰的业务层名。
## 12. 建议的推进顺序
### Phase 1
- 完成 layer 标准命名
- 不改现有运行系统
- 只形成 Chart Domain 设计与审计要求
### Phase 2
- 建立 `chart_domain_rules`
- 为每个标准 layer 补:
- `chart_domain`
- `resolver_priority`
- `offline_pack`
### Phase 3
- 输出新的语义域 layer 结构
- 仍保留可逆追溯
- 做渲染审计和 Resolver 审计
### Phase 4
- 正式切换交付版
- 旧日文 layer 退出交付体系
## 13. 当前结论
NavSea 下一步不是继续停留在“旧 layer 改英文名”,而是要进入:
- **按语义重建 layer domain**
`v1` 的基础结论是:
- 三层域模型是必要的
- 需要额外保留 `domain_pending`
- 推荐逻辑三层、物理两包
- 任何后续切换都必须配套审计

View File

@@ -0,0 +1,163 @@
# NavSea 交付版 Layer 命名评估表
## 目的
这份表专门回答一个问题:
- 当前交付版 `pbf` 中实际使用的 layer 名,是否表达清晰?
评估口径:
- `当前交付 layer`
- 指当前交付版 `pbf` / `style` 实际在消费的 layer 名
- `建议标准名`
- 指后续去掉对日文技术依赖时,建议暴露给交付体系的标准 layer 名
- `中文语义`
- 便于人工确认命名是否准确
- `是否足够清晰`
- 站在“交付给下游或团队协作”角度评估
- `是否建议重命名`
- 指是否建议最终交付版不再直接暴露当前 layer 名
## 总结判断
当前交付版 layer 名整体上 **不够清晰**,原因主要有三类:
- 仍保留大量日文 layer 名
- 仍保留 `P/L/p``ククリ` 这种旧体系术语
- 仍保留 `L739``P754ククリ` 这类编码型 layer 名
从表达清晰度看,可以分成两组:
- 已经比较清晰,只是还没真正切换到交付层:
- `anchorage_area`
- `navigation_marks`
- `depth_contour`
- `place_label_sea`
- `land_area`
- 仍然不够清晰,建议继续细化:
- `depth_zone_739`
- `depth_zone_741`
- `clip_outline_754`
- `baseline_area`
- `facility_boundary_area`
## 正式评估表
| 当前交付 layer | 建议标准名 | 中文语义 | 是否足够清晰 | 是否建议重命名 |
| --- | --- | --- | --- | --- |
| `P基本線` | `baseline_area` | 基本线相关面/容器层 | 否 | 是 |
| `P投錨注意障害物` | `anchor_caution_hazard_area` | 抛锚注意障害物面 | 否 | 是 |
| `P航行危険障害物` | `navigation_hazard_area` | 航行危险障害物面 | 否 | 是 |
| `P漁具定置箇所` | `fixed_fishing_gear_area` | 定置渔具区域 | 否 | 是 |
| `P錨泊地等` | `anchorage_area` | 锚地/锚泊地区域 | 否 | 是 |
| `P施設・境界線等` | `facility_boundary_area` | 设施/边界相关区域 | 否 | 是 |
| `P潜堤` | `submerged_reef_area` | 潜堤/潜礁区域 | 否 | 是 |
| `P橋りょう等構造物` | `bridge_structure` | 桥梁等结构物面 | 否 | 是 |
| `P陸上構造物陸` | `onshore_structure_area` | 陆上结构物面 | 否 | 是 |
| `P陸域` | `land_area` | 陆地区域 | 否 | 是 |
| `P穴` | `hole_area` | 穴/凹地面 | 否 | 是 |
| `L海底地形` | `bathymetry_line` | 海底地形支撑线 | 否 | 是 |
| `L等深線` | `depth_contour` | 等深线 | 否 | 是 |
| `L概略等深線` | `depth_contour_overview` | 概略等深线 | 否 | 是 |
| `L海底線` | `seabed_line` | 海底线 | 否 | 是 |
| `L基本線` | `baseline_line` | 基本线线层 | 否 | 是 |
| `L陸上構造物陸` | `onshore_structure_line` | 陆上结构物线层 | 否 | 是 |
| `L739` | `depth_zone_739` | 深度分带编码层 739 | 否 | 是 |
| `L741` | `depth_zone_741` | 深度分带编码层 741 | 否 | 是 |
| `L高さ制限` | `clearance_limit_line` | 高度/净空限制线 | 否 | 是 |
| `P基本線ククリ` | `baseline_outline` | 基本线边界 | 否 | 是 |
| `P危険界ククリ` | `hazard_boundary_outline` | 危险界边界 | 否 | 是 |
| `P航行危険障害物ククリ` | `navigation_hazard_outline` | 航行危险障害物边界 | 否 | 是 |
| `P投錨注意障害物ククリ` | `anchor_caution_hazard_outline` | 抛锚注意障害物边界 | 否 | 是 |
| `P錨泊地等ククリ` | `anchorage_outline` | 锚地边界 | 否 | 是 |
| `P施設・境界線等ククリ` | `facility_boundary_outline` | 设施/边界边线 | 否 | 是 |
| `P754ククリ` | `clip_outline_754` | 编码型边界层 754 | 否 | 是 |
| `p航行危険障害物` | `navigation_hazard_point` | 航行危险障害物点 | 否 | 是 |
| `p錨泊地等` | `anchorage_point` | 锚地符号点 | 否 | 是 |
| `p投錨注意障害物` | `anchor_caution_hazard_point` | 抛锚注意障害物点 | 否 | 是 |
| `p航路標識群` | `navigation_marks` | 航标/灯标/浮标点 | 否 | 是 |
| `p施設・境界線等` | `facility_boundary_point` | 设施/边界符号点 | 否 | 是 |
| `p陸上構造物` | `onshore_structure_point` | 陆上结构物点 | 否 | 是 |
| `p底質` | `seabed_text_point` | 底质标注点 | 否 | 是 |
| `p高さ制限` | `clearance_limit_point` | 高度限制点标注 | 否 | 是 |
| `p地名` | `place_label_sea` | 海上地名标注 | 否 | 是 |
| `p地名陸` | `place_label_land` | 陆上地名标注 | 否 | 是 |
## 重点建议
### 1. 可以直接进入最终交付标准层名的对象
这些建议标准名已经比较清楚,可以直接作为最终交付版 layer 名候选:
- `anchorage_area`
- `anchorage_outline`
- `anchorage_point`
- `navigation_marks`
- `navigation_hazard_point`
- `navigation_hazard_outline`
- `depth_contour`
- `depth_contour_overview`
- `place_label_sea`
- `place_label_land`
- `land_area`
- `bridge_structure`
- `onshore_structure_area`
- `onshore_structure_line`
- `onshore_structure_point`
- `clearance_limit_line`
- `clearance_limit_point`
### 2. 还不够理想,需要二次命名设计的对象
这些虽然已经有了英文标准名,但表达仍然偏“技术命名”或“容器命名”,建议二次优化:
- `baseline_area`
- 问题:像容器层,不像业务对象
- `facility_boundary_area`
- 问题:语义过宽,设施和边界混在一起
- `bathymetry_line`
- 问题:更像支撑线,不够区分其具体作用
- `seabed_text_point`
- 问题:表达的是文字载体,不是业务对象
- `submerged_reef_area`
- 问题:要确认是否会和鱼礁/暗礁语义混淆
### 3. 明显不适合作为最终交付层名的对象
这些标准名本质上仍然只是“稳定占位名”,不适合长期直接暴露给下游:
- `depth_zone_739`
- `depth_zone_741`
- `clip_outline_754`
它们的问题是:
- 仍然带旧编码
- 只能表达“来源编号”,不能表达“业务含义”
建议最终方向:
- 先查清这些编码型层到底承载什么对象语义
- 再改成真正的业务名
## 建议的推进顺序
如果下一步要真正去掉交付版对日文 layer 名的依赖,建议按这个顺序做:
1. 先把“已经足够清晰”的标准名直接切到交付版
2.`baseline_*``facility_boundary_*``bathymetry_*` 这类做二次命名收敛
3. 最后处理 `depth_zone_*``clip_outline_*` 这类编码型层
## 当前结论
当前交付版 layer 名:
- 对历史系统兼容是有效的
- 对团队理解和长期交付不够清晰
当前已经存在的标准层名体系:
- 足以作为去日文化的第一版基础
- 但还需要再做一轮“语义清晰化”

View File

@@ -0,0 +1,480 @@
# NavSea 交付前审计规范
## 1. 目标
本规范用于约束 NavSea 在正式交付前的审计方式,确保:
- 交付版 `pbf` 不依赖工程期映射字段即可完成渲染与点击说明
- 交付版 style 忠于旧版 style 的表现语义,而不是重新设计
- 不只是“对象还在”,还要确认“对象被正确解释并正确表现”
- 不会因为语义转译、样式改写或字段裁剪而引入航行风险
本规范既适用于当前 `delivery pbf`,也适用于后续拆分出的:
- 航海版
- 钓鱼版
## 2. 核心原则
### 2.1 旧版表现是基准
- 对航行安全相关对象,旧版 `pbf + style.json` 是表现基准
- 新版 style 的职责是把旧版表现语义转译到新字段体系,不是重新设计
- 只有经过明确登记和批准的差异,才允许故意偏离旧版表现
### 2.2 审计重点是“解释与表现”
- 不能只审“对象有没有”
- 必须审“对象命中了哪些渲染层”
- 必须审“命中的渲染层是否保持了旧版相同的语义”
- 必须审“最终画面是否仍会让用户做出相同的安全判断”
### 2.3 安全对象从严,普通对象从宽
- 灯火、浮标、危险物、暗礁、潜堤、洗岩、露岩、浅水区、陆海边界、净空限制等属于硬门禁对象
- 地名、底质、一般说明文字等允许有限偏差,但不得影响安全判断
### 2.4 render-support 不得被强化成业务语义
- `P穴 -> hole_area` 这类支撑层必须忠于旧版支撑性表现
- 不允许把辅助层画成会误导用户的实体语义对象
- 不允许把透明/挖空/弱表现对象画成陆地色、危险礁色或其他强语义实体色
## 3. 适用范围
本规范覆盖以下交付物:
- `pbf`
- `style json`
- 对比页面与公开部署版本
- 自动审计脚本生成的 Markdown / JSON 报告
本规范不替代工程期数据库审计。旧新字段映射、trace 和回查仍由数据库承担。
## 4. 术语
### 4.1 旧版基准
- 原始 `pbf`
- 原始 `style.json`
### 4.2 候选交付版
- 待交付 `pbf`
- 待交付 style
### 4.3 物体
- 同一个原始海图对象
- 审计时优先按 legacy `fid` 对齐
-`fid` 时,回退到 `geometry + 稳定旧属性`
### 4.4 feature instance
- 同一物体在不同 tile / zoom 下的具体实例
- 渲染审计保留 tile 实例粒度,因为渲染具有 zoom 敏感性
### 4.5 render hit
- 某个 feature instance 在某个 style layer 上实际命中的一次渲染观察
- 观察类型分为:
- `fill`
- `line`
- `icon`
- `text`
### 4.6 有效 render hit
- 不只是“命中了某层”
- 还要求该命中对最终画面有实际贡献
- 透明填充、零宽线、不可见 icon、空文本等不得被算作有效命中
### 4.7 场景窗口
- 固定中心点、固定缩放级、固定 viewport 的对比视窗
- 用于检查对象间叠压、标签碰撞、底色覆盖、整体安全感知
## 5. 用途分轨
### 5.1 航海版
目标:
- 保障航行安全
- 支撑通航判断、风险识别、航线设计和安全计算
特点:
- 用户视角大面积、粗线条
- 危险物和航标优先级最高
- 表现必须忠于旧版海图安全语义
### 5.2 钓鱼版
目标:
- 保障安全
- 强调地形、深度、底质和海里有什么
特点:
- 用户视角小面积、高细节
- 地形和深度优先级高于多数航海辅助对象
- 对安全对象仍从严,对非安全对象允许有选择地弱化
### 5.3 两版共用红线
- 安全对象不得缺失
- 不得出现“水上 / 水下 / 露出 / 干出”语义画反
- 不得把 render-support 层强化为危险误导源
- 不得缺失会影响判断的深度数字、净空数字、灯标关键信息
## 6. 审计分层
交付前审计必须按以下顺序执行。
### 6.1 第一层Style 有效性门禁
检查内容:
- style JSON 语法合法
- MapLibre / Mapbox Style 规范校验通过
- source、sprite、glyph、tile URL 可达
- 公开部署页实际加载的是候选交付版 style不是旧缓存或其他旧版本
不通过示例:
- `paint.fill-color` 表达式参数个数错误
- `match` 分支标签类型错误
- 公开页面仍引用旧 style 或旧 tile
### 6.2 第二层:对象存在性门禁
检查内容:
- 审计对象总量是否与旧版同量级
- 安全关键对象是否仍能在候选交付版中被对齐到
- 不允许因字段清理、layer 重命名、id 变更导致对象失联
允许差异:
- 工程追溯字段移除
- layer 名由旧日文名变为新语义名
不允许差异:
- 安全关键对象在交付版完全找不到
- 只能在数据库中回查到,但运行时对象不存在
### 6.3 第三层:物体级 render-hit 审计
这是主审计层。
对每个 feature instance分别执行
- 旧版 `pbf + 旧版 style`
- 候选交付版 `pbf + 候选交付版 style`
并记录:
- `hit_count_old`
- `hit_count_new`
- `hit_types_old`
- `hit_types_new`
- 每个 hit 的 payload
- 颜色
- 图标名
- 线宽
- dash
- 文本值
- anchor
- pattern
- opacity
比较规则:
- 先比有效 hit 数
- 再比 hit 类型集合
- 最后比 hit payload
特别说明:
- 不能只比 hit 数量
- 命中数量一致但 icon / color / line width 语义不同,仍算不通过
- 透明 fill、零宽线、空文本等无效 hit 不得充数
### 6.4 第四层Style 语义审计
这是物体级审计的强制子项。
必须回答:
- 陆海主判定是否与旧版一致
- 水上 / 水下 / 露出 / 干出语义是否与旧版一致
- 危险物、潜堤、暗礁、浅水区等是否被误画成普通背景
- render-support 层是否被错误强化为实体业务语义对象
- 点击能命中但地图上没显示关键数字/文字的情况是否存在
当前重点专项至少包括:
- `depth_numeric_missing`
- `clearance_numeric_missing`
- `safety_icon_missing`
- `support_layer_strengthened_fill`
### 6.5 第五层:场景窗口审计
render-hit 审计不能完全覆盖标签碰撞、遮挡、底色覆盖、叠压顺序等上下文问题,因此必须有场景窗口审计兜底。
每个候选交付版至少要有固定样区集,覆盖:
- 港口进出口
- 近岸浅水带
- 灯火和浮标密集区
- 暗礁 / 潜堤 / 危险障碍物密集区
- 等深线和深度数字复杂区
- 适合钓鱼的复杂海底地形区
每个样区必须固定:
- 中心经纬度
- 缩放级
- viewport 尺寸
- 左右对比截图
- 样区关注对象
场景窗口审计用于回答:
- 危险是否一眼可见
- 关键数字是否在可读位置出现
- 颜色和底色是否传达了正确语义
- 新旧整体判断是否一致
### 6.6 第六层:风险分级门禁
所有差异都必须分级。
建议最低分为:
- `P0`: 会直接影响航行安全或错误通航判断
- `P1`: 会明显误导用户对危险或限制的识别
- `P2`: 有视觉差异,但不改变主要判断
- `P3`: 样式细节偏差或非关键缺失
`P0` 示例:
- 水下物画成陆地或露出
- 露出物画成水下
- 灯火、浮标、危险物主图标缺失
- 关键深度数字、净空数字缺失
- 陆海边界明显误画
通过条件:
- `P0` 必须为 0
- `P1` 必须在批准阈值以下并有整改计划
- `P2/P3` 允许暂存,但必须进入差异清单
### 6.7 第七层:公开部署一致性审计
必须确认:
- 本地 style 与公开 style 内容一致
- 本地 tile 与公开 tile 内容一致
- 对比页和单页加载的是候选交付版,而不是缓存或旧版本
公开页一旦与本地待交付版本不一致,交付前审计视为未完成。
## 7. 航海版与钓鱼版的通过标准
### 7.1 航海版硬门禁
以下对象不得缺失或画反:
- 灯台、灯標、灯浮標、灯立標、航路標識
- 危险障碍物、暗礁、洗岩、露岩、潜堤、沉船
- 陆地、岸线、浅水区、干潮帯、可通航边界
- 净空限制、高度限制、航路边界、锚地相关限制
- 水深数字、关键等深线、关键危险辅助注记
额外要求:
- 颜色、图标、线型必须忠于旧版安全语义
- 不允许为了“画面更好看”而改变危险对象的识别方式
### 7.2 钓鱼版硬门禁
以下对象必须优先正确:
- 水深数字
- 等深线
- 海底线与海底地形
- 底质
- 鱼礁、障碍物、沉船、潜堤、暗礁
- 近岸结构和小范围危险物
钓鱼版允许:
- 弱化部分纯航海辅助对象
- 用更强调地形的方式表现非安全信息
但仍不允许:
- 安全对象画反
- 缺失会导致挂底、碰撞、搁浅误判的对象
## 8. 漏洞与补洞办法
单纯“比每个物体 hit 了多少层”仍然有漏洞。本规范明确要求同时补上以下检查。
### 8.1 count 不等于等价
漏洞:
- 新旧都 hit 了 2 层,但其中一层图标或颜色语义不同
补洞:
- 必须比 `type + payload`,不能只比 count
### 8.2 命中不等于可见
漏洞:
- 透明 fill、零宽线、空文本也可能被算作命中
补洞:
- 审计统计必须区分“命中”与“有效命中”
### 8.3 单对象通过不等于整体安全
漏洞:
- 对象单独没问题,但放进场景后被遮挡、碰撞或底色误导
补洞:
- 固定样区做场景窗口审计
### 8.4 旧新版不一定层数一一对应
漏洞:
- 旧版 `1 icon`,新版可能拆成 `arc + symbol`
- 或旧版 `fill + pattern`,新版用等价组合表达
补洞:
- 审计允许“等价表达”,但必须登记等价规则
- 等价规则未经登记,不得自行解释为通过
### 8.5 航海版和钓鱼版不能用同一把尺子
漏洞:
- 同一条差异,对航海版是 `P0`,对钓鱼版可能是 `P2`
补洞:
- 风险分级和通过阈值必须分轨维护
## 9. 审计输出要求
每次交付前至少输出以下内容:
- 一份 Markdown 审计报告
- 一份 JSON 审计明细
- 一份样区截图包
- 一份差异清单
- 一份例外清单
Markdown 报告至少包含:
- 审计范围
- 匹配口径
- 总体结果统计
- 主要问题层
- 标注专项问题
- Style 语义专项问题
- `P0/P1/P2/P3` 分布
- 场景窗口结论
- 是否通过
JSON 明细至少包含:
- 物体标识
- tile 实例信息
- 旧版命中
- 新版命中
- 差异类型
- 风险等级
- 是否属于航海版硬门禁对象
- 是否属于钓鱼版硬门禁对象
## 10. 通过与不通过判定
交付版只有在同时满足以下条件时,才允许进入正式交付:
- Style 有效性门禁通过
- 对象存在性门禁通过
- 物体级 render-hit 主审计通过
- Style 语义审计通过
- 场景窗口审计通过
- `P0 = 0`
- 公开部署一致性审计通过
下列任一情况直接判定不通过:
- 安全对象完全失去渲染
- 安全对象出现语义画反
- render-support 层被画成强实体语义对象
- 关键深度数字、净空数字、灯标主注记缺失
- 公开部署版本与本地待交付版本不一致
## 11. 例外管理
若确有必要故意偏离旧版表现,必须登记:
- 对象类型
- 影响范围
- 偏离原因
- 新旧差异说明
- 风险等级
- 批准人
- 回滚方式
未登记例外一律按缺陷处理。
## 12. 当前脚本实现边界
当前 [`navsea_render_audit.py`](/root/sourceserver/pbf/navsea_render_audit.py) 已经覆盖:
- 物体级 render observation 对比
- 标注缺失专项
- Style 语义专项
- 按 tile instance 粒度输出 Markdown / JSON 报告
当前仍未完全自动化的部分:
- 场景窗口审计
- 部署一致性自动校验
- 航海版 / 钓鱼版双阈值硬门禁
- 已登记等价表达规则的自动判定
因此,在这些能力补齐前:
- 自动审计报告只能视为主证据
- 固定样区人工复核仍是强制步骤
## 13. 规范与现有文档关系
本规范是交付前的执行规范。
相关上位和配套文档:
- [`NavSea_Chart_Domain_Model_v1.md`](/root/sourceserver/pbf/NavSea_Chart_Domain_Model_v1.md)
- [`NavSea_Legacy_Field_Exit_Roadmap.md`](/root/sourceserver/pbf/NavSea_Legacy_Field_Exit_Roadmap.md)
- [`NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm.md`](/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm.md)
后续如航海版与钓鱼版正式拆分,应在本规范下再各自补一份专项验收细则。

View File

@@ -263,6 +263,22 @@
- 对比旧样式与新样式的主要对象覆盖
- 对比使用版旧字段驱动与新字段驱动的渲染结果
- 对比旧样式与新样式的语义表现是否一致
- 不是只看“画没画出来”
- 还要看“有没有画反”
Style 语义审计必须回答:
- 水上 / 水下 / 露出 / 干出 是否仍与旧样式一致
- render-support 层是否被错误强化为业务语义对象
- 深度数字、净空数字、灯标说明、危险物标记是否仍正确出现
- 是否存在“点击能命中,但地图上没显示关键数字/文字”的情况
- 交付前审计执行方式以 [`NavSea_Delivery_Preflight_Audit_Spec.md`](/root/sourceserver/pbf/NavSea_Delivery_Preflight_Audit_Spec.md) 为准
特别红线:
- `P穴 -> hole_area` 这类辅助层,必须忠于旧样式的支撑性表现
- 不允许因为新语义转译,把它画成陆地色、危险礁色或其他会误导航行判断的强语义表现
验收:
@@ -274,6 +290,10 @@
- 水深数字
- 锚地/航路/鱼业区
- 地名
- 航行关键语义不得出现“画反”:
- 水下画成水上
- 水上画成水下
- 支撑层画成实体语义层
## 阶段 D旧字段降级为兼容字段
@@ -308,6 +328,8 @@
- 碰撞或检测链路不再直接读取它
- 工程版仍能回查原值
- 审计报告确认关键对象渲染未明显退化
- Style 语义审计确认旧样式表现已被等价转译
- 不存在因删旧字段导致的航行关键语义误绘
## 7. 下一步最值得做的事

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,356 @@
# NavSea 原始版 vs delivery版渲染审计报告
## 范围
- 原始样式: `/root/sourceserver/pbf/src/pbf/style.json`
- delivery版样式: `/root/sourceserver/pbf/src/pbf/style.navsea-delivery-karatsu-10nm.json`
- 原始瓦片根目录: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- delivery版瓦片根目录: `/home/wwwroot/pbf-delivery-karatsu-10nm`
- 原始 feature 实例数: `134772`
- delivery版 feature 实例数: `134772`
- 审计结果数: `138071`
## 匹配口径
- 主键优先使用 legacy `fid`
- 没有 `fid` 的对象,回退到 `geometry + 稳定旧属性`
- 审计粒度保留 tile 实例,因为渲染具有 zoom 敏感性。
## 结果统计
- `exact_match`: `118747`
- `mismatch`: `12721`
- `missing_in_engineering`: `3304`
- `extra_in_engineering`: `3299`
## 主要问题层
- `mismatch` | `P基本線ククリ` | `7694`
- `mismatch` | `P基本線` | `2804`
- `extra_in_engineering` | `baseline_outline` | `1381`
- `missing_in_engineering` | `P基本線ククリ` | `1381`
- `extra_in_engineering` | `baseline_area` | `710`
- `missing_in_engineering` | `P基本線` | `710`
- `mismatch` | `L基本線` | `610`
- `extra_in_engineering` | `depth_contour` | `481`
- `missing_in_engineering` | `L等深線` | `481`
- `mismatch` | `p航路標識群` | `460`
- `mismatch` | `P漁具定置箇所` | `448`
- `extra_in_engineering` | `bathymetry_line` | `310`
- `missing_in_engineering` | `L海底地形` | `310`
- `mismatch` | `p航行危険障害物` | `293`
- `mismatch` | `p投錨注意障害物` | `123`
- `extra_in_engineering` | `hole_area` | `111`
- `missing_in_engineering` | `P穴` | `111`
- `mismatch` | `L海底線` | `99`
- `mismatch` | `P陸上構造物陸` | `98`
- `extra_in_engineering` | `land_area` | `73`
## 标注专项问题
- `extra_text_in_engineering` | `bathymetry_line` | `160`
- `text_missing_in_engineering` | `L海底地形` | `160`
- `text_missing_in_engineering` | `L等深線` | `93`
- `extra_text_in_engineering` | `depth_contour` | `93`
- `extra_text_in_engineering` | `seabed_text_point` | `31`
- `text_missing_in_engineering` | `p底質` | `31`
- `icon_missing_in_engineering` | `p陸上構造物` | `20`
- `text_missing_in_engineering` | `p航路標識群` | `17`
- `extra_text_in_engineering` | `navigation_marks` | `17`
- `extra_icon_in_engineering` | `onshore_structure_point` | `15`
- `text_missing_in_engineering` | `p地名` | `14`
- `extra_text_in_engineering` | `place_label_sea` | `14`
- `text_missing_in_engineering` | `p地名陸` | `11`
- `extra_text_in_engineering` | `place_label_land` | `11`
- `text_missing_in_engineering` | `L概略等深線` | `4`
- `extra_text_in_engineering` | `depth_contour_overview` | `4`
- `icon_missing_in_engineering` | `p航路標識群` | `3`
- `extra_icon_in_engineering` | `navigation_marks` | `3`
- `icon_missing_in_engineering` | `p投錨注意障害物` | `3`
- `extra_icon_in_engineering` | `anchor_caution_hazard_point` | `3`
## Style 语义专项问题
- `depth_numeric_missing` | `L海底地形` | `160`
- `depth_numeric_missing` | `L等深線` | `93`
- `safety_icon_missing` | `p航路標識群` | `20`
- `depth_numeric_missing` | `L概略等深線` | `4`
## 差异样例
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`1058140` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`12118651` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`1404840` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`14670203` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`16172728` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`16240499` | object=`3000-4000m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(89,155,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`16700768` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`17964522` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`19018986` | object=`20-100m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(200,240,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`19548092` | object=`2-5m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(240,250,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`2042515` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`20474664` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`2048201` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`21243625` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`22474444` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`22830504` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`23577447` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`25266268` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`26628848` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`27264093` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`28191177` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`29816935` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`29859845` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`hole_area` | fid=`31252609` | object=`P穴`
original: none
engineering: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`32205896` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`32854165` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`33449722` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`34018314` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`36874832` | object=`5-10m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(230,250,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`38272331` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
## 标注问题样例
- `text_missing_in_engineering` | tile=`10/881/410` | source_layer=`p地名陸` | fid=`16040759` | object=`n/a`
original: text=['text:{"text_anchor":"bottom","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"玄海町"}', 'text:{"text_anchor":"top","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Genkai"}']
engineering: none
- `extra_text_in_engineering` | tile=`10/881/410` | source_layer=`place_label_land` | fid=`21272367` | object=`p地名陸`
original: none
engineering: text=['text:{"text_anchor":"bottom","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"玄海町"}', 'text:{"text_anchor":"top","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Genkai"}']
- `text_missing_in_engineering` | tile=`10/882/410` | source_layer=`p航路標識群` | fid=`12008012` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"博多港端島灯台"}']
engineering: none
- `extra_text_in_engineering` | tile=`10/882/410` | source_layer=`navigation_marks` | fid=`65286791` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"博多港端島灯台"}']
- `extra_text_in_engineering` | tile=`11/1762/820` | source_layer=`bathymetry_line` | fid=`10445884` | object=`L海底地形`
original: none
engineering: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"11"}']
- `extra_text_in_engineering` | tile=`11/1762/820` | source_layer=`bathymetry_line` | fid=`11740214` | object=`L海底地形`
original: none
engineering: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"41"}']
- `extra_text_in_engineering` | tile=`11/1762/820` | source_layer=`bathymetry_line` | fid=`15015009` | object=`L海底地形`
original: none
engineering: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"44"}']
- `extra_text_in_engineering` | tile=`11/1762/820` | source_layer=`bathymetry_line` | fid=`16472950` | object=`L海底地形`
original: none
engineering: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"19"}']
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19170204` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"4"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19181431` | object=`n/a`
original: line=['line:{"line_color":"rgba(106,210,126,1)","line_width":1}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"10"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19183407` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"11"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19186614` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"13"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19195430` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"19"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19198220` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"21"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19203962` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"25"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19209350` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"29"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19213087` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"32"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19213120` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"32"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19214419` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"33"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19214421` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"33"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19215796` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"34"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19216767` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"35"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19221945` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"39"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19223776` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"41"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19223786` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"41"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19224936` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"42"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19226052` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"43"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19227202` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"44"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19227398` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"44"}']
engineering: none
- `text_missing_in_engineering` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19228072` | object=`n/a`
original: line=['line:{"line_color":"rgba(122,206,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"45"}']
engineering: none
## Style 语义问题样例
- `safety_icon_missing` | tile=`10/882/410` | source_layer=`p航路標識群` | fid=`12008012` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"博多港端島灯台"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19170204` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"4"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19181431` | object=`n/a`
original: line=['line:{"line_color":"rgba(106,210,126,1)","line_width":1}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"10"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19183407` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"11"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19186614` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"13"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19195430` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"19"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19198220` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"21"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19203962` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"25"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19209350` | object=`n/a`
original: line=['line:{"line_color":"rgba(126,230,146,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"29"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19213087` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"32"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19213120` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"32"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19214419` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"33"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19214421` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"33"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19215796` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"34"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19216767` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"35"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19221945` | object=`n/a`
original: line=['line:{"line_color":"rgba(144,220,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"39"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19223776` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"41"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19223786` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"41"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19224936` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"42"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19226052` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"43"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19227202` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"44"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19227398` | object=`n/a`
original: line=['line:{"line_color":"rgba(133,213,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"44"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19228072` | object=`n/a`
original: line=['line:{"line_color":"rgba(122,206,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"45"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19230074` | object=`n/a`
original: line=['line:{"line_color":"rgba(122,206,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"47"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19230892` | object=`n/a`
original: line=['line:{"line_color":"rgba(122,206,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"48"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19233432` | object=`n/a`
original: line=['line:{"line_color":"rgba(111,199,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"51"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19234301` | object=`n/a`
original: line=['line:{"line_color":"rgba(111,199,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"52"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19234325` | object=`n/a`
original: line=['line:{"line_color":"rgba(111,199,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"52"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19235178` | object=`n/a`
original: line=['line:{"line_color":"rgba(111,199,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"53"}']
engineering: none
- `depth_numeric_missing` | tile=`11/1762/820` | source_layer=`L海底地形` | fid=`19235840` | object=`n/a`
original: line=['line:{"line_color":"rgba(111,199,255,1)","line_width":0.5}']; text=['text:{"text_color":"rgba(7,7,7,1)","text_size":10,"text_value":"54"}']
engineering: none

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,246 @@
# NavSea 原始版 vs delivery版渲染审计报告
## 范围
- 原始样式: `/root/sourceserver/pbf/src/pbf/style.json`
- delivery版样式: `/root/sourceserver/pbf/src/pbf/style.navsea-delivery-karatsu-10nm.json`
- 原始瓦片根目录: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- delivery版瓦片根目录: `/home/wwwroot/pbf-delivery-karatsu-20nm`
- 原始 feature 实例数: `254342`
- delivery版 feature 实例数: `254342`
- 审计结果数: `254342`
## 匹配口径
- 主键优先使用 legacy `fid`
- 没有 `fid` 的对象,回退到 `geometry + 稳定旧属性`
- 审计粒度保留 tile 实例,因为渲染具有 zoom 敏感性。
## 结果统计
- `exact_match`: `222770`
- `mismatch`: `31513`
- `missing_in_engineering`: `59`
## 主要问题层
- `mismatch` | `P基本線ククリ` | `16947`
- `mismatch` | `P基本線` | `5884`
- `mismatch` | `P漁具定置箇所` | `2479`
- `mismatch` | `L基本線` | `2408`
- `mismatch` | `p航路標識群` | `1519`
- `mismatch` | `p投錨注意障害物` | `724`
- `mismatch` | `p航行危険障害物` | `664`
- `mismatch` | `P陸上構造物陸` | `327`
- `mismatch` | `L海底線` | `206`
- `mismatch` | `P潜堤` | `87`
- `mismatch` | `L741` | `66`
- `mismatch` | `P施設・境界線等` | `48`
- `mismatch` | `L高さ制限` | `47`
- `mismatch` | `p施設・境界線等` | `43`
- `mismatch` | `P投錨注意障害物` | `28`
- `mismatch` | `L739` | `21`
- `missing_in_engineering` | `p陸上構造物` | `19`
- `missing_in_engineering` | `P航路ククリ` | `12`
- `missing_in_engineering` | `p航路境界等` | `11`
- `missing_in_engineering` | `P航路` | `8`
## 标注专项问题
- `icon_missing_in_engineering` | `p陸上構造物` | `19`
- `icon_missing_in_engineering` | `p航路境界等` | `11`
- `icon_missing_in_engineering` | `pパイロットステーション` | `2`
## Style 语义专项问题
- 没有发现 style 语义专项问题。
## 差异样例
- `mismatch` | tile=`10/880/409` | source_layer=`P潜堤` | fid=`3107890` | object=`潜提`
original: fill=['fill:{"fill_color":"rgba(129,195,226,1)"}', 'fill:{"fill_pattern":"fill-daytime-175"}']
engineering: fill=['fill:{"fill_color":"#7d7f95","fill_opacity":0.45,"fill_outline_color":"#55586f"}']
- `mismatch` | tile=`10/880/409` | source_layer=`P潜堤` | fid=`3113597` | object=`潜提`
original: fill=['fill:{"fill_color":"rgba(129,195,226,1)"}', 'fill:{"fill_pattern":"fill-daytime-175"}']
engineering: fill=['fill:{"fill_color":"#7d7f95","fill_opacity":0.45,"fill_outline_color":"#55586f"}']
- `mismatch` | tile=`10/880/409` | source_layer=`P潜堤` | fid=`3113792` | object=`潜提`
original: fill=['fill:{"fill_color":"rgba(129,195,226,1)"}', 'fill:{"fill_pattern":"fill-daytime-175"}']
engineering: fill=['fill:{"fill_color":"#7d7f95","fill_opacity":0.45,"fill_outline_color":"#55586f"}']
- `mismatch` | tile=`10/880/409` | source_layer=`P潜堤` | fid=`3117479` | object=`潜提`
original: fill=['fill:{"fill_color":"rgba(129,195,226,1)"}', 'fill:{"fill_pattern":"fill-daytime-175"}']
engineering: fill=['fill:{"fill_color":"#7d7f95","fill_opacity":0.45,"fill_outline_color":"#55586f"}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054123` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054124` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054125` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054126` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054127` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054128` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054129` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054130` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054131` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054134` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054135` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054139` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054142` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054143` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054144` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054145` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054146` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054147` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054148` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054149` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054150` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054151` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054152` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054156` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054167` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/880/409` | source_layer=`P基本線ククリ` | fid=`4054173` | object=`P基本線ククリ`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
## 标注问题样例
- `icon_missing_in_engineering` | tile=`11/1761/822` | source_layer=`p陸上構造物` | fid=`6012341` | object=`陸上顕著物 (観覧車等)`
original: icon=['icon:{"icon_image":"symbol-daytime-680"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1761/822` | source_layer=`p航路境界等` | fid=`9003369` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1761/822` | source_layer=`p航路境界等` | fid=`9003379` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1761/823` | source_layer=`p陸上構造物` | fid=`6011150` | object=`税関`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1761/824` | source_layer=`p陸上構造物` | fid=`6013154` | object=`管制信号所`
original: icon=['icon:{"icon_image":"symbol-daytime-682"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1761/824` | source_layer=`p航路境界等` | fid=`9003373` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1761/824` | source_layer=`p航路境界等` | fid=`9003374` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1761/824` | source_layer=`p航路境界等` | fid=`9003375` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1761/824` | source_layer=`p航路境界等` | fid=`9003376` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1762/822` | source_layer=`p陸上構造物` | fid=`6011135` | object=`税関`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1762/823` | source_layer=`p陸上構造物` | fid=`6011150` | object=`税関`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1763/821` | source_layer=`p陸上構造物` | fid=`6011136` | object=`税関`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1765/820` | source_layer=`p陸上構造物` | fid=`6011134` | object=`税関`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1765/820` | source_layer=`p陸上構造物` | fid=`6012337` | object=`陸上顕著物 (観覧車等)`
original: icon=['icon:{"icon_image":"symbol-daytime-680"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1765/820` | source_layer=`p陸上構造物` | fid=`6012338` | object=`陸上顕著物 (観覧車等)`
original: icon=['icon:{"icon_image":"symbol-daytime-680"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1765/824` | source_layer=`p陸上構造物` | fid=`6011149` | object=`税関`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3522/1644` | source_layer=`p陸上構造物` | fid=`6012341` | object=`陸上顕著物 (観覧車等)`
original: icon=['icon:{"icon_image":"symbol-daytime-680"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3522/1644` | source_layer=`p航路境界等` | fid=`9003369` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3522/1645` | source_layer=`p航路境界等` | fid=`9003379` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3522/1648` | source_layer=`pパイロットステーション` | fid=`9002198` | object=`パイロットステーション`
original: icon=['icon:{"icon_image":"symbol-daytime-500"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3522/1648` | source_layer=`p航路境界等` | fid=`9003373` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3522/1648` | source_layer=`p航路境界等` | fid=`9003375` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3523/1647` | source_layer=`p陸上構造物` | fid=`6011150` | object=`税関`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3523/1648` | source_layer=`p陸上構造物` | fid=`6013154` | object=`管制信号所`
original: icon=['icon:{"icon_image":"symbol-daytime-682"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3523/1648` | source_layer=`p航路境界等` | fid=`9003374` | object=`水源方向`
original: icon=['icon:{"icon_image":"symbol-daytime-761"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3524/1645` | source_layer=`p陸上構造物` | fid=`6011135` | object=`税関`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3524/1647` | source_layer=`p陸上構造物` | fid=`6011150` | object=`税関`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3526/1643` | source_layer=`p陸上構造物` | fid=`6011136` | object=`税関`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3530/1641` | source_layer=`p陸上構造物` | fid=`6012338` | object=`陸上顕著物 (観覧車等)`
original: icon=['icon:{"icon_image":"symbol-daytime-680"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3530/1641` | source_layer=`pパイロットステーション` | fid=`9002206` | object=`パイロットステーション`
original: icon=['icon:{"icon_image":"symbol-daytime-500"}']
engineering: none
## Style 语义问题样例
- 没有 style 语义问题样例。

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,355 @@
# NavSea 原始版 vs delivery版渲染审计报告
## 范围
- 原始样式: `/root/sourceserver/pbf/src/pbf/style.json`
- delivery版样式: `/root/sourceserver/pbf/src/pbf/style.navsea-delivery-karatsu-10nm.json`
- 原始瓦片根目录: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- delivery版瓦片根目录: `/home/wwwroot/pbf-delivery-karatsu-20nm`
- 原始 feature 实例数: `254342`
- delivery版 feature 实例数: `254342`
- 审计结果数: `508684`
## 匹配口径
- 主键优先使用 legacy `fid`
- 没有 `fid` 的对象,回退到 `geometry + 稳定旧属性`
- 审计粒度保留 tile 实例,因为渲染具有 zoom 敏感性。
## 结果统计
- `extra_in_engineering`: `254342`
- `missing_in_engineering`: `254342`
## 主要问题层
- `extra_in_engineering` | `baseline_outline` | `87709`
- `missing_in_engineering` | `P基本線ククリ` | `87709`
- `extra_in_engineering` | `baseline_area` | `46452`
- `missing_in_engineering` | `P基本線` | `46452`
- `extra_in_engineering` | `depth_contour` | `36460`
- `missing_in_engineering` | `L等深線` | `36460`
- `extra_in_engineering` | `bathymetry_line` | `35940`
- `missing_in_engineering` | `L海底地形` | `35940`
- `extra_in_engineering` | `onshore_structure_line` | `10544`
- `missing_in_engineering` | `L陸上構造物陸` | `10544`
- `extra_in_engineering` | `land_area` | `7961`
- `missing_in_engineering` | `P陸域` | `7961`
- `extra_in_engineering` | `hole_area` | `6857`
- `missing_in_engineering` | `P穴` | `6857`
- `extra_in_engineering` | `seabed_text_point` | `4499`
- `missing_in_engineering` | `p底質` | `4499`
- `extra_in_engineering` | `hazard_boundary_outline` | `2646`
- `missing_in_engineering` | `P危険界ククリ` | `2646`
- `extra_in_engineering` | `fixed_fishing_gear_area` | `2479`
- `missing_in_engineering` | `P漁具定置箇所` | `2479`
## 标注专项问题
- `extra_text_in_engineering` | `bathymetry_line` | `24168`
- `text_missing_in_engineering` | `L海底地形` | `24168`
- `extra_text_in_engineering` | `depth_contour` | `11929`
- `text_missing_in_engineering` | `L等深線` | `11929`
- `extra_text_in_engineering` | `seabed_text_point` | `4499`
- `text_missing_in_engineering` | `p底質` | `4499`
- `extra_text_in_engineering` | `navigation_marks` | `1516`
- `text_missing_in_engineering` | `p航路標識群` | `1516`
- `text_missing_in_engineering` | `p地名` | `1444`
- `extra_text_in_engineering` | `place_label_sea` | `1444`
- `extra_icon_in_engineering` | `anchor_caution_hazard_point` | `1426`
- `icon_missing_in_engineering` | `p投錨注意障害物` | `1426`
- `text_missing_in_engineering` | `p地名陸` | `1109`
- `extra_text_in_engineering` | `place_label_land` | `1109`
- `icon_missing_in_engineering` | `p陸上構造物` | `910`
- `extra_icon_in_engineering` | `onshore_structure_point` | `891`
- `icon_missing_in_engineering` | `p航行危険障害物` | `664`
- `extra_icon_in_engineering` | `navigation_hazard_point` | `664`
- `extra_icon_in_engineering` | `navigation_marks` | `369`
- `icon_missing_in_engineering` | `p航路標識群` | `369`
## Style 语义专项问题
- `depth_numeric_missing` | `L海底地形` | `24168`
- `depth_numeric_missing` | `L等深線` | `11929`
- `safety_icon_missing` | `p航路標識群` | `1885`
- `depth_numeric_missing` | `L概略等深線` | `350`
- `clearance_numeric_missing` | `p高さ制限` | `33`
## 差异样例
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`hole_area` | fid=`-1001350668` | object=`P穴`
original: none
engineering: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`hole_area` | fid=`-1001350668` | object=`P穴`
original: none
engineering: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-100187935` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1004285450` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1004478221` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`hole_area` | fid=`-1004766316` | object=`P穴`
original: none
engineering: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1005227929` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1006671238` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-100667807` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1008857267` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-10089736` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1011245193` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1011298607` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`-1012210428` | object=`2000-3000m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(132,169,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`-1012615342` | object=`2000-3000m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(132,169,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1012930076` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-101311542` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1013768546` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1013908015` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1014608693` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-101554676` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`-1015995687` | object=`10-20m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(220,250,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1016774370` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1017142898` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1018128169` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1018165694` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1020992820` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1022609407` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1023696695` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1024292542` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
## 标注问题样例
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`navigation_marks` | fid=`-1033259184` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 22m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"手長島灯台"}']
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`navigation_marks` | fid=`-193326989` | object=`沿岸灯台 (15M over)`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-04027289"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Oc W 8s 106m 15M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"若宮灯台"}']
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`navigation_marks` | fid=`-60468407` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007768` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-04027289"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Oc W 8s 106m 15M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"若宮灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007824` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007921` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 22m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"手長島灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007971` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐大瀬灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p地名陸` | fid=`16040739` | object=`n/a`
original: text=['text:{"text_anchor":"bottom","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐市"}', 'text:{"text_anchor":"top","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iki"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p地名` | fid=`16040854` | object=`n/a`
original: text=['text:{"text_anchor":"bottom","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐島"}', 'text:{"text_anchor":"top","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"IKI SHIMA"}']
engineering: none
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`place_label_land` | fid=`2138221132` | object=`p地名陸`
original: none
engineering: text=['text:{"text_anchor":"bottom","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐市"}', 'text:{"text_anchor":"top","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iki"}']
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`navigation_marks` | fid=`509002199` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐大瀬灯台"}']
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`place_label_sea` | fid=`906640000` | object=`p地名`
original: none
engineering: text=['text:{"text_anchor":"bottom","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐島"}', 'text:{"text_anchor":"top","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"IKI SHIMA"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`-1872756166` | object=`沿岸灯台 (15M over)`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Al Fl W,G 20s 99m W18,G16M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"二神島灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`-457133759` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 101m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"大碆鼻灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`-60468407` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`-918710454` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 12m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島曲り鼻灯台"}']
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007773` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-l3"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Al Fl W,G 20s 99m W18,G16M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"二神島灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007805` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 12m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島曲り鼻灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007823` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 31m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"海豚鼻灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007824` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007836` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 101m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"大碆鼻灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007880` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐郷ノ瀬灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007885` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 5s 46m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"馬ノ頭鼻灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007886` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"崎瀬鼻灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007938` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 25m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島長崎鼻灯台"}']
engineering: none
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`1705367191` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 25m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島長崎鼻灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`1788936661` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 5s 46m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"馬ノ頭鼻灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`1977066498` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐郷ノ瀬灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`298413274` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"崎瀬鼻灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`48104363` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 31m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"海豚鼻灯台"}']
## Style 语义问题样例
- `safety_icon_missing` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007768` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-04027289"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Oc W 8s 106m 15M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"若宮灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007824` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007921` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 22m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"手長島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007971` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐大瀬灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007773` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-l3"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Al Fl W,G 20s 99m W18,G16M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"二神島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007805` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 12m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島曲り鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007823` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 31m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"海豚鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007824` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007836` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 101m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"大碆鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007880` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐郷ノ瀬灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007885` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 5s 46m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"馬ノ頭鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007886` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"崎瀬鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007938` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 25m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島長崎鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007795` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 11m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"青砂埼灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007835` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 109m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"生月長瀬鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007897` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Al Fl(2) G,W 6s 7m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"平戸牛ケ首灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007919` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"津崎鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007939` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 20m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"肥前横島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007940` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 9m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"南風埼灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007941` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 37m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"下枯木島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007942` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 8s 12m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"牛ケ首灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007977` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m1"}', 'icon:{"icon_image":"light-daytime-1"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl G 3s 10m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"平戸港灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12008014` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 69m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"魚固島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12008025` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"広瀬灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12008034` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 13m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"広瀬導流堤灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12008035` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 19m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"佐世保港弁天島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/412` | source_layer=`p航路標識群` | fid=`12007774` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-l3"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 6s 64m 21M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"高後埼灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/412` | source_layer=`p航路標識群` | fid=`12007943` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 48m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"御床島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/412` | source_layer=`p航路標識群` | fid=`12007944` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 24m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"兜島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/412` | source_layer=`p航路標識群` | fid=`12007945` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 15m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"大蟇島大瀬灯台"}']
engineering: none

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,355 @@
# NavSea 原始版 vs delivery版渲染审计报告
## 范围
- 原始样式: `/root/sourceserver/pbf/src/pbf/style.json`
- delivery版样式: `/root/sourceserver/pbf/src/pbf/style.navsea-delivery-karatsu-10nm.json`
- 原始瓦片根目录: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- delivery版瓦片根目录: `/home/wwwroot/pbf-delivery-karatsu-20nm`
- 原始 feature 实例数: `258317`
- delivery版 feature 实例数: `258317`
- 审计结果数: `516634`
## 匹配口径
- 主键优先使用 legacy `fid`
- 没有 `fid` 的对象,回退到 `geometry + 稳定旧属性`
- 审计粒度保留 tile 实例,因为渲染具有 zoom 敏感性。
## 结果统计
- `extra_in_engineering`: `258317`
- `missing_in_engineering`: `258317`
## 主要问题层
- `extra_in_engineering` | `baseline_outline` | `87709`
- `missing_in_engineering` | `P基本線ククリ` | `87709`
- `extra_in_engineering` | `baseline_area` | `50421`
- `missing_in_engineering` | `P基本線` | `50421`
- `extra_in_engineering` | `depth_contour` | `36460`
- `missing_in_engineering` | `L等深線` | `36460`
- `extra_in_engineering` | `bathymetry_line` | `35940`
- `missing_in_engineering` | `L海底地形` | `35940`
- `extra_in_engineering` | `onshore_structure_line` | `10544`
- `missing_in_engineering` | `L陸上構造物陸` | `10544`
- `extra_in_engineering` | `land_area` | `7961`
- `missing_in_engineering` | `P陸域` | `7961`
- `extra_in_engineering` | `hole_area` | `6863`
- `missing_in_engineering` | `P穴` | `6863`
- `extra_in_engineering` | `seabed_text_point` | `4499`
- `missing_in_engineering` | `p底質` | `4499`
- `extra_in_engineering` | `hazard_boundary_outline` | `2646`
- `missing_in_engineering` | `P危険界ククリ` | `2646`
- `extra_in_engineering` | `fixed_fishing_gear_area` | `2479`
- `missing_in_engineering` | `P漁具定置箇所` | `2479`
## 标注专项问题
- `extra_text_in_engineering` | `bathymetry_line` | `24168`
- `text_missing_in_engineering` | `L海底地形` | `24168`
- `extra_text_in_engineering` | `depth_contour` | `11929`
- `text_missing_in_engineering` | `L等深線` | `11929`
- `extra_text_in_engineering` | `seabed_text_point` | `4499`
- `text_missing_in_engineering` | `p底質` | `4499`
- `extra_text_in_engineering` | `navigation_marks` | `1516`
- `text_missing_in_engineering` | `p航路標識群` | `1516`
- `text_missing_in_engineering` | `p地名` | `1444`
- `extra_text_in_engineering` | `place_label_sea` | `1444`
- `extra_icon_in_engineering` | `anchor_caution_hazard_point` | `1426`
- `icon_missing_in_engineering` | `p投錨注意障害物` | `1426`
- `text_missing_in_engineering` | `p地名陸` | `1109`
- `extra_text_in_engineering` | `place_label_land` | `1109`
- `icon_missing_in_engineering` | `p陸上構造物` | `910`
- `extra_icon_in_engineering` | `onshore_structure_point` | `891`
- `icon_missing_in_engineering` | `p航行危険障害物` | `664`
- `extra_icon_in_engineering` | `navigation_hazard_point` | `664`
- `extra_icon_in_engineering` | `navigation_marks` | `369`
- `icon_missing_in_engineering` | `p航路標識群` | `369`
## Style 语义专项问题
- `depth_numeric_missing` | `L海底地形` | `24168`
- `depth_numeric_missing` | `L等深線` | `11929`
- `safety_icon_missing` | `p航路標識群` | `1885`
- `depth_numeric_missing` | `L概略等深線` | `350`
- `clearance_numeric_missing` | `p高さ制限` | `33`
## 差异样例
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`-1001350668` | object=`100-200m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(200,230,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`hole_area` | fid=`-1001350668` | object=`P穴`
original: none
engineering: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`hole_area` | fid=`-1001350668` | object=`P穴`
original: none
engineering: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-100187935` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1004285450` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1004478221` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`hole_area` | fid=`-1004766316` | object=`P穴`
original: none
engineering: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1005227929` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1006671238` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-100667807` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1008857267` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-10089736` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1011245193` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1011298607` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`-1012210428` | object=`2000-3000m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(132,169,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`-1012615342` | object=`2000-3000m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(132,169,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1012930076` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-101311542` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1013768546` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1013908015` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1014608693` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-101554676` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_area` | fid=`-1015995687` | object=`10-20m`
original: none
engineering: fill=['fill:{"fill_color":"rgba(220,250,255,1)"}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1016774370` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1017142898` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1018128169` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1018165694` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1020992820` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1022609407` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`-1023696695` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
## 标注问题样例
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`navigation_marks` | fid=`-1033259184` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 22m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"手長島灯台"}']
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`navigation_marks` | fid=`-193326989` | object=`沿岸灯台 (15M over)`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-04027289"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Oc W 8s 106m 15M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"若宮灯台"}']
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`navigation_marks` | fid=`-60468407` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007768` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-04027289"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Oc W 8s 106m 15M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"若宮灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007824` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007921` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 22m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"手長島灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007971` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐大瀬灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p地名陸` | fid=`16040739` | object=`n/a`
original: text=['text:{"text_anchor":"bottom","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐市"}', 'text:{"text_anchor":"top","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iki"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/409` | source_layer=`p地名` | fid=`16040854` | object=`n/a`
original: text=['text:{"text_anchor":"bottom","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐島"}', 'text:{"text_anchor":"top","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"IKI SHIMA"}']
engineering: none
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`place_label_land` | fid=`2138221132` | object=`p地名陸`
original: none
engineering: text=['text:{"text_anchor":"bottom","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐市"}', 'text:{"text_anchor":"top","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iki"}']
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`navigation_marks` | fid=`509002199` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐大瀬灯台"}']
- `extra_text_in_engineering` | tile=`10/880/409` | source_layer=`place_label_sea` | fid=`906640000` | object=`p地名`
original: none
engineering: text=['text:{"text_anchor":"bottom","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐島"}', 'text:{"text_anchor":"top","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"IKI SHIMA"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`-1872756166` | object=`沿岸灯台 (15M over)`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Al Fl W,G 20s 99m W18,G16M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"二神島灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`-457133759` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 101m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"大碆鼻灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`-60468407` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`-918710454` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 12m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島曲り鼻灯台"}']
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007773` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-l3"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Al Fl W,G 20s 99m W18,G16M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"二神島灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007805` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 12m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島曲り鼻灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007823` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 31m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"海豚鼻灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007824` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007836` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 101m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"大碆鼻灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007880` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐郷ノ瀬灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007885` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 5s 46m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"馬ノ頭鼻灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007886` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"崎瀬鼻灯台"}']
engineering: none
- `text_missing_in_engineering` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007938` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 25m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島長崎鼻灯台"}']
engineering: none
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`1705367191` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 25m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島長崎鼻灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`1788936661` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 5s 46m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"馬ノ頭鼻灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`1977066498` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐郷ノ瀬灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`298413274` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"崎瀬鼻灯台"}']
- `extra_text_in_engineering` | tile=`10/880/410` | source_layer=`navigation_marks` | fid=`48104363` | object=`港湾灯台`
original: none
engineering: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 31m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"海豚鼻灯台"}']
## Style 语义问题样例
- `safety_icon_missing` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007768` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-04027289"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Oc W 8s 106m 15M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"若宮灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007824` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007921` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 22m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"手長島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/409` | source_layer=`p航路標識群` | fid=`12007971` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐大瀬灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007773` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-l3"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Al Fl W,G 20s 99m W18,G16M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"二神島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007805` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 12m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島曲り鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007823` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 31m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"海豚鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007824` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐長島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007836` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 101m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"大碆鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007880` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"壱岐郷ノ瀬灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007885` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 5s 46m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"馬ノ頭鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007886` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"崎瀬鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/410` | source_layer=`p航路標識群` | fid=`12007938` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 25m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"的山大島長崎鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007795` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 11m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"青砂埼灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007835` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 109m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"生月長瀬鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007897` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Al Fl(2) G,W 6s 7m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"平戸牛ケ首灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007919` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 49m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"津崎鼻灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007939` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 20m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"肥前横島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007940` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 9m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"南風埼灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007941` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 37m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"下枯木島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007942` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 8s 12m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"牛ケ首灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12007977` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m1"}', 'icon:{"icon_image":"light-daytime-1"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl G 3s 10m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"平戸港灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12008014` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 69m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"魚固島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12008025` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(2) W 6s 14m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"広瀬灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12008034` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 13m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"広瀬導流堤灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/411` | source_layer=`p航路標識群` | fid=`12008035` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 19m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"佐世保港弁天島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/412` | source_layer=`p航路標識群` | fid=`12007774` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-l3"}', 'icon:{"icon_image":"symbol-daytime-300"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 6s 64m 21M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"高後埼灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/412` | source_layer=`p航路標識群` | fid=`12007943` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 48m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"御床島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/412` | source_layer=`p航路標識群` | fid=`12007944` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 24m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"兜島灯台"}']
engineering: none
- `safety_icon_missing` | tile=`10/880/412` | source_layer=`p航路標識群` | fid=`12007945` | object=`n/a`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 15m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"大蟇島大瀬灯台"}']
engineering: none

View File

@@ -0,0 +1,563 @@
{
"original_feature_instances": 136461,
"domain_feature_instances": 136461,
"result_count": 136461,
"status_counts": {
"exact_match": 136402,
"mismatch": 59
},
"source_layer_issue_counts": [
{
"status": "mismatch",
"source_layer": "P投錨注意障害物",
"count": 48
},
{
"status": "mismatch",
"source_layer": "L739",
"count": 11
}
],
"mismatch_examples": [
{
"status": "mismatch",
"tile": "11/1762/821",
"source_layer": "L739",
"fid_legacy": "10004352",
"canonical_object_type": "平水境界",
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[4,1],\"line_width\":1}"
]
},
"domain_components": {
"line": [
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[3,1,1,1,1,1],\"line_width\":1}",
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[4,1],\"line_width\":1}"
]
}
},
{
"status": "mismatch",
"tile": "11/1762/821",
"source_layer": "L739",
"fid_legacy": "10004353",
"canonical_object_type": "平水境界",
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[4,1],\"line_width\":1}"
]
},
"domain_components": {
"line": [
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[3,1,1,1,1,1],\"line_width\":1}",
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[4,1],\"line_width\":1}"
]
}
},
{
"status": "mismatch",
"tile": "11/1762/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001547",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1762/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001586",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1762/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001612",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1762/822",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15002049",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1763/821",
"source_layer": "L739",
"fid_legacy": "10004353",
"canonical_object_type": "平水境界",
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[4,1],\"line_width\":1}"
]
},
"domain_components": {
"line": [
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[3,1,1,1,1,1],\"line_width\":1}",
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[4,1],\"line_width\":1}"
]
}
},
{
"status": "mismatch",
"tile": "11/1763/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001417",
"canonical_object_type": "険悪物",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-420\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-420\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1763/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001432",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1763/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001484",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1763/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001516",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1763/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001523",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1763/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001525",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1763/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001983",
"canonical_object_type": "険悪物",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-420\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-420\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1763/821",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15002047",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "L739",
"fid_legacy": "10004354",
"canonical_object_type": "平水境界",
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[4,1],\"line_width\":1}"
]
},
"domain_components": {
"line": [
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[3,1,1,1,1,1],\"line_width\":1}",
"line:{\"line_color\":\"rgba(7,7,7,1)\",\"line_dasharray\":[4,1],\"line_width\":1}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001551",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001581",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001590",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001593",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001610",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001616",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001632",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001634",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001640",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001647",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001657",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001660",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001662",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
},
{
"status": "mismatch",
"tile": "11/1764/820",
"source_layer": "P投錨注意障害物",
"fid_legacy": "15001673",
"canonical_object_type": "魚礁",
"original_components": {
"fill": [
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
},
"domain_components": {
"fill": [
"fill:{\"fill_color\":\"rgba(0,0,0,0)\"}",
"fill:{\"fill_pattern\":\"fill-daytime-428\"}"
]
}
}
]
}

View File

@@ -0,0 +1,121 @@
# NavSea 原始版 vs Domain 兼容版渲染审计报告
## 范围
- 原始样式: `/mnt/sda1/www/newpec/style.patched.local.json`
- Domain 样式: `/mnt/sda1/www/newpec/domain/style.domain-legacy-compatible-karatsu-10nm.json`
- 原始瓦片根目录: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- Domain 瓦片根目录: `/tmp/pbf-domain-karatsu-10nm-merged`
- 原始 feature 实例数: `136461`
- Domain feature 实例数: `136461`
- 审计结果数: `136461`
## Domain 口径说明
- 主键优先使用 legacy `fid`
- 没有 `fid` 的对象,回退到 `geometry + 稳定旧属性`
- 审计粒度保留 tile 实例,因为渲染具有 zoom 敏感性。
- 与旧审计不同,本脚本按 `source_layer_jp` 对齐实例,不按 Domain 标准层名对齐。
## 结果统计
- `exact_match`: `136402`
- `mismatch`: `59`
## 主要问题层
- `mismatch` | `P投錨注意障害物` | `48`
- `mismatch` | `L739` | `11`
## 差异样例
- `mismatch` | tile=`11/1762/821` | source_layer=`L739` | fid=`10004352` | object=`平水境界`
original: line=['line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[4,1],"line_width":1}']
domain: line=['line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[3,1,1,1,1,1],"line_width":1}', 'line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[4,1],"line_width":1}']
- `mismatch` | tile=`11/1762/821` | source_layer=`L739` | fid=`10004353` | object=`平水境界`
original: line=['line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[4,1],"line_width":1}']
domain: line=['line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[3,1,1,1,1,1],"line_width":1}', 'line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[4,1],"line_width":1}']
- `mismatch` | tile=`11/1762/821` | source_layer=`P投錨注意障害物` | fid=`15001547` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1762/821` | source_layer=`P投錨注意障害物` | fid=`15001586` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1762/821` | source_layer=`P投錨注意障害物` | fid=`15001612` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1762/822` | source_layer=`P投錨注意障害物` | fid=`15002049` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1763/821` | source_layer=`L739` | fid=`10004353` | object=`平水境界`
original: line=['line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[4,1],"line_width":1}']
domain: line=['line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[3,1,1,1,1,1],"line_width":1}', 'line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[4,1],"line_width":1}']
- `mismatch` | tile=`11/1763/821` | source_layer=`P投錨注意障害物` | fid=`15001417` | object=`険悪物`
original: fill=['fill:{"fill_pattern":"fill-daytime-420"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-420"}']
- `mismatch` | tile=`11/1763/821` | source_layer=`P投錨注意障害物` | fid=`15001432` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1763/821` | source_layer=`P投錨注意障害物` | fid=`15001484` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1763/821` | source_layer=`P投錨注意障害物` | fid=`15001516` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1763/821` | source_layer=`P投錨注意障害物` | fid=`15001523` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1763/821` | source_layer=`P投錨注意障害物` | fid=`15001525` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1763/821` | source_layer=`P投錨注意障害物` | fid=`15001983` | object=`険悪物`
original: fill=['fill:{"fill_pattern":"fill-daytime-420"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-420"}']
- `mismatch` | tile=`11/1763/821` | source_layer=`P投錨注意障害物` | fid=`15002047` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`L739` | fid=`10004354` | object=`平水境界`
original: line=['line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[4,1],"line_width":1}']
domain: line=['line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[3,1,1,1,1,1],"line_width":1}', 'line:{"line_color":"rgba(7,7,7,1)","line_dasharray":[4,1],"line_width":1}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001551` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001581` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001590` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001593` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001610` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001616` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001632` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001634` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001640` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001647` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001657` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001660` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001662` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']
- `mismatch` | tile=`11/1764/820` | source_layer=`P投錨注意障害物` | fid=`15001673` | object=`魚礁`
original: fill=['fill:{"fill_pattern":"fill-daytime-428"}']
domain: fill=['fill:{"fill_color":"rgba(0,0,0,0)"}', 'fill:{"fill_pattern":"fill-daytime-428"}']

View File

@@ -0,0 +1,703 @@
{
"original_feature_instances": 136461,
"engineering_feature_instances": 136461,
"result_count": 272922,
"status_counts": {
"missing_in_engineering": 136461,
"extra_in_engineering": 136461
},
"source_layer_issue_counts": [
{
"status": "missing_in_engineering",
"source_layer": "P基本線ククリ",
"count": 56582
},
{
"status": "extra_in_engineering",
"source_layer": "baseline_outline",
"count": 56582
},
{
"status": "missing_in_engineering",
"source_layer": "P基本線",
"count": 30442
},
{
"status": "extra_in_engineering",
"source_layer": "baseline_area",
"count": 30442
},
{
"status": "missing_in_engineering",
"source_layer": "L等深線",
"count": 17750
},
{
"status": "extra_in_engineering",
"source_layer": "depth_contour",
"count": 17750
},
{
"status": "missing_in_engineering",
"source_layer": "L海底地形",
"count": 13763
},
{
"status": "extra_in_engineering",
"source_layer": "bathymetry_line",
"count": 13763
},
{
"status": "missing_in_engineering",
"source_layer": "P陸域",
"count": 4141
},
{
"status": "extra_in_engineering",
"source_layer": "land_area",
"count": 4141
},
{
"status": "missing_in_engineering",
"source_layer": "P穴",
"count": 3661
},
{
"status": "extra_in_engineering",
"source_layer": "hole_area",
"count": 3661
},
{
"status": "missing_in_engineering",
"source_layer": "L陸上構造物陸",
"count": 3641
},
{
"status": "extra_in_engineering",
"source_layer": "onshore_structure_line",
"count": 3641
},
{
"status": "missing_in_engineering",
"source_layer": "p底質",
"count": 1111
},
{
"status": "extra_in_engineering",
"source_layer": "seabed_text_point",
"count": 1111
},
{
"status": "missing_in_engineering",
"source_layer": "P危険界ククリ",
"count": 829
},
{
"status": "extra_in_engineering",
"source_layer": "hazard_boundary_outline",
"count": 829
},
{
"status": "missing_in_engineering",
"source_layer": "L基本線",
"count": 619
},
{
"status": "extra_in_engineering",
"source_layer": "baseline_line",
"count": 619
},
{
"status": "extra_in_engineering",
"source_layer": "navigation_marks",
"count": 574
},
{
"status": "missing_in_engineering",
"source_layer": "p航路標識群",
"count": 574
},
{
"status": "extra_in_engineering",
"source_layer": "place_label_sea",
"count": 466
},
{
"status": "missing_in_engineering",
"source_layer": "p地名",
"count": 466
},
{
"status": "missing_in_engineering",
"source_layer": "P漁具定置箇所",
"count": 461
},
{
"status": "extra_in_engineering",
"source_layer": "fixed_fishing_gear_area",
"count": 461
},
{
"status": "missing_in_engineering",
"source_layer": "P橋りょう等構造物",
"count": 423
},
{
"status": "extra_in_engineering",
"source_layer": "bridge_structure",
"count": 423
},
{
"status": "extra_in_engineering",
"source_layer": "place_label_land",
"count": 416
},
{
"status": "missing_in_engineering",
"source_layer": "p地名陸",
"count": 416
}
],
"mismatch_examples": [
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000001|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000001|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000001",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000001|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000001|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000001",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000023|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000023|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000023",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000023|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000023|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000023",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000024|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000024|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000024",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000024|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000024|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000024",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000042|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000042|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000042",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000042|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000042|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000042",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000055|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000055|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000055",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000055|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000055|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000055",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000056|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000056|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000056",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000056|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000056|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000056",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000058|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000058|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000058",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000058|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000058|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000058",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000059|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000059|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000059",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000059|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000059|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000059",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000069|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000069|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000069",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000069|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000069|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000069",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000073|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000073|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000073",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000073|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000073|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000073",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000081|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000081|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000081",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000081|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000081|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000081",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000092|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000092|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000092",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000092|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000092|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000092",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000094|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000094|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000094",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000094|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000094|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000094",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000096|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000096|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000096",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000096|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000096|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000096",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
},
{
"status": "missing_in_engineering",
"object_instance_id": "fid:4000105|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:P基本線ククリ",
"object_id": "fid:4000105|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000105",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "P基本線ククリ",
"canonical_object_type": null,
"original_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
},
"engineering_components": {}
},
{
"status": "extra_in_engineering",
"object_instance_id": "fid:4000105|src:P基本線ククリ|geom:LineString|z:0|x:0|y:0|layer:baseline_outline",
"object_id": "fid:4000105|src:P基本線ククリ|geom:LineString",
"fid_legacy": "4000105",
"tile": "0/0/0",
"tile_z": 0,
"tile_x": 0,
"tile_y": 0,
"source_layer": "baseline_outline",
"canonical_object_type": "P基本線ククリ",
"original_components": {},
"engineering_components": {
"line": [
"line:{\"line_color\":\"rgba(95,106,95,1)\",\"line_width\":2}"
]
}
}
]
}

View File

@@ -0,0 +1,138 @@
# NavSea 原始版 vs 工程版渲染审计报告
## 范围
- 原始样式: `/mnt/sda1/www/newpec/style.patched.local.json`
- 工程样式: `/mnt/sda1/www/newpec/domain/style.domain-legacy-compatible-karatsu-10nm.json`
- 原始瓦片根目录: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- 工程瓦片根目录: `/tmp/pbf-domain-karatsu-10nm-merged`
- 原始 feature 实例数: `136461`
- 工程 feature 实例数: `136461`
- 审计结果数: `272922`
## 匹配口径
- 主键优先使用 legacy `fid`
- 没有 `fid` 的对象,回退到 `geometry + 稳定旧属性`
- 审计粒度保留 tile 实例,因为渲染具有 zoom 敏感性。
## 结果统计
- `missing_in_engineering`: `136461`
- `extra_in_engineering`: `136461`
## 主要问题层
- `missing_in_engineering` | `P基本線ククリ` | `56582`
- `extra_in_engineering` | `baseline_outline` | `56582`
- `missing_in_engineering` | `P基本線` | `30442`
- `extra_in_engineering` | `baseline_area` | `30442`
- `missing_in_engineering` | `L等深線` | `17750`
- `extra_in_engineering` | `depth_contour` | `17750`
- `missing_in_engineering` | `L海底地形` | `13763`
- `extra_in_engineering` | `bathymetry_line` | `13763`
- `missing_in_engineering` | `P陸域` | `4141`
- `extra_in_engineering` | `land_area` | `4141`
- `missing_in_engineering` | `P穴` | `3661`
- `extra_in_engineering` | `hole_area` | `3661`
- `missing_in_engineering` | `L陸上構造物陸` | `3641`
- `extra_in_engineering` | `onshore_structure_line` | `3641`
- `missing_in_engineering` | `p底質` | `1111`
- `extra_in_engineering` | `seabed_text_point` | `1111`
- `missing_in_engineering` | `P危険界ククリ` | `829`
- `extra_in_engineering` | `hazard_boundary_outline` | `829`
- `missing_in_engineering` | `L基本線` | `619`
- `extra_in_engineering` | `baseline_line` | `619`
## 差异样例
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000001` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000001` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000023` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000023` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000024` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000024` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000042` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000042` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000055` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000055` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000056` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000056` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000058` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000058` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000059` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000059` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000069` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000069` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000073` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000073` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000081` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000081` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000092` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000092` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000094` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000094` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000096` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000096` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `missing_in_engineering` | tile=`0/0/0` | source_layer=`P基本線ククリ` | fid=`4000105` | object=`n/a`
original: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
engineering: none
- `extra_in_engineering` | tile=`0/0/0` | source_layer=`baseline_outline` | fid=`4000105` | object=`P基本線ククリ`
original: none
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']

View File

@@ -0,0 +1,10 @@
{
"original_feature_instances": 6434060,
"engineering_feature_instances": 6434060,
"result_count": 6434060,
"status_counts": {
"exact_match": 6434060
},
"source_layer_issue_counts": [],
"mismatch_examples": []
}

View File

@@ -0,0 +1,29 @@
# NavSea 原始版 vs 工程版渲染审计报告
## 范围
- 原始样式: `/home/wwwroot/newpec/style.patched.local.json`
- 工程样式: `/home/wwwroot/newpec/navsea-engineering-full.json`
- 原始瓦片根目录: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- 工程瓦片根目录: `/home/wwwroot/pbf-engineering-full`
- 原始 feature 实例数: `6434060`
- 工程 feature 实例数: `6434060`
- 审计结果数: `6434060`
## 匹配口径
- 主键优先使用 legacy `fid`
- 没有 `fid` 的对象,回退到 `geometry + 稳定旧属性`
- 审计粒度保留 tile 实例,因为渲染具有 zoom 敏感性。
## 结果统计
- `exact_match`: `6434060`
## 主要问题层
- 没有发现差异。
## 差异样例
- 没有差异样例。

View File

@@ -0,0 +1,347 @@
# NavSea 语义分包与叠加渲染设计
## 目标
本设计说明 NavSea 如何将某一坐标区域内的海图数据按语义拆分成多个 `pbf` 包,并在客户端或 Resolver 侧叠加恢复出与当前整包渲染近似等价的最终视觉结果。
这份设计服务于三个目标:
1. 在不损失海图细节的前提下重构 `pbf` 数据结构。
2. 让安全相关数据与细节相关数据可以分开交付、缓存、下载和审计。
3. 为后续离线包、Tile Resolver、按需加载和流量控制提供基础。
## 核心结论
可以将一个区域的 `pbf` 按语义拆分成多个包。
这些包在渲染时叠加后,可以恢复出与当前整包 `pbf` 基本一致的视觉结果。
但前提是:
1. 各包的语义边界稳定。
2. 样式明确知道每一层来自哪个包。
3. 叠加顺序固定。
4. 有专门的分包叠加一致性审计。
## 逻辑分层模型
当前建议的逻辑层仍采用 `NavSea_Chart_Domain_Model_v1.md` 中定义的三层模型:
1. `safety_core`
2. `safety_extended`
3. `detail`
并保留:
4. `domain_pending`
说明:
- `safety_core` 是最低安全底线。
- `safety_extended` 是重要但允许降级的数据层。
- `detail` 是信息丰富但不构成最低安全底线的层。
- `domain_pending` 是尚未完成业务语义重建的过渡层,不应直接成为正式 Chart Domain 的长期成员。
## 物理分包模型
建议 `v1` 采用“逻辑三层,物理两包”的结构:
1. `safety.pbf`
包含:
- `safety_core`
- `safety_extended`
2. `detail.pbf`
包含:
- `detail`
在兼容阶段可允许:
3. `compat_pending.pbf`
仅用于兼容迁移期承载少量 `domain_pending` 层。
如果不单独出第三包,也可以在迁移期临时将少量 `domain_pending` 兼容层放入 `safety` 包,但必须有审计记录。
## 为什么不建议一开始拆成很多小包
虽然理论上可以拆成:
- `hazard.pbf`
- `contour.pbf`
- `marks.pbf`
- `labels.pbf`
- `seabed.pbf`
`v1` 不建议这样做。
原因:
1. 客户端 source 数量会快速膨胀。
2. 样式复杂度显著增加。
3. Tile Resolver 逻辑会变重。
4. 网络请求会被切碎。
5. 审计维度会显著复杂化。
因此 `v1` 先采用两包结构最稳。
## 叠加渲染原则
语义分包后,最终渲染必须遵守以下原则。
### 原则 1安全层不能被细节层替代
任意 `detail` feature 不得被视为 `safety_core` 的替代来源。
即使 `detail` 中恰好存在一个对象在视觉上看起来能表达某种危险,也不能把它作为安全底线的替代依据。
### 原则 2Resolver 按包返回,不按 layer/feature 拼装
`v1` Resolver 必须按物理包分发,不在客户端做 feature 级或 layer 级重组。
也就是说:
- 返回 `safety`
- 返回 `detail`
而不是:
- 从多个包中抽若干 layer
- 再动态重新打成新 tile
### 原则 3样式叠加顺序固定
客户端的样式层顺序必须固定,不能由请求时动态推断。
最基础的顺序建议是:
1. 背景与底图
2. `safety` 面层
3. `detail` 面层
4. `safety` 线层
5. `detail` 线层
6. `safety` 符号层
7. `detail` 符号层
8. `safety` 文字层
9. `detail` 文字层
### 原则 4分包后必须还能恢复旧视觉
当前阶段的首要目标不是做新视觉,而是:
- 新结构
- 旧视觉
所以“分包叠加结果”和“原始整包结果”必须可做等价审计。
## 推荐消费模式
### 模式 A单 Style多 Source 叠加
这是当前最推荐的模式。
样式中声明:
- `domain_safety`
- `domain_detail`
然后不同 layer 从不同 source 取数据。
优点:
1. 最符合 MapLibre / Mapbox Style 常规工作方式。
2. 不需要客户端自行拼瓦片。
3. 便于渐进迁移旧样式。
4. 最适合当前阶段的视觉等价验证。
### 模式 BResolver 选择性返回包
Resolver 按场景返回:
- 只返回 `safety`
- 返回 `safety + detail`
客户端仍按固定 source/固定 style 消费。
优点:
1. 更适合离线/带宽优化。
2. 可以基于业务场景做包级裁剪。
要求:
- 样式必须在缺少 `detail` 时仍可安全退化。
- 不允许缺少 `safety_core` 时依赖 `detail` 伪装补齐。
## 推荐目录结构
### 局部测试目录
```text
/home/wwwroot/pbf-domain-karatsu-10nm/
├── safety/{z}/{x}/{y}.pbf
├── detail/{z}/{x}/{y}.pbf
├── chart_domain_build_audit.json
└── chart_domain_build_audit.md
```
### 全国目录建议
```text
/home/wwwroot/pbf-domain-full/
├── safety/{z}/{x}/{y}.pbf
├── detail/{z}/{x}/{y}.pbf
├── build_audit.json
├── build_audit.md
├── overlay_audit.json
└── overlay_audit.md
```
## 样式组织建议
### 兼容阶段
优先使用:
- 旧样式规则
- 新 Domain 包 source
也就是当前已经验证过的路径:
- 保留旧 `paint`
- 保留旧 `layout`
- 保留旧 `filter`
- 仅替换 `source``source-layer`
### 清理阶段
在视觉对齐后,再逐步:
1. 去掉旧日文 `layer id`
2. 去掉旧字段依赖
3. 收敛到纯标准语义 layer
4. 最终形成新的可读样式层命名
## 审计设计
分包以后,必须增加一套新的“叠加一致性审计”。
建议至少做三类审计。
### 1. 构建审计
检查:
- 每个 feature 被分到了哪个包
- 是否有 feature 被错误丢弃
- `domain_pending` 数量和明细
- 包内实际 layer 集合
当前已有样例:
- `chart_domain_build_audit.json`
- `chart_domain_build_audit.md`
### 2. 渲染等价审计
比较:
- 原始版:原始样式 + 原始 `pbf`
- 分包版:兼容样式 + `safety/detail` 叠加结果
审计单位:
- `fid` 优先
-`fid``geometry + 稳定旧属性`
- 保留 tile instance 粒度
注意:
- 分包版不能按新标准 layer 名直接对比
- 必须按 `source_layer_jp` 或 trace 回溯后的旧身份对齐
当前已经为此新建了 Domain 专用脚本方向:
- `src/Domain/navsea_domain_render_audit.py`
### 3. 包级可用性审计
验证以下两种消费结果:
1. `safety` 单独加载
2. `safety + detail` 叠加加载
目标:
- `safety` 单独时,满足最低安全表达
- `safety + detail` 时,尽可能恢复原始整包视觉
## 推荐审计结论口径
建议把审计结论分成三档:
1. `safe_minimum_pass`
`safety` 单独可用于最低安全判断
2. `overlay_equivalent_pass`
`safety + detail` 叠加结果与原始版视觉等价
3. `pending_semantic_gap`
存在尚未完成业务语义重建的层,仅靠兼容模式暂时保留
## 当前阶段的正确顺序
推荐按以下顺序推进,不要反过来:
1. 重构 `pbf` 内部结构
2. 用新结构恢复旧视觉
3. 用 Domain 专用审计确认“叠加等价”
4. 再做分包消费策略和 Resolver 策略
5. 最后才做新的 UI/新视觉/新风格
## 当前阶段的可接受实现
就当前工程而言,以下做法是合理的:
1. 区域级生成
例如先做唐津 10 海里
2. 输出两包
- `safety`
- `detail`
3. 提供一个兼容样式
目标是“看起来和旧版一样”
4. 提供 Domain 专用审计
不修改原有工程版审计体系
这意味着:
- 旧体系继续可用
- Domain 体系独立演进
- 两条线彼此不污染
## 后续实施建议
建议下一阶段按以下顺序执行:
1. 固化唐津 10 海里 Domain 审计结论
2. 将唐津流程推广到九州区域
3. 补齐 `domain_pending` 的正式业务语义
4. 在全国范围生成 `safety/detail` 双包
5. 增加 `safety-only``safety+detail` 双场景验收
## 总结
某个坐标区域的 `pbf` 完全可以按语义拆成多个包。
这些包叠加后,可以恢复到与当前整包渲染近似等价的状态。
这不是额外能力,而是 NavSea Domain 设计成立的核心验证点之一。
真正需要控制的,不是“能不能拆”,而是:
1. 语义边界是否稳定
2. 样式是否固定知道从哪个包取哪种对象
3. `detail` 是否错误替代 `safety`
4. 是否存在分包叠加的一致性审计

View File

@@ -0,0 +1,266 @@
# 九州 Delivery 图层双用途分类
## 目的
本文把当前 `kyushu delivery` 实际使用的图层,按两个业务方向重新整理:
1. 航海用
2. 钓鱼用
这里的“分类”不是按历史样式命名分,而是按使用目标分:
- 航海用:
- 用于大范围危险早察觉
- 用于碰撞风险检测
- 用于航行实时检测
- 用于航线设计
- 原则上弱化过细水深细节,强化危险物、障碍物、净空、导助航信息
- 钓鱼用:
- 用于看海底细节
- 用于看鱼礁、穴、底质、海底起伏
- 原则上强化海底信息与渔场相关信息
## 当前实际图层来源
本次整理基于当前 [`style.navsea-delivery-kyushu.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-kyushu.json) 中实际消费的 source-layer
- `baseline_area`
- `anchor_caution_hazard_area`
- `navigation_hazard_area`
- `fixed_fishing_gear_area`
- `anchorage_area`
- `facility_boundary_area`
- `submerged_reef_area`
- `bridge_structure`
- `onshore_structure_area`
- `land_area`
- `hole_area`
- `bathymetry_line`
- `depth_contour`
- `depth_contour_overview`
- `seabed_line`
- `baseline_line`
- `onshore_structure_line`
- `depth_zone_739`
- `depth_zone_741`
- `clearance_limit_line`
- `baseline_outline`
- `hazard_boundary_outline`
- `navigation_hazard_outline`
- `anchor_caution_hazard_outline`
- `anchorage_outline`
- `facility_boundary_outline`
- `clip_outline_754`
- `navigation_hazard_point`
- `anchorage_point`
- `anchor_caution_hazard_point`
- `navigation_marks`
- `facility_boundary_point`
- `pilot_station_point`
- `onshore_structure_point`
- `seabed_text_point`
- `clearance_limit_point`
- `place_label_sea`
- `place_label_land`
## 一、航海用
## 定义
航海用图层的目标是:
- 让危险尽早出现
- 让障碍物易检测
- 让通航辅助信息明确
- 让碰撞、净空、航线设计所需信息优先
## A. 航海用核心层
这些层建议作为“航海用”的主显示层,优先级最高。
| 图层 | 作用 | 归类理由 |
| --- | --- | --- |
| `land_area` | 陆地区域 | 航行安全的绝对边界。 |
| `baseline_area` | 基础海陆/岸线容器 | 当前样式里承载海面、水域、浅滩、未测区等安全底图。 |
| `navigation_hazard_area` | 航行危险区域 | 直接通航危险。 |
| `navigation_hazard_outline` | 航行危险边界 | 让危险范围更早被看见。 |
| `navigation_hazard_point` | 航行危险点 | 暗礁、沉船、危险障碍点等碰撞检测核心对象。 |
| `anchor_caution_hazard_area` | 注意障碍区域 | 虽是“投锚注意”命名,但实际含鱼礁、障碍、险恶物等,应纳入危险感知。 |
| `anchor_caution_hazard_outline` | 注意障碍边界 | 让范围型障碍物更容易提早察觉。 |
| `anchor_caution_hazard_point` | 注意障碍点 | 对航线绕避也重要,不能只放在钓鱼用。 |
| `fixed_fishing_gear_area` | 定置渔具区 | 对航行规避很重要,是碰撞/缠绕风险层。 |
| `submerged_reef_area` | 潜堤/潜礁区 | 本质是危险地形。 |
| `navigation_marks` | 航标/灯标/浮标 | 实时航行检测、定位、航线设计的核心参考。 |
| `bridge_structure` | 桥梁等结构物 | 通航结构风险与通道判断核心。 |
| `clearance_limit_line` | 净空限制线 | 航线设计、通过性判断核心。 |
| `clearance_limit_point` | 净空限制点 | 直接承载净空值与限制提示。 |
| `facility_boundary_area` | 设施/边界区域 | 港区、设施边界、禁近范围对航行有约束。 |
| `facility_boundary_outline` | 设施/边界线 | 轮廓比填充更适合早察觉。 |
| `facility_boundary_point` | 设施符号点 | 港湾设施、边界点对避让和定位有用。 |
| `anchorage_area` | 锚地区域 | 航线设计、航泊决策要素。 |
| `anchorage_outline` | 锚地边界 | 区域边界比填充更重要。 |
| `anchorage_point` | 锚地符号点 | 图面识别有帮助。 |
| `pilot_station_point` | 引航站 | 航海服务信息。 |
## B. 航海用辅助层
这些层应该保留,但视觉权重应低于危险层和航标层。
| 图层 | 作用 | 建议 |
| --- | --- | --- |
| `depth_contour_overview` | 概略等深线 | 保留整体深浅趋势,不必太密。 |
| `depth_contour` | 等深线 | 只保留关键层级或降低对比度。 |
| `bathymetry_line` | 海底辅助线 | 仅作地形参考,不应压过危险层。 |
| `depth_zone_739` | 水域边界线 | 可作背景辅助。 |
| `depth_zone_741` | 规则/边界线 | 可作背景辅助。 |
| `onshore_structure_area` | 岸边结构物面 | 近岸定位参考。 |
| `onshore_structure_line` | 岸边结构物线 | 近岸定位参考。 |
| `onshore_structure_point` | 陆标点 | 对近岸定位有帮助。 |
| `place_label_sea` | 海上地名 | 保留基础定位语义。 |
| `place_label_land` | 陆上地名 | 保留基础定位语义。 |
## C. 航海用建议弱化或隐藏层
这些层不是不能存在,而是对“危险早察觉”不是第一优先。
| 图层 | 原因 |
| --- | --- |
| `depth-contour-labels` / `bathymetry-depth-labels` | 过密时会压住危险点、障碍点、航标。 |
| `bottom-material-labels` | 对通航安全不是第一优先。 |
| `hole_area` | 对航海是补充信息,不是主风险提示层。 |
| `seabed_line` | 更偏海底阅读,不是碰撞检测核心层。 |
## 二、钓鱼用
## 定义
钓鱼用图层的目标是:
- 让海底起伏更清楚
- 让鱼礁、穴、底质、海底结构更容易被发现
- 让选点时更容易判断地形与鱼群聚集可能性
## A. 钓鱼用核心层
这些层建议作为“钓鱼用”的主显示层,优先级最高。
| 图层 | 作用 | 归类理由 |
| --- | --- | --- |
| `depth_contour` | 等深线 | 看坡、脊、沟、坎的核心。 |
| `depth_contour_overview` | 概略等深线 | 看大地形趋势、找整体结构。 |
| `bathymetry_line` | 海底地形辅助线 | 对细看海底很有帮助。 |
| `bathymetry-depth-labels` | 水深数字 | 直接判断具体水深。 |
| `depth-contour-labels` | 等深线文字 | 帮助快速读线。 |
| `seabed_text_point` | 底质标注点 | 泥、沙、砾、壳等底质是钓点判断核心。 |
| `seabed_line` | 海底线 | 海底细节辅助。 |
| `submerged_reef_area` | 潜堤/潜礁区 | 渔场相关高价值信息。 |
| `anchor_caution_hazard_point` | 鱼礁/障碍/注意点 | 这里面实际包含鱼礁与障碍类点,是钓鱼用关键层。 |
| `anchor_caution_hazard_area` | 注意障碍区域 | 相关鱼礁/障碍区域也应被看清。 |
| `hole_area` | 穴/凹地区域 | 明确属于你提到的钓鱼用重点。 |
| `fixed_fishing_gear_area` | 渔具区 | 与渔业活动分布高度相关。 |
## B. 钓鱼用辅助层
这些层应保留,用于定位和安全感知,但不应压过海底信息。
| 图层 | 作用 | 建议 |
| --- | --- | --- |
| `land_area` | 陆地背景 | 保留基本定位。 |
| `baseline_area` | 海面/岸线底图 | 保留基础背景。 |
| `navigation_marks` | 航标定位参考 | 便于回点、识别位置,但权重低于海底层。 |
| `navigation_hazard_point` | 危险点 | 保留安全底线提示。 |
| `navigation_hazard_area` | 危险区 | 保留安全底线提示。 |
| `facility_boundary_area` | 港区设施 | 近岸定位参考。 |
| `facility_boundary_point` | 设施点 | 近岸定位参考。 |
| `onshore_structure_point` | 陆标点 | 回点/定位参考。 |
| `place_label_sea` | 海上地名 | 位置参考。 |
| `place_label_land` | 陆上地名 | 位置参考。 |
## C. 钓鱼用建议弱化层
| 图层 | 原因 |
| --- | --- |
| `clearance_limit_line` / `clearance_limit_point` | 对钓点选择不是核心。 |
| `pilot_station_point` | 对钓鱼不是重点。 |
| `anchorage_area` / `anchorage_outline` / `anchorage_point` | 可保留但不应抢视觉。 |
| `bridge_structure` | 只在局部近岸场景有帮助。 |
## 三、按产品方向的最终建议
## 1. 航海用建议
如果目标是:
- 危险碰撞检测
- 航行实时检测
- 航线设计
建议采用:
- 强化:
- `navigation_hazard_*`
- `anchor_caution_hazard_*`
- `fixed_fishing_gear_area`
- `submerged_reef_area`
- `navigation_marks`
- `bridge_structure`
- `clearance_limit_*`
- `facility_boundary_*`
- 保留但降权:
- `depth_contour`
- `bathymetry_line`
- `seabed_text_point`
- `hole_area`
一句话总结:
- 航海用应该是“危险物优先、导助航优先、深度细节退后”。
## 2. 钓鱼用建议
如果目标是:
- 找地形
- 找鱼礁
- 看底质
- 看海底细节
建议采用:
- 强化:
- `depth_contour`
- `depth_contour_overview`
- `bathymetry_line`
- `bathymetry-depth-labels`
- `depth-contour-labels`
- `seabed_text_point`
- `seabed_line`
- `submerged_reef_area`
- `anchor_caution_hazard_*`
- `hole_area`
- 保留但降权:
- `navigation_marks`
- `navigation_hazard_*`
- `facility_boundary_*`
- `clearance_limit_*`
一句话总结:
- 钓鱼用应该是“海底信息优先、鱼礁穴位优先、安全层保底但不抢主视觉”。
## 四、建议的后续实施方式
下一步如果要真正落产品,我建议不要继续只维护一套 style而是拆成两个 profile
1. `delivery-navigation`
- 面向航海安全、碰撞检测、实时航行
2. `delivery-fishing`
- 面向钓点、海底结构、鱼礁/穴/底质阅读
优先级建议:
1. 先保持同一套 PBF
2. 只分两套 style
3. 先做视觉权重拆分,不急着拆数据
这样改动最小,但业务方向会清楚很多。

View File

@@ -0,0 +1,434 @@
# 九州 Delivery 对象属性分组
## 目的
本文不再按“航海用 / 钓鱼用”分,而是按对象属性与业务语义相同的 group 重新整理当前 `kyushu delivery` 图层。
整理目标是:
- 让后续 style 拆分时,先按对象类别看清当前图层结构
- 明确每一组对象当前对应哪些 `source-layer`
- 明确每一组对象当前实际由哪些 render layer 在画
这里的“group”按业务对象语义来定例如
- 等深线
- 鱼礁
- 灯塔
- 港口灯
- 渔网
- 海上标识
- 陆地设施
- 桥梁 / 跨空线
- 海底质
- 海底危险物
## 基础说明
本次整理基于当前样式:
- [`style.navsea-delivery-kyushu.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-kyushu.json)
说明:
- `source-layer`
- 指 delivery PBF 中的语义层
- `render layer`
- 指样式里的具体绘制层 id
- 一个 group 可能对应多个 `source-layer`
- 一个 `source-layer` 也可能被拆成多个 render layer 表现
## 1. 等深线
## 含义
- 主要表达海底深浅变化与地形坡坎
- 是读海底结构的主线索
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `depth_contour` |
| source-layer | `depth_contour_overview` |
| source-layer | `bathymetry_line` |
| render layer | `depth-contours` |
| render layer | `depth-contours-major` |
| render layer | `depth-contour-labels` |
| render layer | `depth-contours-major-labels` |
| render layer | `bathymetry-support` |
| render layer | `bathymetry-depth-labels` |
## 说明
- `depth_contour`
- 主等深线
- `depth_contour_overview`
- 概略等深线
- `bathymetry_line`
- 海底辅助线与水深数字承载线
## 2. 鱼礁
## 含义
- 鱼礁、人工礁、抛锚注意障碍中的鱼礁类对象
- 对钓鱼和避碰都重要
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `anchor_caution_hazard_area` |
| source-layer | `anchor_caution_hazard_outline` |
| source-layer | `anchor_caution_hazard_point` |
| source-layer | `submerged_reef_area` |
| render layer | `hazard-polygons` |
| render layer | `anchor-danger-outline` |
| render layer | `anchor-hazard-points` |
| render layer | `anchor-hazard-points-428` |
| render layer | `submerged-structures` |
## 说明
- 当前“鱼礁”并不是单独一层
- 主要散落在:
- `anchor_caution_hazard_*`
- `submerged_reef_area`
- 后续如果要单做钓鱼版,建议把鱼礁从 `anchor_caution_hazard_*` 里再细拆出来
## 3. 灯塔
## 含义
- 大型灯塔、沿岸灯塔、航海定位核心灯标
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `navigation_marks` |
| render layer | `nav-marks-harbor-lighthouses` |
| render layer | `nav-marks-breakwater-lighthouses` |
| render layer | `nav-light-arc` |
| render layer | `nav-light-flare` |
| render layer | `nav-mark-labels` |
| render layer | `nav-light-abbr-labels` |
## 说明
- 当前样式中,灯塔类都从 `navigation_marks` 分流出来
- 弧光与 flare 仍是同一个 `source-layer` 上的附加表现
## 4. 港口灯
## 含义
- 港口灯、防波堤灯、近港入口灯标
- 属于航海用的强引导对象
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `navigation_marks` |
| render layer | `nav-marks-harbor-lighthouses` |
| render layer | `nav-marks-breakwater-lighthouses` |
| render layer | `nav-light-flare` |
| render layer | `nav-mark-labels` |
| render layer | `nav-light-abbr-labels` |
## 说明
- “港口灯”目前不是单独 source-layer
- 依靠 `navigation_marks` 内部的 `display_code` / 语义分层来区分
## 5. 渔网 / 渔具
## 含义
- 定置渔具、渔网、渔场作业相关区域
- 对航行规避与钓点判断都很重要
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `fixed_fishing_gear_area` |
| render layer | `fishery-areas` |
| render layer | `fishery-areas-outline` |
## 说明
- 这是当前最接近“渔网 / 渔具”独立 group 的一组
- 后续如果要单做渔业专题层,可以直接从这一组开始
## 6. 海上标识
## 含义
- 浮标、灯浮标、灯标、AIS、一般航标与引导标识
- 用于导助航、回点、通航识别
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `navigation_marks` |
| render layer | `nav-marks-small-lights` |
| render layer | `nav-marks-light-beacons` |
| render layer | `nav-marks` |
| render layer | `nav-light-flare` |
| render layer | `nav-mark-labels` |
| render layer | `nav-light-abbr-labels` |
## 说明
- 这是一个大 group
- 当前内部实际又包含:
- 小灯
- 灯标
- 浮标
- 其他海上标识
- 如后续要再细分,可从 `navigation_marks` 内继续拆:
- `display_code`
- `shape_class_code`
- `chart_symbol_code`
## 7. 陆地设施
## 含义
- 陆上结构物
- 港口/设施边界相关点面
- 可用于近岸定位和设施识别
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `facility_boundary_area` |
| source-layer | `facility_boundary_outline` |
| source-layer | `facility_boundary_point` |
| source-layer | `onshore_structure_area` |
| source-layer | `onshore_structure_line` |
| source-layer | `onshore_structure_point` |
| render layer | `facility-zones` |
| render layer | `facility-zone-outline` |
| render layer | `facility-points` |
| render layer | `land-structures-area` |
| render layer | `land-structures-line` |
| render layer | `landmark-points` |
| render layer | `landmark-point-fallback` |
## 说明
- 这组里其实包含两类对象:
- 港口设施 / 边界设施
- 一般陆上结构物 / 地标
- 如果后续要更清楚,建议再拆成:
- 港口设施
- 陆标设施
## 8. 桥梁 / 跨空线
## 含义
- 桥梁
- 净空限制
- 影响通过性判断的跨越结构
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `bridge_structure` |
| source-layer | `clearance_limit_line` |
| source-layer | `clearance_limit_point` |
| render layer | `bridge-area` |
| render layer | `bridge-outline` |
| render layer | `height-limit-line` |
| render layer | `height-limit-points` |
| render layer | `height-limit-name-labels` |
| render layer | `height-limit-value-labels` |
## 说明
- “桥梁”和“跨空线/净空线”当前是两组 source-layer
- 但从业务上可以放在同一个大 group
## 9. 海底质
## 含义
- 泥、沙、砾、壳、岩等底质信息
- 对钓鱼、底拖、地形理解很重要
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `seabed_text_point` |
| source-layer | `seabed_line` |
| render layer | `bottom-material-labels` |
| render layer | `subsea-cables` |
## 说明
- `seabed_text_point`
- 明确是底质文字层
- `seabed_line`
- 当前命名较宽,样式里实际由 `subsea-cables` 在消费
- 这一组后续建议再查清:
- `seabed_line` 到底是海底辅助线,还是混有其他线性海底对象
## 10. 海底危险物
## 含义
- 暗礁、沉船、露岩、洗岩、浅滩、危险障碍、潜堤等
- 这是航行安全核心 group
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `navigation_hazard_area` |
| source-layer | `navigation_hazard_outline` |
| source-layer | `navigation_hazard_point` |
| source-layer | `anchor_caution_hazard_area` |
| source-layer | `anchor_caution_hazard_outline` |
| source-layer | `anchor_caution_hazard_point` |
| source-layer | `submerged_reef_area` |
| source-layer | `baseline_area` |
| render layer | `navigation-hazard-polygons` |
| render layer | `navigation-hazard-outline` |
| render layer | `hazard-points` |
| render layer | `hazard-polygons` |
| render layer | `anchor-danger-outline` |
| render layer | `anchor-hazard-points` |
| render layer | `anchor-hazard-points-428` |
| render layer | `submerged-structures` |
| render layer | `shoal-danger-area` |
| render layer | `unsurveyed-area` |
## 说明
- 这是当前最复杂的一组
- 里面混合了:
- 直接航行危险物
- 抛锚注意危险物
- 潜堤/潜礁
- 浅滩/未测区域背景提示
- 后续若做航海版,建议把这一组作为最高优先级 group
## 11. 锚地
## 含义
- 锚地、锚泊区、锚泊相关符号
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `anchorage_area` |
| source-layer | `anchorage_outline` |
| source-layer | `anchorage_point` |
| render layer | `anchorage-areas` |
| render layer | `anchorage-outline` |
| render layer | `anchorage-symbols` |
## 12. 引航 / 航海服务
## 含义
- 引航站
- 其他后续可加入的航海服务点
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `pilot_station_point` |
| render layer | `pilot-station-points` |
## 13. 陆海背景与海岸线
## 含义
- 海陆底图
- 岸线、浅滩、河口、水域背景
- 是所有其他 group 的底板
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `baseline_area` |
| source-layer | `baseline_line` |
| source-layer | `baseline_outline` |
| source-layer | `land_area` |
| source-layer | `hole_area` |
| render layer | `sea-area-fill` |
| render layer | `tidal-flat` |
| render layer | `river-water` |
| render layer | `unsurveyed-area` |
| render layer | `shoal-danger-area` |
| render layer | `coast-structures-area` |
| render layer | `coast-structures-line` |
| render layer | `clip-outline` |
| render layer | `land-area` |
| render layer | `land-hole` |
## 说明
- 这组不是“专题对象”,更像基础底板
- 但在 style 组织上必须单列,因为很多危险层是叠在这组之上的
## 14. 地名与定位参考
## 含义
- 海上地名
- 陆上地名
- 用于读图与定位
## 当前对应层
| 类型 | 当前层 |
| --- | --- |
| source-layer | `place_label_sea` |
| source-layer | `place_label_land` |
| render layer | `place-labels-sea-en` |
| render layer | `place-labels-sea-ja` |
| render layer | `place-labels-land-en` |
| render layer | `place-labels-land-ja` |
## 15. 当前最值得后续继续细拆的 group
按后续 style / 产品价值排序,最值得再往下细拆的是这几组:
1. 海底危险物
- 需要拆清“航行危险物 / 抛锚注意危险物 / 鱼礁 / 潜堤 / 浅滩 / 未测区”
2. 海上标识
- 需要拆清“灯塔 / 港口灯 / 灯标 / 灯浮标 / 一般浮标 / AIS”
3. 陆地设施
- 需要拆清“港口设施 / 陆标设施 / 一般地标”
4. 海底质
- 需要拆清“底质文字 / 海底辅助线 / 海底电缆或其他海底线”
## 16. 推荐的后续落地方向
如果下一步要继续推进 delivery 版本组织,建议顺序是:
1. 先保持同一套 PBF
2. 先把 style 内部按本文件的 group 重排
3. 再决定哪些 group 要继续拆成单独 profile
建议优先可见的 profile 方向:
1. `navigation-core`
- 强化:海底危险物、海上标识、桥梁 / 跨空线、锚地、引航
2. `fishing-detail`
- 强化:等深线、鱼礁、海底质、穴、海底结构

View File

@@ -1,6 +1,6 @@
# 项目步骤记录
最后更新:`2026-04-02 12:03`
最后更新:`2026-04-08 19:32`
仓库:`/root/sourceserver/pbf`
远端:`ssh://git@nas:2222/tei/pbf.git`
@@ -104,10 +104,260 @@
- 已完成 `20nm final` 全量重生并切到线上
- 当前整套 `20nm final` 都是当前 builder 生成的新版本,不再是只修单瓦片
## 2026-04-03 canonical_object_type 去日文推进
### 1. 本轮代码侧已完成
- 在 [`navsea_tile_builder.py`](/root/sourceserver/pbf/navsea_tile_builder.py) 中把:
- `canonical_object_type` 的内部原值
- 和最终 release 输出值
分开处理
- 保留内部旧值给:
- DB render rule
- field value rule
- 现有 builder 语义推断
- 最终输出到 delivery / final PBF 的 `canonical_object_type` 改为稳定 ASCII 值
- 已同步改:
- [`src/pbf/style.navsea-delivery-karatsu-10nm.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-karatsu-10nm.json)
- [`src/pbf/style.navsea-delivery-karatsu-20nm-final.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-karatsu-20nm-final.json)
- [`src/pbf/style.navsea-delivery-kyushu.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-kyushu.json)
- 当前 style 中原先直接依赖的日文 `canonical_object_type` 过滤值,已切到对应 ASCII 值。
### 2. 10nm 临时副本结果
- 临时副本目录:
- `/tmp/pbf-delivery-karatsu-10nm-canonical-20260403`
- 当前结果:
- `canonical_object_type` 非 ASCII 复扫结果已经降到:
- `non_ascii_distinct = 0`
- 说明:
- 唐津 10 海里这条可信 backend baseline 上,`canonical_object_type` 去日文已经跑通到 0 残留。
### 3. 10nm 渲染审计结果
- 新报告:
- [`report/render_audit_10nm_canonical_type_2026-04-03.md`](/root/sourceserver/pbf/report/render_audit_10nm_canonical_type_2026-04-03.md)
- [`report/render_audit_10nm_canonical_type_2026-04-03.json`](/root/sourceserver/pbf/report/render_audit_10nm_canonical_type_2026-04-03.json)
- 结果统计与 2026-03-31 trusted rerun 一致:
- `exact_match = 121855`
- `mismatch = 12912`
- `missing_in_engineering = 5`
- 结论:
- 本轮 `canonical_object_type` 去日文没有引入新的 10nm backend render 回退。
### 4. 20nm 对象保真审计结果
- 新报告:
- [`report/object_preservation_20nm_canonical_type_2026-04-03/object_preservation_final_20nm.md`](/root/sourceserver/pbf/report/object_preservation_20nm_canonical_type_2026-04-03/object_preservation_final_20nm.md)
- [`report/object_preservation_20nm_canonical_type_2026-04-03/object_preservation_final_20nm.json`](/root/sourceserver/pbf/report/object_preservation_20nm_canonical_type_2026-04-03/object_preservation_final_20nm.json)
- 结果:
- `tiles compared = 154`
- `raw objects = 4165`
- `preserved = 4165`
- `missing / wrong_relayer / identifier_lost / identifier_mismatch = 0`
- 结论:
- 20nm final 在对象保真口径上没有因为本轮 `canonical_object_type` 清理出现对象级退化。
### 5. 当前未收完的部分
- 20nm 临时副本:
- `/tmp/pbf-delivery-karatsu-20nm-final-canonical-20260403`
- 已经完成过一轮旧映射 replay也完成了对象保真审计
- 但在映射表补第二批 / 第三批尾项后20nm 全量 ASCII replay 还没有完整重新跑完并做最终非 ASCII 复扫
- 因此当前真实状态是:
- `10nm backend trusted baseline` 已完成去日文和审计
- `20nm object preservation` 已完成审计
- `20nm canonical_object_type 全量去日文复扫` 仍差最后一步 replay + rescan
## 当前未完成项
- 继续按同一张 compare 页回扫其他依赖 `class_code / display_code` 的细分类图标
- 继续做热点截图复核,确认没有新的样式回退
- 完成 `/tmp/pbf-delivery-karatsu-20nm-final-canonical-20260403` 的全量 replay
- 对 20nm canonical 副本补做最终 `non_ascii canonical_object_type` 复扫
## 2026-04-04 全量 PBF 按最新逻辑重建启动
### 1. 本轮启动前确认
- 已按仓库续接要求复读:
- `STEP_RECORD.md`
- `PROJECT_HANDOFF_2026-03-31.md`
- `NavSea_Delivery_Preflight_Audit_Spec.md`
- `NavSea_Audit_Logic_And_Evolution_2026-04-01.md`
- 已确认当前远端仍是:
- `ssh://git@nas:2222/tei/pbf.git`
- 已确认当前 builder 里的“最新逻辑”包含:
- `navsea_tile_builder.py``RELEASE_CANONICAL_OBJECT_TYPE_MAP`
- delivery / final 输出会把 `canonical_object_type` 物化为最新 ASCII 发布值
### 2. 启动过程中发现的阻塞
- 直接用脚本默认参数启动会失败:
- `RuntimeError: navsea mapping registry is empty`
- 已核实数据库当前实际存在的规则 bundle 只有:
- `bundle_id = navsea-core`
- 因此本轮全量重建统一改为:
- `--bundle-id navsea-core`
### 3. 当前已启动的重建会话
- 为避免 `reference_tile_root` 和输出目录互相清空,已先把现有瓦片集合复制到:
- `/tmp/pbf-refsets/karatsu10-delivery`
- `/tmp/pbf-refsets/karatsu10-engineering`
- `/tmp/pbf-refsets/karatsu20-delivery`
- `/tmp/pbf-refsets/karatsu20-final`
- `/tmp/pbf-refsets/kyushu-delivery`
- `/tmp/pbf-refsets/kyushu-engineering`
- 当前正在运行的 builder 会话:
- `karatsu10 delivery`: session `72703`
- `karatsu10 engineering`: session `33691`
- `karatsu20 delivery`: session `9519`
- `karatsu20 final`: session `97913`
- `kyushu delivery`: session `79176`
- `kyushu engineering`: session `88222`
- 统一使用:
- `--fid-key thisMyWorld@2026`
- `--bundle-id navsea-core`
- delivery / final 口径统一附带:
- `--release-minimal`
- engineering 口径统一附带:
- `--engineering`
### 4. 本轮目标
- 把当前活跃的 builder 产物统一按最新逻辑重放:
- `/home/wwwroot/pbf-delivery-karatsu-10nm`
- `/home/wwwroot/pbf-engineering-karatsu-10nm`
- `/home/wwwroot/pbf-delivery-karatsu-20nm`
- `/home/wwwroot/pbf-delivery-karatsu-20nm-final`
- `/home/wwwroot/pbf-delivery-kyushu-reencoded`
- `/home/wwwroot/pbf-engineering-kyushu`
### 5. 下一步
1. 持续轮询 6 个 builder 会话,确认没有新的运行时异常
2. 待会话完成后复核各目录瓦片数是否回到原集合规模
3. 如需要,再补做 `canonical_object_type` 非 ASCII 复扫与对象保真 / render 审计
## 2026-04-05 九州 compare 图标问题收口
### 1. 新确认的问题类型
- 九州 profile 中出现的“红 X 变鱼礁 / 航标 icon 不对”,本轮确认不属于前一轮唐津那种:
- `旧 PBF 缺 class_code / display_code`
- 导致样式退回兜底图标
- 本轮在九州对应瓦片中核实到:
- `class_code`
- `display_code`
- `canonical_object_type`
- `chart_symbol_code`
这些关键字段本身是存在的
- 因此当前九州问题的真实根因是:
- `style.navsea-delivery-kyushu.json` 仍停留在较早的粗分类图标逻辑
- 没有同步到 `karatsu 20nm final` 已经收好的精细图标分支
### 2. 危险物图标根因
- 旧原始样式对:
- `409`
- `420`
- `425`
- `428`
- `434`
都是按 `分類番号` 分开画不同图标
- 但九州 delivery 样式之前:
- `navigation_hazard_point` 只吃 `chart_icon_image`
- `anchor_caution_hazard_point``obstruction / hazard_mark / fish_reef` 又被统一压进 `symbol-daytime-428`
- 所以视觉上会出现:
- 红 X / 障碍物 / 鱼礁混成一类 icon
### 3. 航标图标根因
- 九州 delivery 样式之前的 `navigation_marks` 图标分支太粗:
- `light_beacon` 固定画 `symbol-daytime-310`
- 普通 `nav-marks` 也没有按 `display_code` 细分浮标 / 灯标样式
- 所以像 `312` 这类灯浮标、以及更细的 `311xxx / 312xxx / 323xxx / 325xxx` 都会回成粗图标
### 4. 已完成修正
- 已把 [`src/pbf/style.navsea-delivery-kyushu.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-kyushu.json) 同步到 `karatsu 20nm final` 的图标口径:
- `hazard-points` 改为优先按 `class_code` 精确分图标
- `anchor-hazard-points-428` 改为优先按 `class_code` 精确分图标
- `nav-light-flare` 改为和 `display_code` / `minor_light` 口径一致
- `nav-marks-light-beacons` 改为按 `display_code` 细分 `311xxx`
- `nav-marks` 改为按 `display_code` 细分 `312/313/323/325/327/328` 等图标
- 并补上 `lattice_buoy / pillar_buoy / can_buoy` 的 canonical fallback
- 已继续补上 `facility_boundary_point` 的设施点图标逻辑:
- 不再固定画 `symbol-daytime-520`
- 改为按 `class_code` 区分:
- `505 / 510 -> symbol-daytime-505`
- `520 -> symbol-daytime-520`
- `530 -> symbol-daytime-530`
- `540 -> symbol-daytime-540`
- `550 -> symbol-daytime-550`
### 5. 已部署
- 已部署新的九州样式到:
- `/mnt/sda1/www/newpec/domain/style.navsea-delivery-kyushu.json`
- 已同步 bump compare 页版本并部署:
- HTML 版本:`compare-r22-20260405-0910`
- 九州 style 版本:`kyushu-style-r4-20260405-0910`
- HTML 路径:`/mnt/sda1/www/newpec/navsea-compare-karatsu-20nm.html`
### 6. 继续补到的小灯图标问题
- 新发现九州还有一类 `minor_light` 小灯点位图标不对
- 代表点位:
- `display_code = 30600000`
- delivery 中当前对象属性显示为:
- `canonical_object_type = minor_light`
- `chart_symbol_code = light_beacon`
- `chart_icon_image = symbol-daytime-310`
- 旧原始样式中:
- `30600000 -> symbol-daytime-303`
- 说明:
- 这类点位不只是 style 旧逻辑问题
- 也暴露出 builder 对部分 `minor_light` / `light_beacon` 的图标推断偏粗
- 当前先在九州 style 层做了旧版兼容兜底:
- `nav-marks-small-lights` 改为按 `display_code` 细分:
- `303xxx`
- `305xxx`
- `306xxx`
- `307xxx`
- `308xxx`
- `309xxx`
- 先恢复到原始样式的图标表现
### 7. builder 侧已继续收口
- 已在 [`navsea_tile_builder.py`](/root/sourceserver/pbf/navsea_tile_builder.py) 中继续修正 `navigation_marks` 的图标生成逻辑:
- 新增一组按旧 `display_code` 直接映射图标的 builder 内部表
- 当前先覆盖:
- `303xxx`
- `305xxx`
- `306xxx`
- `307xxx`
- `308xxx`
- `309xxx`
- 已把原始 `canonical_object_type = 灯 (Lt)` 的语义判断单独识别为:
- `chart_symbol_code = minor_light`
不再先落到 `light_beacon`
- 单瓦片验证结果已确认:
- `display_code = 30600000`
- 现在 builder 直接产出:
- `chart_symbol_code = minor_light`
- `chart_icon_image = symbol-daytime-303`
### 8. 当前已重跑的 builder 会话
- 已重新启动:
- `kyushu delivery`: session `80537`
- `kyushu engineering`: session `73505`
- 目的:
- 让九州现网 compare 不只依赖 style 兜底
- 同时把新的 builder 图标推断真正写回 delivery / engineering PBF
## 下一步
@@ -115,6 +365,11 @@
- 浮标不再被错误套圈
- `420` 不再回成眼睛图标
2. 继续清理其他依赖 `class_code / display_code` 的细分类图标问题
3. 继续完成 20nm canonical 副本的全量 replay并确认
- `canonical_object_type` 非 ASCII 残留归零或收敛到明确尾项
4. 如需上线这轮 canonical 去日文结果:
- 先决定是否同时重放 20nm final PBF
- 再决定是否同步部署 compare 用 style / 页面版本号
## 快速续接提示
@@ -123,3 +378,394 @@
1. 确认页面顶部版本仍然是 `compare-r18 / style-r14 / pbf-fullrefresh1`
2. 继续从博多港和中央航路这类热点回扫细分类图标
3. 优先检查仍依赖 `display_code / class_code` 的对象组
## 2026-04-05 九州 `at` 规则回扫
### 1. 对今天几类错位的统一判断
- 本轮重新对了原始 [`style.json`](/root/sourceserver/pbf/src/pbf/style.json) 后,已确认今天几类错位的共同根因是:
- 之前仍在用“归一语义字段优先”的方式补样式
- 但原始 `at` 图层实际是“旧字段直驱”
- 本轮重新钉实的规则:
- `p航行危険障害物` / `p投錨注意障害物`:按 `分類番号`
- `p錨泊地等`:按 `分類番号`
- `p施設・境界線等` 点要素:按 `分類番号`
- `p航路標識群` 主图标:按 `表示用番号`
- `p航路標識群フレア`:按 `形状分類番号`
- `p陸上構造物`:按 `分類番号` 直接拼 `symbol-daytime-*`
### 2. 本轮已修改的 delivery / style 逻辑
- 已修改 [`src/pbf/style.navsea-delivery-kyushu.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-kyushu.json)
- `anchorage-symbols` 改为优先按 `class_code` 直出 `719/720/721/724`
- `nav-light-flare` 改为优先按 `shape_class_code` 命中原始 flare 允许集合,仅在缺字段时退回旧兼容分支
- `nav-marks-harbor-lighthouses` / `nav-marks-breakwater-lighthouses` / `nav-marks-small-lights` / `nav-marks-light-beacons`
- 过滤条件改为优先按 `display_code` 前缀分层
- 仅在缺 `display_code` 时退回 `canonical_object_type`
- `nav-marks` 主层过滤同步改为排除这些 `display_code` 前缀,而不再只靠 `canonical_object_type`
- `facility-points` 保持按 `class_code` 分图标,并补上 `icon-ignore-placement`
- 补回 `pilot-station-points`
- `landmark-points` 改为优先按 `class_code` 直接拼 `symbol-daytime-*`
- `landmark-point-fallback` 只对缺 `class_code` 且不在已知旧图标类中的对象保留圆点兜底
### 3. 本轮已修改的 builder / 字段保留逻辑
- 已修改 [`navsea_tile_builder.py`](/root/sourceserver/pbf/navsea_tile_builder.py)
- `FINAL_RELEASE_PROPERTY_ALLOWLIST` 新增 `shape_class_code`
- `--release-minimal` 口径现在也会保留 `shape_class_code`
- 已修改 [`tasks/pbf/mappings/navsea_field_name_rules_v1.yaml`](/root/sourceserver/pbf/tasks/pbf/mappings/navsea_field_name_rules_v1.yaml)
- `形状分類番号 -> shape_class_code` 改为 `keep_in_delivery: true`
- 目的:
- 让 delivery PBF 重新具备支撑原始 `at` 规则的最小旧字段
- 不再让 `航路標識群フレア` 只能靠 `display_code + canonical_object_type`
### 4. 本轮已部署版本
- compare HTML 已 bump 并部署:
- `HTML: compare-r23-20260405-1533`
- 路径:`/mnt/sda1/www/newpec/navsea-compare-karatsu-20nm.html`
- 九州 style 已 bump 并部署:
- `Style: kyushu-style-r5-20260405-1533`
- 路径:`/mnt/sda1/www/newpec/domain/style.navsea-delivery-kyushu.json`
### 5. 本轮已重新启动九州重建
- 使用仓库虚拟环境 `.venv/bin/python`
- 直接用系统 `python3` 会报:
- `ModuleNotFoundError: No module named 'mapbox_vector_tile'`
- 已重新启动:
- `kyushu delivery`: session `6078`
- `kyushu engineering`: session `63691`
- 当前目标:
- 把新的 `shape_class_code``at` 修正真正写回九州 delivery / engineering PBF
### 6. 下一步
1. 等待九州两套 builder 完成
2. 抽查热点瓦片,确认 delivery 内已出现 `shape_class_code`
3. 在固定 compare 页继续复查今天提到的几类同源错位点
## 2026-04-05 九州 delivery 双用途图层整理
### 1. 本轮新增整理文档
- 已新增:
- [`NavSea_九州_Delivery_双用途图层分类_2026-04-05.md`](/root/sourceserver/pbf/NavSea_九州_Delivery_双用途图层分类_2026-04-05.md)
### 2. 本轮整理目标
- 不再只按旧样式/旧图层名字理解九州 delivery
- 改为按两个业务目标重新归类当前实际图层:
1. 航海用
2. 钓鱼用
### 3. 本轮整理结论
- 航海用的核心方向已明确为:
- 危险物优先
- 障碍物优先
- 导助航优先
- 净空/设施/锚地等通航约束优先
- 水深细节退后
- 钓鱼用的核心方向已明确为:
- 海底地形优先
- 水深细节优先
- 底质优先
- 鱼礁 / 穴 / 海底结构优先
- 安全层只保底不抢主视觉
### 4. 当前建议的实施方式
- 建议后续不要继续只维护一套 delivery style
- 而是同一套 PBF 下拆成两个 profile
1. `delivery-navigation`
2. `delivery-fishing`
- 先拆 style不急着拆数据
## 2026-04-07 九州 delivery 按对象属性分组整理
### 1. 本轮新增整理文档
- 已新增:
- [`NavSea_九州_Delivery_对象属性分组_2026-04-07.md`](/root/sourceserver/pbf/NavSea_九州_Delivery_对象属性分组_2026-04-07.md)
### 2. 本轮整理目标
- 不再按“航海用 / 钓鱼用”分
- 改为按对象属性相同的 group 整理当前九州 delivery
- 目标是给后续 style 重排、profile 拆分、专题层拆分打基础
### 3. 本轮已整理的主要 group
- 等深线
- 鱼礁
- 灯塔
- 港口灯
- 渔网 / 渔具
- 海上标识
- 陆地设施
- 桥梁 / 跨空线
- 海底质
- 海底危险物
- 锚地
- 引航 / 航海服务
- 陆海背景与海岸线
- 地名与定位参考
### 4. 本轮结论
- 当前最值得继续细拆的 group 已确认是:
1. 海底危险物
2. 海上标识
3. 陆地设施
4. 海底质
- 这四组最适合作为下一步 style 结构重排和多 profile 组织的主切口
## 2026-04-07 九州 delivery 前端图层分组消费配置
### 1. 本轮新增配置文件
- 已新增:
- [`src/pbf/layer-groups.navsea-delivery-kyushu.json`](/root/sourceserver/pbf/src/pbf/layer-groups.navsea-delivery-kyushu.json)
### 2. 本轮配置目的
- 给前端一个可直接消费的图层分组配置
- 不再让前端直接理解 style 内部的全部 render layer
- 让前端只面对:
- 基础底图
- 可切换业务 group
- 航海 / 钓鱼 / 自定义预设
### 3. 当前配置内容
- 已包含:
- `base_groups`
- `groups`
- `presets`
- 当前主要业务 group 包括:
- 鱼礁/海底危险物
- 海上标识
- 锚地/引航
- 港口与设施
- 桥梁/净空
- 等深线
- 海底地形
- 渔网/渔具
- 海底质
- 地名
### 4. 当前建议的前端消费方式
- 前端用 group 配置驱动 UI不直接暴露底层 render layer
- 实际切换时,通过:
- `map.setLayoutProperty(layerId, "visibility", "visible" | "none")`
- 建议用户入口只暴露:
- 航海模式
- 钓鱼模式
- 自定义
### 5. 本轮 i18n 结构调整
- 已把 [`src/pbf/layer-groups.navsea-delivery-kyushu.json`](/root/sourceserver/pbf/src/pbf/layer-groups.navsea-delivery-kyushu.json) 从直接写死中文 `label` 的结构,调整为:
- `label_key`
- `description_key`
- `i18n`
- 当前 key 命名已统一成:
- `pbf.group.xxx`
- `pbf.preset.xxx`
- 这样前端可以:
- 先直接读同文件内的 `i18n`
- 后续再平滑迁移到统一翻译系统
### 6. 本轮前端配置字段扩展
- 已继续给 [`src/pbf/layer-groups.navsea-delivery-kyushu.json`](/root/sourceserver/pbf/src/pbf/layer-groups.navsea-delivery-kyushu.json) 增加:
- `sort_order`
- `icon_key`
- `feature_flag`
- 当前作用:
- `sort_order`
- 控制前端菜单展示顺序
- `icon_key`
- 让前端图标系统不必写死在代码里
- `feature_flag`
- 方便做灰度、AB、权限或版本开关控制
## 2026-04-08 全国 delivery 候选构建与严格审计启动
### 1. 当前目标
- 用户要求:
- 生成全国范围 delivery 版本
- 严格审计
- 本轮采取的口径:
- 先生成全国候选目录
- 不直接覆盖现网旧目录
- 先跑对象保真 + render-hit 两层严格审计
- 审计过后再决定是否切正式目录
### 2. 当前确认的全国构建方式
- `navsea_tile_builder.py` 已确认支持:
- `--all-tiles`
- 当前全国原始源目录文件总量是:
- `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- 全量文件数:`79229`
- 当前旧全国目录状态:
- `/home/wwwroot/pbf``65148`
- `/home/wwwroot/pbf-engineering-full``65148`
- 说明:
- 旧全国 full 目录不是当前源集合的完整重放结果
- 因此本轮不能直接把旧目录当作可交付全国版
### 3. 本轮全国候选输出目录
- delivery 候选:
- `/home/wwwroot/pbf-delivery-full-20260408`
- engineering 候选:
- `/home/wwwroot/pbf-engineering-full-20260408`
### 4. 本轮已启动的全国构建会话
- 使用仓库虚拟环境:
- `.venv/bin/python`
- 已启动:
- 全国 deliverysession `8644`
- 全国 engineeringsession `60378`
- 使用参数:
- `--all-tiles`
- `--fid-key thisMyWorld@2026`
- `--bundle-id navsea-core`
- delivery 附带:`--release-minimal`
- engineering 附带:`--engineering`
### 5. 当前已观察到的风险信号
- builder 已确认拿到的全国 tile job 数:
- `79229`
- 但构建过程中已出现大量:
- `skipped z/x/y`
- 这说明:
- 全国源瓦片不等于全国 delivery 可写出瓦片
- 严格审计第一层就必须先检查文件集合与对象保真
- 很可能会暴露出:
- 数据库候选缺失
- 某些原始瓦片无可输出 rows
- 全量覆盖不完整
### 6. 本轮严格审计计划
- 第一层:
- 文件集合 / 覆盖率检查
- 第二层:
- 全国对象保真审计
- 第三层:
- 全国 render-hit 审计
- 当前说明:
- 现有审计脚本默认口径偏 10nm / 20nm / kyushu
- 本轮会在全国候选目录构建完成后,按全国路径重定向运行
- 审计输出文档仍需单独整理成中文放行报告
### 7. 下一步
1. 等待全国 delivery / engineering 候选构建完成
2. 先做全国文件集合对齐检查
3. 运行全国对象保真审计
4. 运行全国 render-hit 审计
5. 输出中文严格审计报告并给出是否可交付结论
## 2026-04-08 delivery style sprite 统一
### 1. 本轮调整
- 按用户要求,把 delivery style 的 sprite 地址统一改为:
- `http://192.168.200.184/newpec/sprite/sprite?v=111`
### 2. 当前已修改的仓库文件
- [`src/pbf/style.navsea-delivery-kyushu.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-kyushu.json)
- [`src/pbf/style.navsea-delivery-karatsu-20nm-final.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-karatsu-20nm-final.json)
- [`src/pbf/style.navsea-delivery-karatsu-10nm.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-karatsu-10nm.json)
### 3. 当前说明
- 仓库内源文件已完成统一
- 线上 `/mnt/sda1/www/newpec/domain/` 下的部署文件尚未在本轮同步
- 后续如需页面立即生效,还需要再做一次部署同步
## 2026-04-08 全国 delivery style 草稿
### 1. 本轮新增文件
- 已新增:
- [`src/pbf/style.navsea-delivery-full.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-full.json)
### 2. 本轮生成方式
- 以 [`src/pbf/style.navsea-delivery-kyushu.json`](/root/sourceserver/pbf/src/pbf/style.navsea-delivery-kyushu.json) 为底复制
- 仅调整:
- `name -> NavSea Delivery Full`
- `tiles -> http://192.168.200.184/pbf-delivery-full-20260408/{z}/{x}/{y}.pbf`
### 3. 当前说明
- 这是当前全国 delivery 候选 PBF 的配套 style 草稿
- 当前尚未单独部署到线上公开路径
- 当前也还没有配套的全国单屏 HTML / compare 页面
## 2026-04-08 全国 delivery style / HTML 部署
### 1. 本轮部署文件
- 已部署 style
- `/mnt/sda1/www/newpec/domain/style.navsea-delivery-full.json`
- 已部署 HTML
- `/mnt/sda1/www/newpec/navsea-final-delivery-full.html`
### 2. 当前可访问 URL
- style
- `http://192.168.200.184/newpec/domain/style.navsea-delivery-full.json`
- 单页查看:
- `http://192.168.200.184/newpec/navsea-final-delivery-full.html`
### 3. 当前说明
- 全国版 style 现已不只是仓库草稿,已同步到线上公开路径。
- 当前 HTML 为单屏查看入口,不是 compare 页面。
## 2026-04-08 磁盘风险全量快照提交
### 1. 触发原因
- 用户反馈当前电脑硬盘可能存在问题
- 为避免本地未提交代码与文档因磁盘异常丢失,本轮优先执行一次仓库内全量快照提交
### 2. 本轮执行前确认
- 已按仓库续接要求复读:
- `STEP_RECORD.md`
- `PROJECT_HANDOFF_2026-03-31.md`
- `NavSea_Delivery_Preflight_Audit_Spec.md`
- `NavSea_Audit_Logic_And_Evolution_2026-04-01.md`
- 已确认当前远端仍是:
- `ssh://git@nas:2222/tei/pbf.git`
- 已确认当前工作区包含大量:
- 已修改代码
- 新增 Domain 原型文件
- 新增审计报告
- 新增页面与 style 草稿
### 3. 本轮处理原则
- 本轮目标是“先保全当前仓库进展”
- 因用户明确要求提交所有代码,本轮采用全量暂存与提交
- 本轮提交不额外声称:
- 已完成新的全国审计
- 已完成新的交付放行结论
### 4. 当前说明
- 提交完成后,仓库历史中应保留一份可回溯的本地快照
- 若后续硬盘继续异常,优先再确认远端可推送与备份介质状态

View File

@@ -131,6 +131,56 @@ def load_local_field_name_rules() -> dict[str, FieldNameRule]:
return rules
def load_local_source_layer_rules() -> dict[str, dict[str, str]]:
mapping_path = Path(__file__).resolve().parent / "tasks" / "pbf" / "mappings" / "navsea_source_layer_rules_v1.yaml"
if not mapping_path.exists():
return {}
rules: dict[str, dict[str, str]] = {}
current_jp: str | None = None
current_std: str | None = None
for raw_line in mapping_path.read_text(encoding="utf-8").splitlines():
line = raw_line.strip()
if not line or line.startswith("#") or line in {"ruleset: navsea_source_layer_rules_v1", "rules:"}:
continue
if line.startswith("- source_layer_jp:"):
if current_jp and current_std:
rules[current_jp] = {
"source_layer_std": current_std,
"source_layer_rule_id": f"SLR_LOCAL:{current_jp}",
}
current_jp = line.split(":", 1)[1].strip()
current_std = None
continue
if line.startswith("source_layer_std:") and current_jp:
current_std = line.split(":", 1)[1].strip()
if current_jp and current_std:
rules[current_jp] = {
"source_layer_std": current_std,
"source_layer_rule_id": f"SLR_LOCAL:{current_jp}",
}
manual_aliases = {
"P投錨注意障害物透明": "anchor_caution_hazard_area",
"P投錨注意障害物": "anchor_caution_hazard_area",
"P航行危険障害物": "navigation_hazard_area",
"P錨泊地等": "anchorage_area",
"P橋りょう等構造物": "bridge_structure",
"L701": "depth_zone_700",
"L738": "depth_zone_739",
}
for source_layer_jp, source_layer_std in manual_aliases.items():
rules.setdefault(
source_layer_jp,
{
"source_layer_std": source_layer_std,
"source_layer_rule_id": f"SLR_LOCAL:{source_layer_jp}",
},
)
return rules
class NavSeaMappingRegistry:
def __init__(
self,
@@ -197,6 +247,7 @@ class NavSeaMappingRegistry:
}
for row in cur.fetchall()
}
source_layer_rules.update(load_local_source_layer_rules())
cur.execute(
"""

View File

@@ -31,6 +31,8 @@ from typing import Any
import mapbox_vector_tile
import pymysql
from navsea_tile_builder import NavSeaFidCodec
DEFAULT_ORIGINAL_STYLE_PATH = Path("/mnt/sda1/www/newpec/style.patched.local.json")
DEFAULT_ENGINEERING_STYLE_PATH = Path("/mnt/sda1/www/newpec/navsea-engineering.json")
@@ -52,6 +54,10 @@ ENGINEERING_TILE_ROOT = DEFAULT_ENGINEERING_TILE_ROOT
REPORT_MD_PATH = DEFAULT_REPORT_MD_PATH
REPORT_JSON_PATH = DEFAULT_REPORT_JSON_PATH
AUDIT_NAME = DEFAULT_AUDIT_NAME
SKIP_DB_PERSIST = False
COMPARISON_LABEL = "工程版"
FID_CODEC: NavSeaFidCodec | None = None
MATCH_ON_FID_ONLY = False
DERIVED_PROPERTY_PREFIXES = (
"canonical_",
@@ -120,6 +126,27 @@ EXPRESSION_OPS = {
"zoom",
}
DEPTH_NUMERIC_SOURCE_LAYERS = {
"L海底地形",
"L概略等深線",
"L等深線",
}
CLEARANCE_NUMERIC_SOURCE_LAYERS = {
"p高さ制限",
}
SAFETY_ICON_SOURCE_LAYERS = {
"p航路標識群",
"p航路標識",
"P航路標識",
"p灯台",
"p灯浮標",
"p灯立標",
"p灯標",
}
SUPPORT_FILL_SOURCE_LAYERS = {
"P穴",
}
@dataclass(frozen=True)
class DbConfig:
@@ -141,6 +168,7 @@ class AuditFeature:
geom_type: str
object_id: str
fid_legacy: str | None
native_feature_id: int | None
properties: dict[str, Any]
@@ -495,21 +523,59 @@ def geometry_hash(geometry: dict[str, Any]) -> str:
return hash_text(canonical_json(geometry))
def extract_legacy_fid(properties: dict[str, Any]) -> str | None:
def extract_legacy_fid(properties: dict[str, Any], native_feature_id: int | None = None) -> str | None:
legacy = properties.get("fid_legacy_raw")
if legacy not in (None, ""):
return str(legacy)
try:
return str(int(str(legacy)))
except ValueError:
return str(legacy)
fid = properties.get("fid")
if fid not in (None, ""):
return str(fid)
fid_text = str(fid).strip()
# Original tiles store legacy fid as decimal integers. Only treat
# an 8-char property fid as encrypted hex when it is not plain digits.
if fid_text.isdigit():
return str(int(fid_text))
if FID_CODEC is not None and len(fid_text) == 8:
try:
decoded = FID_CODEC.decrypt_number(int(fid_text, 16))
return str(decoded)
except ValueError:
pass
try:
return str(int(fid_text))
except ValueError:
return fid_text
if native_feature_id is not None:
if FID_CODEC is not None:
try:
decoded = FID_CODEC.decrypt_number(int(native_feature_id))
return str(decoded)
except ValueError:
pass
try:
feature_id_int = int(native_feature_id)
if feature_id_int > 2147483647:
feature_id_int -= 4294967296
return str(feature_id_int)
except ValueError:
return str(native_feature_id)
return None
def object_identity(layer_name: str, geometry: dict[str, Any], properties: dict[str, Any]) -> tuple[str, str | None]:
def object_identity(
layer_name: str,
geometry: dict[str, Any],
properties: dict[str, Any],
native_feature_id: int | None = None,
) -> tuple[str, str | None]:
geom_type = str(geometry.get("type", ""))
legacy_source_layer = text_or_none(properties.get("source_layer_jp")) or layer_name
legacy_fid = extract_legacy_fid(properties)
legacy_fid = extract_legacy_fid(properties, native_feature_id)
if legacy_fid:
if MATCH_ON_FID_ONLY:
return f"fid:{legacy_fid}|geom:{geom_type}", legacy_fid
return f"fid:{legacy_fid}|src:{legacy_source_layer}|geom:{geom_type}", legacy_fid
fallback_payload = {
"source_layer": legacy_source_layer,
@@ -521,6 +587,8 @@ def object_identity(layer_name: str, geometry: dict[str, Any], properties: dict[
def feature_instance_id(feature: AuditFeature) -> str:
if MATCH_ON_FID_ONLY:
return f"{feature.object_id}|z:{feature.tile_z}|x:{feature.tile_x}|y:{feature.tile_y}"
return (
f"{feature.object_id}|z:{feature.tile_z}|x:{feature.tile_x}|"
f"y:{feature.tile_y}|layer:{feature.layer_name}"
@@ -538,7 +606,9 @@ def decode_tile_instances(dataset: str, tile_root: Path, style: dict[str, Any],
for feature in payload.get("features", []):
geometry = feature.get("geometry") or {}
properties = dict(feature.get("properties") or {})
object_id, legacy_fid = object_identity(layer_name, geometry, properties)
native_feature_id = feature.get("id")
native_feature_id = int(native_feature_id) if isinstance(native_feature_id, int) else None
object_id, legacy_fid = object_identity(layer_name, geometry, properties, native_feature_id)
audit_feature = AuditFeature(
dataset=dataset,
tile_z=z,
@@ -548,6 +618,7 @@ def decode_tile_instances(dataset: str, tile_root: Path, style: dict[str, Any],
geom_type=str(geometry.get("type", "")),
object_id=object_id,
fid_legacy=legacy_fid,
native_feature_id=native_feature_id,
properties=properties,
)
instance_id = feature_instance_id(audit_feature)
@@ -565,16 +636,39 @@ def summarize_observations(observations: list[RenderObservation]) -> dict[str, l
return {key: sorted(values) for key, values in grouped.items()}
def summarize_observation_payloads(observations: list[RenderObservation]) -> dict[str, list[dict[str, Any]]]:
grouped: dict[str, list[dict[str, Any]]] = defaultdict(list)
for observation in observations:
grouped[observation.component_type].append(dict(observation.payload))
return {
key: sorted(values, key=canonical_json)
for key, values in grouped.items()
}
def normalize_component_map(component_map: dict[str, list[str]]) -> dict[str, tuple[str, ...]]:
return {key: tuple(values) for key, values in sorted(component_map.items())}
def normalize_payload_map(payload_map: dict[str, list[dict[str, Any]]]) -> dict[str, tuple[dict[str, Any], ...]]:
return {
key: tuple(sorted(values, key=canonical_json))
for key, values in sorted(payload_map.items())
}
def compare_instance(
original: dict[str, Any] | None,
engineering: dict[str, Any] | None,
) -> dict[str, Any]:
if original is None:
eng_feature = engineering["feature"]
engineering_components = normalize_component_map(
summarize_observations(engineering["observations"])
)
engineering_payloads = normalize_payload_map(
summarize_observation_payloads(engineering["observations"])
)
return {
"status": "extra_in_engineering",
"object_instance_id": feature_instance_id(eng_feature),
@@ -587,12 +681,18 @@ def compare_instance(
"source_layer": eng_feature.layer_name,
"canonical_object_type": text_or_none(eng_feature.properties.get("canonical_object_type")),
"original_components": {},
"engineering_components": normalize_component_map(
summarize_observations(engineering["observations"])
),
"engineering_components": engineering_components,
"original_payloads": {},
"engineering_payloads": engineering_payloads,
}
if engineering is None:
orig_feature = original["feature"]
original_components = normalize_component_map(
summarize_observations(original["observations"])
)
original_payloads = normalize_payload_map(
summarize_observation_payloads(original["observations"])
)
return {
"status": "missing_in_engineering",
"object_instance_id": feature_instance_id(orig_feature),
@@ -604,16 +704,18 @@ def compare_instance(
"tile_y": orig_feature.tile_y,
"source_layer": orig_feature.layer_name,
"canonical_object_type": None,
"original_components": normalize_component_map(
summarize_observations(original["observations"])
),
"original_components": original_components,
"engineering_components": {},
"original_payloads": original_payloads,
"engineering_payloads": {},
}
orig_feature = original["feature"]
eng_feature = engineering["feature"]
original_components = normalize_component_map(summarize_observations(original["observations"]))
engineering_components = normalize_component_map(summarize_observations(engineering["observations"]))
original_payloads = normalize_payload_map(summarize_observation_payloads(original["observations"]))
engineering_payloads = normalize_payload_map(summarize_observation_payloads(engineering["observations"]))
if original_components == engineering_components:
status = "exact_match"
@@ -637,6 +739,8 @@ def compare_instance(
"canonical_object_type": text_or_none(eng_feature.properties.get("canonical_object_type")),
"original_components": original_components,
"engineering_components": engineering_components,
"original_payloads": original_payloads,
"engineering_payloads": engineering_payloads,
}
@@ -650,6 +754,101 @@ def format_component_map(component_map: dict[str, tuple[str, ...]] | dict[str, l
return "; ".join(parts)
def has_component(component_map: dict[str, tuple[str, ...]] | dict[str, list[str]], component_type: str) -> bool:
values = component_map.get(component_type)
return bool(values)
def get_component_payloads(
payload_map: dict[str, tuple[dict[str, Any], ...]] | dict[str, list[dict[str, Any]]],
component_type: str,
) -> list[dict[str, Any]]:
values = payload_map.get(component_type) or ()
return [dict(value) for value in values]
def payload_has_nontransparent_fill(payloads: list[dict[str, Any]]) -> bool:
for payload in payloads:
color = text_or_none(payload.get("fill_color"))
opacity = payload.get("fill_opacity")
if opacity == 0:
continue
if color in (None, "rgba(0,0,0,0)", "rgba(0, 0, 0, 0)"):
continue
return True
return False
def payload_has_transparent_fill(payloads: list[dict[str, Any]]) -> bool:
for payload in payloads:
color = text_or_none(payload.get("fill_color"))
opacity = payload.get("fill_opacity")
if opacity == 0:
return True
if color in ("rgba(0,0,0,0)", "rgba(0, 0, 0, 0)"):
return True
return False
def text_payloads_with_numeric_value(payloads: list[dict[str, Any]]) -> list[dict[str, Any]]:
numeric_payloads: list[dict[str, Any]] = []
for payload in payloads:
text_value = text_or_none(payload.get("text_value"))
if text_value is None:
continue
if any(char.isdigit() for char in text_value):
numeric_payloads.append(payload)
return numeric_payloads
def classify_annotation_issue(item: dict[str, Any]) -> str | None:
original_components = item["original_components"]
engineering_components = item["engineering_components"]
original_has_text = has_component(original_components, "text")
engineering_has_text = has_component(engineering_components, "text")
original_has_icon = has_component(original_components, "icon")
engineering_has_icon = has_component(engineering_components, "icon")
if original_has_text and not engineering_has_text:
return "text_missing_in_engineering"
if not original_has_text and engineering_has_text:
return "extra_text_in_engineering"
if original_has_icon and not engineering_has_icon:
return "icon_missing_in_engineering"
if not original_has_icon and engineering_has_icon:
return "extra_icon_in_engineering"
return None
def classify_style_semantic_issue(item: dict[str, Any]) -> str | None:
source_layer = item["source_layer"] or "unknown"
original_payloads = item.get("original_payloads", {})
engineering_payloads = item.get("engineering_payloads", {})
original_fill_payloads = get_component_payloads(original_payloads, "fill")
engineering_fill_payloads = get_component_payloads(engineering_payloads, "fill")
original_text_payloads = get_component_payloads(original_payloads, "text")
engineering_text_payloads = get_component_payloads(engineering_payloads, "text")
original_icon_payloads = get_component_payloads(original_payloads, "icon")
engineering_icon_payloads = get_component_payloads(engineering_payloads, "icon")
if source_layer in SUPPORT_FILL_SOURCE_LAYERS:
if payload_has_transparent_fill(original_fill_payloads) and payload_has_nontransparent_fill(engineering_fill_payloads):
return "support_layer_strengthened_fill"
original_numeric_texts = text_payloads_with_numeric_value(original_text_payloads)
engineering_numeric_texts = text_payloads_with_numeric_value(engineering_text_payloads)
if source_layer in DEPTH_NUMERIC_SOURCE_LAYERS and original_numeric_texts and not engineering_numeric_texts:
return "depth_numeric_missing"
if source_layer in CLEARANCE_NUMERIC_SOURCE_LAYERS and original_numeric_texts and not engineering_numeric_texts:
return "clearance_numeric_missing"
if source_layer in SAFETY_ICON_SOURCE_LAYERS and original_icon_payloads and not engineering_icon_payloads:
return "safety_icon_missing"
return None
def write_reports(
*,
original_count: int,
@@ -658,6 +857,10 @@ def write_reports(
status_counter: Counter[str],
source_layer_counter: Counter[tuple[str, str]],
mismatch_examples: list[dict[str, Any]],
annotation_issue_counter: Counter[tuple[str, str]],
annotation_issue_examples: list[dict[str, Any]],
style_semantic_issue_counter: Counter[tuple[str, str]],
style_semantic_issue_examples: list[dict[str, Any]],
) -> None:
payload = {
"original_feature_instances": original_count,
@@ -668,21 +871,31 @@ def write_reports(
{"status": status, "source_layer": source_layer, "count": count}
for (status, source_layer), count in source_layer_counter.most_common(30)
],
"annotation_issue_counts": [
{"issue": issue, "source_layer": source_layer, "count": count}
for (issue, source_layer), count in annotation_issue_counter.most_common(30)
],
"style_semantic_issue_counts": [
{"issue": issue, "source_layer": source_layer, "count": count}
for (issue, source_layer), count in style_semantic_issue_counter.most_common(30)
],
"mismatch_examples": mismatch_examples,
"annotation_issue_examples": annotation_issue_examples,
"style_semantic_issue_examples": style_semantic_issue_examples,
}
REPORT_JSON_PATH.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
lines = [
"# NavSea 原始版 vs 工程版渲染审计报告",
f"# NavSea 原始版 vs {COMPARISON_LABEL}渲染审计报告",
"",
"## 范围",
"",
f"- 原始样式: `{ORIGINAL_STYLE_PATH}`",
f"- 工程样式: `{ENGINEERING_STYLE_PATH}`",
f"- {COMPARISON_LABEL}样式: `{ENGINEERING_STYLE_PATH}`",
f"- 原始瓦片根目录: `{ORIGINAL_TILE_ROOT}`",
f"- 工程瓦片根目录: `{ENGINEERING_TILE_ROOT}`",
f"- {COMPARISON_LABEL}瓦片根目录: `{ENGINEERING_TILE_ROOT}`",
f"- 原始 feature 实例数: `{original_count}`",
f"- 工程 feature 实例数: `{engineering_count}`",
f"- {COMPARISON_LABEL} feature 实例数: `{engineering_count}`",
f"- 审计结果数: `{result_count}`",
"",
"## 匹配口径",
@@ -708,6 +921,28 @@ def write_reports(
for (status, source_layer), count in source_layer_counter.most_common(20):
lines.append(f"- `{status}` | `{source_layer}` | `{count}`")
lines.extend([
"",
"## 标注专项问题",
"",
])
if not annotation_issue_counter:
lines.append("- 没有发现标注专项问题。")
else:
for (issue, source_layer), count in annotation_issue_counter.most_common(20):
lines.append(f"- `{issue}` | `{source_layer}` | `{count}`")
lines.extend([
"",
"## Style 语义专项问题",
"",
])
if not style_semantic_issue_counter:
lines.append("- 没有发现 style 语义专项问题。")
else:
for (issue, source_layer), count in style_semantic_issue_counter.most_common(20):
lines.append(f"- `{issue}` | `{source_layer}` | `{count}`")
lines.extend([
"",
"## 差异样例",
@@ -724,6 +959,38 @@ def write_reports(
lines.append(f" original: {format_component_map(item['original_components'])}")
lines.append(f" engineering: {format_component_map(item['engineering_components'])}")
lines.extend([
"",
"## 标注问题样例",
"",
])
if not annotation_issue_examples:
lines.append("- 没有标注问题样例。")
else:
for item in annotation_issue_examples:
lines.append(
f"- `{item['annotation_issue']}` | tile=`{item['tile']}` | source_layer=`{item['source_layer']}` | "
f"fid=`{item['fid_legacy']}` | object=`{item['canonical_object_type'] or 'n/a'}`"
)
lines.append(f" original: {format_component_map(item['original_components'])}")
lines.append(f" engineering: {format_component_map(item['engineering_components'])}")
lines.extend([
"",
"## Style 语义问题样例",
"",
])
if not style_semantic_issue_examples:
lines.append("- 没有 style 语义问题样例。")
else:
for item in style_semantic_issue_examples:
lines.append(
f"- `{item['style_semantic_issue']}` | tile=`{item['tile']}` | source_layer=`{item['source_layer']}` | "
f"fid=`{item['fid_legacy']}` | object=`{item['canonical_object_type'] or 'n/a'}`"
)
lines.append(f" original: {format_component_map(item['original_components'])}")
lines.append(f" engineering: {format_component_map(item['engineering_components'])}")
REPORT_MD_PATH.write_text("\n".join(lines) + "\n", encoding="utf-8")
@@ -865,12 +1132,16 @@ def persist_audit_run(
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Audit original vs engineering render outputs.")
parser.add_argument("--audit-name", default=DEFAULT_AUDIT_NAME)
parser.add_argument("--comparison-label", default="工程版")
parser.add_argument("--fid-key")
parser.add_argument("--match-on-fid-only", action="store_true")
parser.add_argument("--original-style", type=Path, default=DEFAULT_ORIGINAL_STYLE_PATH)
parser.add_argument("--engineering-style", type=Path, default=DEFAULT_ENGINEERING_STYLE_PATH)
parser.add_argument("--original-tile-root", type=Path, default=DEFAULT_ORIGINAL_TILE_ROOT)
parser.add_argument("--engineering-tile-root", type=Path, default=DEFAULT_ENGINEERING_TILE_ROOT)
parser.add_argument("--report-md", type=Path, default=DEFAULT_REPORT_MD_PATH)
parser.add_argument("--report-json", type=Path, default=DEFAULT_REPORT_JSON_PATH)
parser.add_argument("--skip-db-persist", action="store_true")
return parser.parse_args()
@@ -882,15 +1153,23 @@ def main() -> None:
global ENGINEERING_TILE_ROOT
global REPORT_MD_PATH
global REPORT_JSON_PATH
global SKIP_DB_PERSIST
global COMPARISON_LABEL
global FID_CODEC
global MATCH_ON_FID_ONLY
args = parse_args()
AUDIT_NAME = args.audit_name
COMPARISON_LABEL = args.comparison_label
FID_CODEC = NavSeaFidCodec(args.fid_key.encode("utf-8")) if args.fid_key else None
MATCH_ON_FID_ONLY = args.match_on_fid_only
ORIGINAL_STYLE_PATH = args.original_style
ENGINEERING_STYLE_PATH = args.engineering_style
ORIGINAL_TILE_ROOT = args.original_tile_root
ENGINEERING_TILE_ROOT = args.engineering_tile_root
REPORT_MD_PATH = args.report_md
REPORT_JSON_PATH = args.report_json
SKIP_DB_PERSIST = args.skip_db_persist
original_style = load_style(ORIGINAL_STYLE_PATH)
engineering_style = load_style(ENGINEERING_STYLE_PATH)
@@ -902,70 +1181,142 @@ def main() -> None:
status_counter: Counter[str] = Counter()
source_layer_counter: Counter[tuple[str, str]] = Counter()
mismatch_examples: list[dict[str, Any]] = []
annotation_issue_counter: Counter[tuple[str, str]] = Counter()
annotation_issue_examples: list[dict[str, Any]] = []
style_semantic_issue_counter: Counter[tuple[str, str]] = Counter()
style_semantic_issue_examples: list[dict[str, Any]] = []
with db_connect() as conn:
with conn.cursor() as cur:
ensure_audit_tables(cur)
cur.execute("DELETE FROM navsea_render_audit_result")
cur.execute("DELETE FROM navsea_render_audit_run")
conn.commit()
if SKIP_DB_PERSIST:
for engineering_tile in engineering_tiles:
rel = engineering_tile.relative_to(ENGINEERING_TILE_ROOT)
original_tile = ORIGINAL_TILE_ROOT / rel
if not original_tile.exists():
continue
rows: list[tuple[Any, ...]] = []
for engineering_tile in engineering_tiles:
rel = engineering_tile.relative_to(ENGINEERING_TILE_ROOT)
original_tile = ORIGINAL_TILE_ROOT / rel
if not original_tile.exists():
continue
original_instances = decode_tile_instances("original", ORIGINAL_TILE_ROOT, original_style, original_tile)
engineering_instances = decode_tile_instances(
"engineering", ENGINEERING_TILE_ROOT, engineering_style, engineering_tile
)
original_count += len(original_instances)
engineering_count += len(engineering_instances)
all_instance_ids = sorted(set(original_instances) | set(engineering_instances))
for instance_id in all_instance_ids:
item = compare_instance(original_instances.get(instance_id), engineering_instances.get(instance_id))
result_count += 1
status_counter[item["status"]] += 1
if item["status"] != "exact_match":
source_layer_counter[(item["status"], item["source_layer"] or "unknown")] += 1
if len(mismatch_examples) < MAX_EXAMPLES:
mismatch_examples.append(item)
rows.append(
(
AUDIT_NAME,
hash_text(item["object_instance_id"]),
item["object_instance_id"],
item["object_id"],
item["fid_legacy"],
item["tile_z"],
item["tile_x"],
item["tile_y"],
item["source_layer"],
item["canonical_object_type"],
item["status"],
json.dumps(item["original_components"], ensure_ascii=False),
json.dumps(item["engineering_components"], ensure_ascii=False),
)
)
if len(rows) >= DB_BATCH_SIZE:
insert_result_batch(cur, rows)
conn.commit()
rows.clear()
insert_result_batch(cur, rows)
persist_audit_run(
cur,
original_count=original_count,
engineering_count=engineering_count,
result_count=result_count,
status_counter=status_counter,
source_layer_counter=source_layer_counter,
original_instances = decode_tile_instances("original", ORIGINAL_TILE_ROOT, original_style, original_tile)
engineering_instances = decode_tile_instances(
"engineering", ENGINEERING_TILE_ROOT, engineering_style, engineering_tile
)
conn.commit()
original_count += len(original_instances)
engineering_count += len(engineering_instances)
all_instance_ids = sorted(set(original_instances) | set(engineering_instances))
for instance_id in all_instance_ids:
item = compare_instance(original_instances.get(instance_id), engineering_instances.get(instance_id))
result_count += 1
status_counter[item["status"]] += 1
if item["status"] != "exact_match":
source_layer_counter[(item["status"], item["source_layer"] or "unknown")] += 1
if len(mismatch_examples) < MAX_EXAMPLES:
mismatch_examples.append(item)
annotation_issue = classify_annotation_issue(item)
if annotation_issue:
source_layer = item["source_layer"] or "unknown"
annotation_issue_counter[(annotation_issue, source_layer)] += 1
if len(annotation_issue_examples) < MAX_EXAMPLES:
annotation_issue_examples.append(
{
**item,
"annotation_issue": annotation_issue,
}
)
style_semantic_issue = classify_style_semantic_issue(item)
if style_semantic_issue:
source_layer = item["source_layer"] or "unknown"
style_semantic_issue_counter[(style_semantic_issue, source_layer)] += 1
if len(style_semantic_issue_examples) < MAX_EXAMPLES:
style_semantic_issue_examples.append(
{
**item,
"style_semantic_issue": style_semantic_issue,
}
)
else:
with db_connect() as conn:
with conn.cursor() as cur:
ensure_audit_tables(cur)
cur.execute("TRUNCATE TABLE navsea_render_audit_result")
cur.execute("TRUNCATE TABLE navsea_render_audit_run")
conn.commit()
rows: list[tuple[Any, ...]] = []
for engineering_tile in engineering_tiles:
rel = engineering_tile.relative_to(ENGINEERING_TILE_ROOT)
original_tile = ORIGINAL_TILE_ROOT / rel
if not original_tile.exists():
continue
original_instances = decode_tile_instances("original", ORIGINAL_TILE_ROOT, original_style, original_tile)
engineering_instances = decode_tile_instances(
"engineering", ENGINEERING_TILE_ROOT, engineering_style, engineering_tile
)
original_count += len(original_instances)
engineering_count += len(engineering_instances)
all_instance_ids = sorted(set(original_instances) | set(engineering_instances))
for instance_id in all_instance_ids:
item = compare_instance(original_instances.get(instance_id), engineering_instances.get(instance_id))
result_count += 1
status_counter[item["status"]] += 1
if item["status"] != "exact_match":
source_layer_counter[(item["status"], item["source_layer"] or "unknown")] += 1
if len(mismatch_examples) < MAX_EXAMPLES:
mismatch_examples.append(item)
annotation_issue = classify_annotation_issue(item)
if annotation_issue:
source_layer = item["source_layer"] or "unknown"
annotation_issue_counter[(annotation_issue, source_layer)] += 1
if len(annotation_issue_examples) < MAX_EXAMPLES:
annotation_issue_examples.append(
{
**item,
"annotation_issue": annotation_issue,
}
)
style_semantic_issue = classify_style_semantic_issue(item)
if style_semantic_issue:
source_layer = item["source_layer"] or "unknown"
style_semantic_issue_counter[(style_semantic_issue, source_layer)] += 1
if len(style_semantic_issue_examples) < MAX_EXAMPLES:
style_semantic_issue_examples.append(
{
**item,
"style_semantic_issue": style_semantic_issue,
}
)
rows.append(
(
AUDIT_NAME,
hash_text(item["object_instance_id"]),
item["object_instance_id"],
item["object_id"],
item["fid_legacy"],
item["tile_z"],
item["tile_x"],
item["tile_y"],
item["source_layer"],
item["canonical_object_type"],
item["status"],
json.dumps(item["original_components"], ensure_ascii=False),
json.dumps(item["engineering_components"], ensure_ascii=False),
)
)
if len(rows) >= DB_BATCH_SIZE:
insert_result_batch(cur, rows)
conn.commit()
rows.clear()
insert_result_batch(cur, rows)
persist_audit_run(
cur,
original_count=original_count,
engineering_count=engineering_count,
result_count=result_count,
status_counter=status_counter,
source_layer_counter=source_layer_counter,
)
conn.commit()
write_reports(
original_count=original_count,
@@ -974,6 +1325,10 @@ def main() -> None:
status_counter=status_counter,
source_layer_counter=source_layer_counter,
mismatch_examples=mismatch_examples,
annotation_issue_counter=annotation_issue_counter,
annotation_issue_examples=annotation_issue_examples,
style_semantic_issue_counter=style_semantic_issue_counter,
style_semantic_issue_examples=style_semantic_issue_examples,
)
print(
json.dumps(

View File

@@ -52,6 +52,35 @@ LIGHT_COLOR_REMARK_MAP = {
"A": "amber",
}
NAVIGATION_MARK_DISPLAY_ICON_MAP = {
"30300000": "symbol-daytime-303",
"30300002": "symbol-daytime-303",
"30300004": "symbol-daytime-303",
"30500001": "symbol-daytime-30500001",
"30500002": "symbol-daytime-30500002",
"30500003": "symbol-daytime-30500003",
"30500004": "symbol-daytime-30500003",
"30500010": "symbol-daytime-30500003",
"30600000": "symbol-daytime-303",
"30600001": "symbol-daytime-303",
"30600002": "symbol-daytime-303",
"30600003": "symbol-daytime-303",
"30600004": "symbol-daytime-303",
"30600006": "symbol-daytime-303",
"30700000": "symbol-daytime-30700003",
"30700001": "symbol-daytime-30700001",
"30700002": "symbol-daytime-30700002",
"30700003": "symbol-daytime-30700003",
"30700004": "symbol-daytime-30700003",
"30700007": "symbol-daytime-30700003",
"30800000": "symbol-daytime-308",
"30900000": "symbol-daytime-30500003",
"30900002": "symbol-daytime-30500002",
"30900004": "symbol-daytime-30500003",
"30900009": "symbol-daytime-30500003",
"30900011": "symbol-daytime-30500003",
}
FINAL_RELEASE_PROPERTY_ALLOWLIST = frozenset(
{
"canonical_object_type",
@@ -75,16 +104,119 @@ FINAL_RELEASE_PROPERTY_ALLOWLIST = frozenset(
"light_sector_mode",
"name_ja",
"place_name_en",
"shape_class_code",
}
)
RELEASE_CANONICAL_OBJECT_TYPE_MAP = {
"港湾灯台": "harbor_lighthouse",
"防波堤灯台": "breakwater_lighthouse",
"沿岸灯台 (15M over)": "coastal_lighthouse_over_15m",
"灯 (Lt)": "minor_light",
"灯標": "light_beacon",
"浮標 (やぐら型)": "lattice_buoy",
"円柱型浮標": "pillar_buoy",
"円筒型浮標": "can_buoy",
"船体露出沈船": "wreck_hull_exposed",
"危険全沈没船": "dangerous_fully_submerged_wreck",
"測定済みの沈船": "surveyed_wreck",
"魚礁": "fish_reef",
"錨泊地": "anchorage",
"海上地名": "sea_place_name",
"陆上地名": "land_place_name",
"底質": "seabed_material",
"等深线": "depth_contour",
"未分类对象": "unclassified_object",
"P基本線ククリ": "baseline_outline",
"P穴": "seabed_hole",
"p地名": "sea_place_name",
"p地名陸": "land_place_name",
"潜提": "submerged_reef",
"税関": "customs_office",
"河川域": "river_area",
"湖沼域": "lake_area",
"陸上水域": "inland_water_area",
"干潮帯": "tidal_flat",
"未測海域": "unsurveyed_area",
"浅所危険界": "shoal_danger_area",
"防波堤": "breakwater",
"浮施設・桟橋": "floating_facility_pier",
"撤去跡": "removed_structure_remains",
"煙突": "chimney",
"塔、やぐら、風車": "tower_yagura_windmill",
"海事関係署": "maritime_office",
"漁業協同組合": "fishing_cooperative",
"山頂": "mountain_top",
"その他 (記念碑等)": "other_landmark_monument",
"9000m以深": "over_9000m",
"等深線": "depth_contour_line",
"L海底地形": "bathymetry_line",
"P陸域": "land_area",
"道路": "road",
"P危険界ククリ": "hazard_boundary_outline",
"区画漁業": "demarcated_fishery",
"橋 (水門)": "bridge_water_gate",
"一本線で表わす桟橋": "pier_single_line",
"暗岩": "sunken_rock",
"概略等深線": "overview_depth_contour",
"険悪物": "dangerous_object",
"ビル": "building",
"漁港": "fishing_port",
"海底線 (電信電話)": "subsea_cable_telecom",
"一本線で表わす海上バース": "offshore_berth_single_line",
"P投錨注意障害物ククリ": "anchor_caution_hazard_outline",
"p投錨注意障害物": "anchor_caution_hazard_point",
"タンク": "tank",
"立標": "beacon",
"洗岩": "awash_rock",
"海底線 (電力)": "subsea_power_cable",
"灯浮標 (やぐら型)": "light_buoy_lattice",
"橋梁灯": "bridge_light",
"円錐型浮標": "conical_buoy",
"ポンツーン、パイル、杭": "pontoon_pile_posts",
"一本線で表わす潜提": "submerged_reef_single_line",
"一本線で表わす撤去跡": "removed_structure_single_line",
"海底輸送管 (水)": "subsea_water_pipeline",
"架空線、送電線": "overhead_transmission_line",
"海草": "seagrass",
"シーバース灯": "sea_berth_light",
"平水境界": "shoreline_boundary",
"港則法による境界": "port_regulation_boundary",
"p高さ制限": "clearance_limit_point",
"ドルフィン": "mooring_dolphin",
"P施設・境界線等ククリ": "facility_boundary_outline",
"全沈没船 (危険なし)": "fully_submerged_wreck_non_dangerous",
"マリーナ": "marina",
"ケーソン仮置き場": "caisson_storage_yard",
"サンドウェーブ": "sand_wave",
"一般港湾 (港則法区域、重要港湾)": "general_port_regulated_major",
"海底設置物、放水口、取水口": "seabed_installation_outfall_intake",
"定置漁業": "fixed_fishery",
"孤立危険物": "isolated_danger",
"P錨泊地等ククリ": "anchorage_outline",
"p錨泊地等": "anchorage_point",
"障害物": "obstruction",
"導灯": "leading_light",
"指向灯/照射灯": "directional_light",
"検疫錨地": "quarantine_anchorage",
"P754ククリ": "special_outline_754",
"養殖場": "aquaculture_area",
"海の駅": "sea_station",
"塔、やぐら、測台": "tower_yagura_survey_platform",
"P航行危険障害物ククリ": "navigation_hazard_outline",
"土砂捨て場": "spoil_ground",
"錨泊禁止区域": "anchorage_prohibited_area",
"漁網": "fishing_net",
}
def normalize_release_canonical_object_type(source_layer: str, canonical_object_type: str) -> str:
object_type = text_or_none(canonical_object_type) or ""
if source_layer == "p高さ制限":
return "clearance_limit_point"
if source_layer == "L高さ制限":
return "clearance_limit_line"
return canonical_object_type
return RELEASE_CANONICAL_OBJECT_TYPE_MAP.get(object_type, object_type)
@dataclass(frozen=True)
@@ -534,11 +666,12 @@ class NavSeaTileBuilder:
properties["source_layer_rule_id"] = source_layer_rule_id
properties["feature_id"] = row["feature_id"]
canonical_object_type = normalize_release_canonical_object_type(
raw_canonical_object_type = text_or_none(row["canonical_object_type"]) or ""
release_canonical_object_type = normalize_release_canonical_object_type(
source_layer_jp,
text_or_none(row["canonical_object_type"]) or "",
raw_canonical_object_type,
)
properties["canonical_object_type"] = canonical_object_type
properties["canonical_object_type"] = raw_canonical_object_type
properties["canonical_family"] = row["canonical_family"]
properties["semantic_key"] = row["semantic_key"]
properties["detection_key"] = row["detection_key"]
@@ -547,19 +680,20 @@ class NavSeaTileBuilder:
properties=properties,
source_layer=source_layer_jp,
output_layer=output_layer,
canonical_object_type=canonical_object_type,
canonical_object_type=raw_canonical_object_type,
canonical_family=text_or_none(row["canonical_family"]) or "",
geom_type=str(source_feature.get("geometry", {}).get("type", "")),
feature_id=int(row["feature_id"]),
tile=job,
)
properties.update(chart_properties)
properties["canonical_object_type"] = release_canonical_object_type
if self.engineering_mode:
properties["trace_status"] = trace_status
properties, field_name_unresolved = self.standardize_output_properties(
properties=properties,
source_layer=source_layer_jp,
canonical_object_type=canonical_object_type,
canonical_object_type=release_canonical_object_type,
canonical_family=text_or_none(row["canonical_family"]) or "",
geom_type=str(source_feature.get("geometry", {}).get("type", "")),
feature_id=int(row["feature_id"]),
@@ -786,6 +920,7 @@ class NavSeaTileBuilder:
chart_symbol_code=text_or_none(chart.get("chart_symbol_code")) or "",
light_color_code=text_or_none(chart.get("light_color_code")) or "",
hazard_class=text_or_none(chart.get("hazard_class")) or "",
display_code=text_or_none(properties.get("表示用番号")) or text_or_none(properties.get("display_code")) or "",
)
if chart_icon_image:
chart.setdefault("chart_icon_image", chart_icon_image)
@@ -895,7 +1030,7 @@ class NavSeaTileBuilder:
if not self.strip_legacy_japanese_delivery:
normalized[key] = value
if self.release_minimal and rule.field_name_std in {"class_code", "display_code"}:
if self.release_minimal and rule.field_name_std in {"class_code", "display_code", "shape_class_code"}:
normalized[rule.field_name_std] = value
if rule.keep_in_delivery:
normalized[rule.field_name_std] = value
@@ -1112,6 +1247,8 @@ class NavSeaTileBuilder:
return "navigation_light", "lighthouse"
if "導灯" in object_type:
return "navigation_light", "leading_light"
if object_type == "灯 (Lt)":
return "navigation_light", "minor_light"
if "" in object_type or "灯標" in object_type or "灯柱" in object_type:
return "navigation_light", "light_beacon"
if "浮標" in object_type:
@@ -1375,8 +1512,13 @@ class NavSeaTileBuilder:
chart_symbol_code: str,
light_color_code: str,
hazard_class: str,
display_code: str,
) -> str | None:
if source_layer == "p航路標識群":
if display_code:
mapped = NAVIGATION_MARK_DISPLAY_ICON_MAP.get(display_code)
if mapped:
return mapped
if chart_symbol_code == "leading_light":
return "symbol-daytime-300"
if chart_symbol_code == "lighthouse":

View File

@@ -0,0 +1,658 @@
{
"target_name": "delivery_20nm",
"raw_root": "/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles",
"target_root": "/home/wwwroot/pbf-delivery-karatsu-20nm",
"totals": {
"tiles_compared": 154,
"raw_objects": 4165,
"identifier_lost": 4165
},
"rule_stats": {
"P航路ククリ->route_outline": {
"raw_objects": 19,
"identifier_lost": 19
},
"p投錨注意障害物->anchor_caution_hazard_point": {
"raw_objects": 1426,
"identifier_lost": 1426
},
"p施設・境界線等->facility_boundary_point": {
"raw_objects": 171,
"identifier_lost": 171
},
"p航行危険障害物->navigation_hazard_point": {
"raw_objects": 664,
"identifier_lost": 664
},
"p航路標識群->navigation_marks": {
"raw_objects": 1885,
"identifier_lost": 1885
}
},
"top_class_issues": [
{
"class_key": "p投錨注意障害物:428",
"raw_objects": 702,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 702,
"identifier_mismatch": 0
},
{
"class_key": "p航行危険障害物:404",
"raw_objects": 413,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 413,
"identifier_mismatch": 0
},
{
"class_key": "p投錨注意障害物:420",
"raw_objects": 355,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 355,
"identifier_mismatch": 0
},
{
"class_key": "p投錨注意障害物:425",
"raw_objects": 255,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 255,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30600003",
"raw_objects": 255,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 255,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:31000000",
"raw_objects": 200,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 200,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30600002",
"raw_objects": 191,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 191,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30600001",
"raw_objects": 189,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 189,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30100004",
"raw_objects": 142,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 142,
"identifier_mismatch": 0
},
{
"class_key": "p航行危険障害物:403",
"raw_objects": 128,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 128,
"identifier_mismatch": 0
},
{
"class_key": "p施設・境界線等:520",
"raw_objects": 128,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 128,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:31336300",
"raw_objects": 108,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 108,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30200002",
"raw_objects": 75,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 75,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:31300003",
"raw_objects": 66,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 66,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30600000",
"raw_objects": 60,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 60,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30600004",
"raw_objects": 48,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 48,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:31235102",
"raw_objects": 46,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 46,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30200001",
"raw_objects": 44,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 44,
"identifier_mismatch": 0
},
{
"class_key": "p航行危険障害物:432",
"raw_objects": 40,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 40,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:31135102",
"raw_objects": 37,
"preserved": 0,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 37,
"identifier_mismatch": 0
}
],
"issue_examples": {
"identifier_lost": [
{
"tile": [
10,
880,
409
],
"fid": 12007768,
"name": "若宮灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30000004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "沿岸灯台 (15M over)",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
409
],
"fid": 12007824,
"name": "壱岐長島灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
409
],
"fid": 12007921,
"name": "手長島灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
409
],
"fid": 12007971,
"name": "壱岐大瀬灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
410
],
"fid": 12007773,
"name": "二神島灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30000007",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "沿岸灯台 (15M over)",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
410
],
"fid": 12007805,
"name": "的山大島曲り鼻灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
410
],
"fid": 12007823,
"name": "海豚鼻灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
410
],
"fid": 12007824,
"name": "壱岐長島灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
410
],
"fid": 12007836,
"name": "大碆鼻灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
410
],
"fid": 12007880,
"name": "壱岐郷ノ瀬灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
410
],
"fid": 12007885,
"name": "馬ノ頭鼻灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
410
],
"fid": 12007886,
"name": "崎瀬鼻灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
410
],
"fid": 12007938,
"name": "的山大島長崎鼻灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
411
],
"fid": 12007795,
"name": "青砂埼灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
411
],
"fid": 12007835,
"name": "生月長瀬鼻灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
411
],
"fid": 12007897,
"name": "平戸牛ケ首灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100005",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
411
],
"fid": 12007919,
"name": "津崎鼻灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
411
],
"fid": 12007939,
"name": "肥前横島灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
411
],
"fid": 12007940,
"name": "南風埼灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
},
{
"tile": [
10,
880,
411
],
"fid": 12007941,
"name": "下枯木島灯台",
"raw_layer": "p航路標識群",
"delivery_layer": "navigation_marks",
"raw_match_field": "表示用番号",
"raw_match_value": "30100004",
"candidates": [
{
"delivery_match_field": "display_code",
"delivery_match_value": null,
"canonical_object_type": "港湾灯台",
"chart_symbol_code": "lighthouse",
"chart_icon_image": "symbol-daytime-301"
}
]
}
]
}
}

View File

@@ -0,0 +1,99 @@
# Object Preservation Audit: delivery_20nm
- raw root: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- target root: `/home/wwwroot/pbf-delivery-karatsu-20nm`
## Totals
- tiles compared: `154`
- raw objects: `4165`
- preserved: `0`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `4165`
- identifier mismatch: `0`
## Per Rule
### `P航路ククリ->route_outline`
- raw objects: `19`
- preserved: `0`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `19`
- identifier mismatch: `0`
### `p投錨注意障害物->anchor_caution_hazard_point`
- raw objects: `1426`
- preserved: `0`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `1426`
- identifier mismatch: `0`
### `p施設・境界線等->facility_boundary_point`
- raw objects: `171`
- preserved: `0`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `171`
- identifier mismatch: `0`
### `p航行危険障害物->navigation_hazard_point`
- raw objects: `664`
- preserved: `0`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `664`
- identifier mismatch: `0`
### `p航路標識群->navigation_marks`
- raw objects: `1885`
- preserved: `0`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `1885`
- identifier mismatch: `0`
## Top Class Issues
- `p投錨注意障害物:428` raw=`702` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`702` identifier_mismatch=`0`
- `p航行危険障害物:404` raw=`413` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`413` identifier_mismatch=`0`
- `p投錨注意障害物:420` raw=`355` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`355` identifier_mismatch=`0`
- `p投錨注意障害物:425` raw=`255` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`255` identifier_mismatch=`0`
- `p航路標識群:30600003` raw=`255` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`255` identifier_mismatch=`0`
- `p航路標識群:31000000` raw=`200` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`200` identifier_mismatch=`0`
- `p航路標識群:30600002` raw=`191` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`191` identifier_mismatch=`0`
- `p航路標識群:30600001` raw=`189` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`189` identifier_mismatch=`0`
- `p航路標識群:30100004` raw=`142` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`142` identifier_mismatch=`0`
- `p航行危険障害物:403` raw=`128` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`128` identifier_mismatch=`0`
- `p施設・境界線等:520` raw=`128` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`128` identifier_mismatch=`0`
- `p航路標識群:31336300` raw=`108` preserved=`0` missing=`0` wrong_relayer=`0` identifier_lost=`108` identifier_mismatch=`0`
## Examples: `identifier_lost`
- {"candidates":[{"canonical_object_type":"沿岸灯台 (15M over)","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007768,"name":"若宮灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30000004","tile":[10,880,409]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007824,"name":"壱岐長島灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,409]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007921,"name":"手長島灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,409]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007971,"name":"壱岐大瀬灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,409]}
- {"candidates":[{"canonical_object_type":"沿岸灯台 (15M over)","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007773,"name":"二神島灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30000007","tile":[10,880,410]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007805,"name":"的山大島曲り鼻灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,410]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007823,"name":"海豚鼻灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,410]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007824,"name":"壱岐長島灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,410]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007836,"name":"大碆鼻灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,410]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007880,"name":"壱岐郷ノ瀬灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,410]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007885,"name":"馬ノ頭鼻灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,410]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007886,"name":"崎瀬鼻灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,410]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007938,"name":"的山大島長崎鼻灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,410]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007795,"name":"青砂埼灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,411]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007835,"name":"生月長瀬鼻灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,411]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007897,"name":"平戸牛ケ首灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100005","tile":[10,880,411]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007919,"name":"津崎鼻灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,411]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007939,"name":"肥前横島灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,411]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007940,"name":"南風埼灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,411]}
- {"candidates":[{"canonical_object_type":"港湾灯台","chart_icon_image":"symbol-daytime-301","chart_symbol_code":"lighthouse","delivery_match_field":"display_code","delivery_match_value":null}],"delivery_layer":"navigation_marks","fid":12007941,"name":"下枯木島灯台","raw_layer":"p航路標識群","raw_match_field":"表示用番号","raw_match_value":"30100004","tile":[10,880,411]}

View File

@@ -0,0 +1,215 @@
{
"target_name": "final_20nm",
"raw_root": "/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles",
"target_root": "/tmp/pbf-delivery-karatsu-20nm-final-canonical-20260403",
"totals": {
"tiles_compared": 154,
"raw_objects": 4165,
"preserved": 4165
},
"rule_stats": {
"P航路ククリ->route_outline": {
"raw_objects": 19,
"preserved": 19
},
"p投錨注意障害物->anchor_caution_hazard_point": {
"raw_objects": 1426,
"preserved": 1426
},
"p施設・境界線等->facility_boundary_point": {
"raw_objects": 171,
"preserved": 171
},
"p航行危険障害物->navigation_hazard_point": {
"raw_objects": 664,
"preserved": 664
},
"p航路標識群->navigation_marks": {
"raw_objects": 1885,
"preserved": 1885
}
},
"top_class_issues": [
{
"class_key": "p投錨注意障害物:428",
"raw_objects": 702,
"preserved": 702,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航行危険障害物:404",
"raw_objects": 413,
"preserved": 413,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p投錨注意障害物:420",
"raw_objects": 355,
"preserved": 355,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p投錨注意障害物:425",
"raw_objects": 255,
"preserved": 255,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30600003",
"raw_objects": 255,
"preserved": 255,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:31000000",
"raw_objects": 200,
"preserved": 200,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30600002",
"raw_objects": 191,
"preserved": 191,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30600001",
"raw_objects": 189,
"preserved": 189,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30100004",
"raw_objects": 142,
"preserved": 142,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航行危険障害物:403",
"raw_objects": 128,
"preserved": 128,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p施設・境界線等:520",
"raw_objects": 128,
"preserved": 128,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:31336300",
"raw_objects": 108,
"preserved": 108,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30200002",
"raw_objects": 75,
"preserved": 75,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:31300003",
"raw_objects": 66,
"preserved": 66,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30600000",
"raw_objects": 60,
"preserved": 60,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30600004",
"raw_objects": 48,
"preserved": 48,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:31235102",
"raw_objects": 46,
"preserved": 46,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:30200001",
"raw_objects": 44,
"preserved": 44,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航行危険障害物:432",
"raw_objects": 40,
"preserved": 40,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
},
{
"class_key": "p航路標識群:31135102",
"raw_objects": 37,
"preserved": 37,
"missing_object": 0,
"wrong_relayer": 0,
"identifier_lost": 0,
"identifier_mismatch": 0
}
],
"issue_examples": {}
}

View File

@@ -0,0 +1,76 @@
# Object Preservation Audit: final_20nm
- raw root: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- target root: `/tmp/pbf-delivery-karatsu-20nm-final-canonical-20260403`
## Totals
- tiles compared: `154`
- raw objects: `4165`
- preserved: `4165`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `0`
- identifier mismatch: `0`
## Per Rule
### `P航路ククリ->route_outline`
- raw objects: `19`
- preserved: `19`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `0`
- identifier mismatch: `0`
### `p投錨注意障害物->anchor_caution_hazard_point`
- raw objects: `1426`
- preserved: `1426`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `0`
- identifier mismatch: `0`
### `p施設・境界線等->facility_boundary_point`
- raw objects: `171`
- preserved: `171`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `0`
- identifier mismatch: `0`
### `p航行危険障害物->navigation_hazard_point`
- raw objects: `664`
- preserved: `664`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `0`
- identifier mismatch: `0`
### `p航路標識群->navigation_marks`
- raw objects: `1885`
- preserved: `1885`
- missing object: `0`
- wrong relayer: `0`
- identifier lost: `0`
- identifier mismatch: `0`
## Top Class Issues
- `p投錨注意障害物:428` raw=`702` preserved=`702` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p航行危険障害物:404` raw=`413` preserved=`413` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p投錨注意障害物:420` raw=`355` preserved=`355` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p投錨注意障害物:425` raw=`255` preserved=`255` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p航路標識群:30600003` raw=`255` preserved=`255` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p航路標識群:31000000` raw=`200` preserved=`200` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p航路標識群:30600002` raw=`191` preserved=`191` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p航路標識群:30600001` raw=`189` preserved=`189` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p航路標識群:30100004` raw=`142` preserved=`142` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p航行危険障害物:403` raw=`128` preserved=`128` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p施設・境界線等:520` raw=`128` preserved=`128` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`
- `p航路標識群:31336300` raw=`108` preserved=`108` missing=`0` wrong_relayer=`0` identifier_lost=`0` identifier_mismatch=`0`

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,169 @@
# NavSea 原始版 vs original-vs-delivery-10nm-canonical-ascii-2026-04-03渲染审计报告
## 范围
- 原始样式: `/mnt/sda1/www/newpec/style.patched.local.json`
- original-vs-delivery-10nm-canonical-ascii-2026-04-03样式: `/root/sourceserver/pbf/src/pbf/style.navsea-delivery-karatsu-10nm.json`
- 原始瓦片根目录: `/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles`
- original-vs-delivery-10nm-canonical-ascii-2026-04-03瓦片根目录: `/tmp/pbf-delivery-karatsu-10nm-canonical-20260403`
- 原始 feature 实例数: `134772`
- original-vs-delivery-10nm-canonical-ascii-2026-04-03 feature 实例数: `134772`
- 审计结果数: `134772`
## 匹配口径
- 主键优先使用 legacy `fid`
- 没有 `fid` 的对象,回退到 `geometry + 稳定旧属性`
- 审计粒度保留 tile 实例,因为渲染具有 zoom 敏感性。
## 结果统计
- `exact_match`: `121855`
- `mismatch`: `12912`
- `missing_in_engineering`: `5`
## 主要问题层
- `mismatch` | `P基本線ククリ` | `7873`
- `mismatch` | `P基本線` | `2876`
- `mismatch` | `L基本線` | `619`
- `mismatch` | `p航路標識群` | `574`
- `mismatch` | `p投錨注意障害物` | `374`
- `mismatch` | `p航行危険障害物` | `296`
- `mismatch` | `L海底線` | `100`
- `mismatch` | `P陸上構造物陸` | `98`
- `mismatch` | `P潜堤` | `36`
- `mismatch` | `p施設・境界線等` | `13`
- `mismatch` | `L高さ制限` | `12`
- `mismatch` | `L739` | `11`
- `mismatch` | `L741` | `11`
- `mismatch` | `P施設・境界線等` | `8`
- `missing_in_engineering` | `p陸上構造物` | `5`
- `mismatch` | `P漁具定置箇所` | `4`
- `mismatch` | `P投錨注意障害物` | `4`
- `mismatch` | `P航行危険障害物ククリ` | `1`
- `mismatch` | `P航行危険障害物` | `1`
- `mismatch` | `p錨泊地等` | `1`
## 标注专项问题
- `icon_missing_in_engineering` | `p陸上構造物` | `5`
## Style 语义专项问题
- 没有发现 style 语义专项问题。
## 差异样例
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007793` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(3) W 13s 55m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"鷹島灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl(3) W 13s 55m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"鷹島灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007820` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 6s 56m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"烏帽子島灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 6s 56m 12M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"烏帽子島灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007821` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 5s 21m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"波戸岬灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 5s 21m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"波戸岬灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007822` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 80m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"肥前向島灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 80m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"肥前向島灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007862` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 71m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"加唐島灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 71m 7M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"加唐島灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007878` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 36m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"女瀬鼻灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 36m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"女瀬鼻灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007879` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 11m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"肥前宮埼灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 4s 11m 3M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"肥前宮埼灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007892` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 13m 4M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"神集島港宮埼灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 13m 4M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"神集島港宮埼灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007914` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 10s 12m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"呼子平瀬灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 10s 12m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"呼子平瀬灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007915` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 31m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"肥前立石埼灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 31m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"肥前立石埼灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007916` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 30m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"肥前馬渡島灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 6s 30m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"肥前馬渡島灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007917` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 10s 26m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"値賀埼灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Iso W 10s 26m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"値賀埼灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12007918` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 15m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"貝瀬灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 15m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"貝瀬灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`p航路標識群` | fid=`12008013` | object=`harbor_lighthouse`
original: icon=['icon:{"icon_image":"arc-daytime-m3"}', 'icon:{"icon_image":"light-daytime-3"}', 'icon:{"icon_image":"symbol-daytime-301"}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"臼島灯台"}']
engineering: icon=['icon:{"icon_image":"light-daytime-3","icon_size":1.0}', 'icon:{"icon_image":"symbol-daytime-301","icon_size":1.08}']; text=['text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"Fl W 3s 11m 5M"}', 'text:{"text_anchor":"left","text_color":"rgba(0,0,0,1)","text_size":10,"text_value":"臼島灯台"}']
- `mismatch` | tile=`10/881/410` | source_layer=`P潜堤` | fid=`3119091` | object=`submerged_reef`
original: fill=['fill:{"fill_color":"rgba(129,195,226,1)"}', 'fill:{"fill_pattern":"fill-daytime-175"}']
engineering: fill=['fill:{"fill_color":"#7d7f95","fill_opacity":0.45,"fill_outline_color":"#55586f"}']
- `mismatch` | tile=`10/881/410` | source_layer=`P潜堤` | fid=`3127392` | object=`submerged_reef`
original: fill=['fill:{"fill_color":"rgba(129,195,226,1)"}', 'fill:{"fill_pattern":"fill-daytime-175"}']
engineering: fill=['fill:{"fill_color":"#7d7f95","fill_opacity":0.45,"fill_outline_color":"#55586f"}']
- `mismatch` | tile=`10/881/410` | source_layer=`P潜堤` | fid=`3133512` | object=`submerged_reef`
original: fill=['fill:{"fill_color":"rgba(129,195,226,1)"}', 'fill:{"fill_pattern":"fill-daytime-175"}']
engineering: fill=['fill:{"fill_color":"#7d7f95","fill_opacity":0.45,"fill_outline_color":"#55586f"}']
- `mismatch` | tile=`10/881/410` | source_layer=`P潜堤` | fid=`3137152` | object=`submerged_reef`
original: fill=['fill:{"fill_color":"rgba(129,195,226,1)"}', 'fill:{"fill_pattern":"fill-daytime-175"}']
engineering: fill=['fill:{"fill_color":"#7d7f95","fill_opacity":0.45,"fill_outline_color":"#55586f"}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053953` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053954` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053959` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053961` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053982` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053983` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053984` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053985` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053986` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053987` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053988` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
- `mismatch` | tile=`10/881/410` | source_layer=`P基本線ククリ` | fid=`4053989` | object=`baseline_outline`
original: line=['line:{"line_color":"rgba(136,152,139,1)","line_width":1}']
engineering: line=['line:{"line_color":"rgba(95,106,95,1)","line_width":2}']
## 标注问题样例
- `icon_missing_in_engineering` | tile=`11/1762/822` | source_layer=`p陸上構造物` | fid=`6011135` | object=`customs_office`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1762/823` | source_layer=`p陸上構造物` | fid=`6011150` | object=`customs_office`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`11/1763/821` | source_layer=`p陸上構造物` | fid=`6011136` | object=`customs_office`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3524/1645` | source_layer=`p陸上構造物` | fid=`6011135` | object=`customs_office`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
- `icon_missing_in_engineering` | tile=`12/3526/1643` | source_layer=`p陸上構造物` | fid=`6011136` | object=`customs_office`
original: icon=['icon:{"icon_image":"symbol-daytime-662"}']
engineering: none
## Style 语义问题样例
- 没有 style 语义问题样例。

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 553 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

View File

@@ -0,0 +1,325 @@
{
"compare_url": "http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html?profile=karatsu20&audit=1&center=130.40497,33.609376&zoom=14.5",
"compare_version": "compare-r16-20260401-1734",
"backend_audit_json": "/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm_2026-03-31.r7.json",
"visual_metrics": {
"image_width": 640,
"image_height": 400,
"total_pixels": 256000,
"changed_pixels": 251184,
"changed_ratio": 0.981187,
"mean_abs_rgb": [
30.7791,
22.7321,
27.3325
],
"rms_rgb": [
52.04,
39.851,
46.4777
],
"diff_bbox": [
0,
0,
640,
400
],
"full_crop_left": [
0,
150,
640,
550
],
"full_crop_right": [
640,
150,
1280,
550
],
"hotspots": [
{
"image_width": 269,
"image_height": 128,
"total_pixels": 34432,
"changed_pixels": 34432,
"changed_ratio": 1.0,
"mean_abs_rgb": [
31.4511,
17.2178,
18.6738
],
"rms_rgb": [
41.962,
19.7977,
19.9779
],
"diff_bbox": [
0,
0,
269,
128
],
"id": "hakata_route_outline_facility",
"label": "博多港航路边界与设施点区",
"notes": "校验紫色航路虚线是否存在,以及 class 505/520/530/550 设施点是否不再被画成通用图标。",
"backend_focus": [
"P航路ククリ",
"p施設・境界線等",
"route_outline",
"facility_boundary_point"
],
"pane_box_norm": [
0.2,
0.2,
0.62,
0.52
],
"pane_box_pixels": [
128,
80,
397,
208
],
"left_image": "report/strict_audit_20nm_buoy_323_check/hotspots/hakata_route_outline_facility_left.png",
"right_image": "report/strict_audit_20nm_buoy_323_check/hotspots/hakata_route_outline_facility_right.png",
"diff_image": "report/strict_audit_20nm_buoy_323_check/hotspots/hakata_route_outline_facility_diff.png"
},
{
"image_width": 243,
"image_height": 160,
"total_pixels": 38880,
"changed_pixels": 38878,
"changed_ratio": 0.999949,
"mean_abs_rgb": [
24.4828,
19.6489,
28.357
],
"rms_rgb": [
38.4158,
29.7144,
48.6724
],
"diff_bbox": [
0,
0,
243,
160
],
"id": "hakata_inner_harbor_facilities",
"label": "博多港内港设施区",
"notes": "校验港湾、渔港、海之驿、码头设施点是否保留细分类图标。",
"backend_focus": [
"p施設・境界線等",
"facility_boundary_point",
"class_code"
],
"pane_box_norm": [
0.48,
0.36,
0.86,
0.76
],
"pane_box_pixels": [
307,
144,
550,
304
],
"left_image": "report/strict_audit_20nm_buoy_323_check/hotspots/hakata_inner_harbor_facilities_left.png",
"right_image": "report/strict_audit_20nm_buoy_323_check/hotspots/hakata_inner_harbor_facilities_right.png",
"diff_image": "report/strict_audit_20nm_buoy_323_check/hotspots/hakata_inner_harbor_facilities_diff.png"
},
{
"image_width": 256,
"image_height": 104,
"total_pixels": 26624,
"changed_pixels": 26606,
"changed_ratio": 0.999324,
"mean_abs_rgb": [
43.8613,
21.4592,
21.164
],
"rms_rgb": [
50.4813,
23.4693,
22.5465
],
"diff_bbox": [
0,
0,
256,
104
],
"id": "hakata_central_passage_marks",
"label": "博多港中央航路灯标区",
"notes": "校验 31135x 灯标、红绿小灯和航路文字是否仍然可见。",
"backend_focus": [
"p航路標識群",
"navigation_marks",
"display_code"
],
"pane_box_norm": [
0.02,
0.1,
0.42,
0.36
],
"pane_box_pixels": [
13,
40,
269,
144
],
"left_image": "report/strict_audit_20nm_buoy_323_check/hotspots/hakata_central_passage_marks_left.png",
"right_image": "report/strict_audit_20nm_buoy_323_check/hotspots/hakata_central_passage_marks_right.png",
"diff_image": "report/strict_audit_20nm_buoy_323_check/hotspots/hakata_central_passage_marks_diff.png"
}
]
},
"backend_summary": {
"original_feature_instances": 258317,
"engineering_feature_instances": 258317,
"result_count": 516634,
"status_counts": {
"extra_in_engineering": 258317,
"missing_in_engineering": 258317
},
"top_annotation_issues": [
{
"issue": "extra_text_in_engineering",
"source_layer": "bathymetry_line",
"count": 24168
},
{
"issue": "text_missing_in_engineering",
"source_layer": "L海底地形",
"count": 24168
},
{
"issue": "extra_text_in_engineering",
"source_layer": "depth_contour",
"count": 11929
},
{
"issue": "text_missing_in_engineering",
"source_layer": "L等深線",
"count": 11929
},
{
"issue": "extra_text_in_engineering",
"source_layer": "seabed_text_point",
"count": 4499
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p底質",
"count": 4499
},
{
"issue": "extra_text_in_engineering",
"source_layer": "navigation_marks",
"count": 1516
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p航路標識群",
"count": 1516
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p地名",
"count": 1444
},
{
"issue": "extra_text_in_engineering",
"source_layer": "place_label_sea",
"count": 1444
}
],
"top_style_semantic_issues": [
{
"issue": "depth_numeric_missing",
"source_layer": "L海底地形",
"count": 24168
},
{
"issue": "depth_numeric_missing",
"source_layer": "L等深線",
"count": 11929
},
{
"issue": "safety_icon_missing",
"source_layer": "p航路標識群",
"count": 1885
},
{
"issue": "depth_numeric_missing",
"source_layer": "L概略等深線",
"count": 350
},
{
"issue": "clearance_numeric_missing",
"source_layer": "p高さ制限",
"count": 33
}
],
"top_source_layer_issues": [
{
"status": "extra_in_engineering",
"source_layer": "baseline_outline",
"count": 87709
},
{
"status": "missing_in_engineering",
"source_layer": "P基本線ククリ",
"count": 87709
},
{
"status": "extra_in_engineering",
"source_layer": "baseline_area",
"count": 50421
},
{
"status": "missing_in_engineering",
"source_layer": "P基本線",
"count": 50421
},
{
"status": "extra_in_engineering",
"source_layer": "depth_contour",
"count": 36460
},
{
"status": "missing_in_engineering",
"source_layer": "L等深線",
"count": 36460
},
{
"status": "extra_in_engineering",
"source_layer": "bathymetry_line",
"count": 35940
},
{
"status": "missing_in_engineering",
"source_layer": "L海底地形",
"count": 35940
},
{
"status": "extra_in_engineering",
"source_layer": "onshore_structure_line",
"count": 10544
},
{
"status": "missing_in_engineering",
"source_layer": "L陸上構造物陸",
"count": 10544
}
]
},
"notes": [
"Visual metrics are browser-rendered screenshot diff metrics from the fixed compare page.",
"Backend metrics are current render-audit summary metrics and may remain blind to sprite-load failures."
]
}

View File

@@ -0,0 +1,104 @@
# NavSea Strict Audit Summary
## Scope
- Compare page: `http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html?profile=karatsu20&audit=1&center=130.40497,33.609376&zoom=14.5`
- Compare version: `compare-r16-20260401-1734`
- Backend render audit: `/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm_2026-03-31.r7.json`
## Visual Audit
- changed pixels: `251184` / `256000`
- changed ratio: `0.981187`
- mean abs rgb: `[30.7791, 22.7321, 27.3325]`
- rms rgb: `[52.04, 39.851, 46.4777]`
- left crop: `[0, 150, 640, 550]`
- right crop: `[640, 150, 1280, 550]`
Artifacts:
- `report/strict_audit_20nm_buoy_323_check/compare_full.png`
- `report/strict_audit_20nm_buoy_323_check/compare_left.png`
- `report/strict_audit_20nm_buoy_323_check/compare_right.png`
- `report/strict_audit_20nm_buoy_323_check/compare_diff.png`
## Hotspot AOI Audit
### 博多港航路边界与设施点区
- id: `hakata_route_outline_facility`
- notes: `校验紫色航路虚线是否存在,以及 class 505/520/530/550 设施点是否不再被画成通用图标。`
- backend focus: `['P航路ククリ', 'p施設・境界線等', 'route_outline', 'facility_boundary_point']`
- changed pixels: `34432` / `34432`
- changed ratio: `1.0`
- mean abs rgb: `[31.4511, 17.2178, 18.6738]`
- pane box norm: `[0.2, 0.2, 0.62, 0.52]`
- pane box pixels: `[128, 80, 397, 208]`
- left image: `report/strict_audit_20nm_buoy_323_check/hotspots/hakata_route_outline_facility_left.png`
- right image: `report/strict_audit_20nm_buoy_323_check/hotspots/hakata_route_outline_facility_right.png`
- diff image: `report/strict_audit_20nm_buoy_323_check/hotspots/hakata_route_outline_facility_diff.png`
### 博多港内港设施区
- id: `hakata_inner_harbor_facilities`
- notes: `校验港湾、渔港、海之驿、码头设施点是否保留细分类图标。`
- backend focus: `['p施設・境界線等', 'facility_boundary_point', 'class_code']`
- changed pixels: `38878` / `38880`
- changed ratio: `0.999949`
- mean abs rgb: `[24.4828, 19.6489, 28.357]`
- pane box norm: `[0.48, 0.36, 0.86, 0.76]`
- pane box pixels: `[307, 144, 550, 304]`
- left image: `report/strict_audit_20nm_buoy_323_check/hotspots/hakata_inner_harbor_facilities_left.png`
- right image: `report/strict_audit_20nm_buoy_323_check/hotspots/hakata_inner_harbor_facilities_right.png`
- diff image: `report/strict_audit_20nm_buoy_323_check/hotspots/hakata_inner_harbor_facilities_diff.png`
### 博多港中央航路灯标区
- id: `hakata_central_passage_marks`
- notes: `校验 31135x 灯标、红绿小灯和航路文字是否仍然可见。`
- backend focus: `['p航路標識群', 'navigation_marks', 'display_code']`
- changed pixels: `26606` / `26624`
- changed ratio: `0.999324`
- mean abs rgb: `[43.8613, 21.4592, 21.164]`
- pane box norm: `[0.02, 0.1, 0.42, 0.36]`
- pane box pixels: `[13, 40, 269, 144]`
- left image: `report/strict_audit_20nm_buoy_323_check/hotspots/hakata_central_passage_marks_left.png`
- right image: `report/strict_audit_20nm_buoy_323_check/hotspots/hakata_central_passage_marks_right.png`
- diff image: `report/strict_audit_20nm_buoy_323_check/hotspots/hakata_central_passage_marks_diff.png`
## Backend Render Audit
- original feature instances: `258317`
- delivery feature instances: `258317`
- result count: `516634`
Status counts:
- `extra_in_engineering`: `258317`
- `missing_in_engineering`: `258317`
Top annotation issues:
- `extra_text_in_engineering` | `bathymetry_line` | `24168`
- `text_missing_in_engineering` | `L海底地形` | `24168`
- `extra_text_in_engineering` | `depth_contour` | `11929`
- `text_missing_in_engineering` | `L等深線` | `11929`
- `extra_text_in_engineering` | `seabed_text_point` | `4499`
- `text_missing_in_engineering` | `p底質` | `4499`
- `extra_text_in_engineering` | `navigation_marks` | `1516`
- `text_missing_in_engineering` | `p航路標識群` | `1516`
- `text_missing_in_engineering` | `p地名` | `1444`
- `extra_text_in_engineering` | `place_label_sea` | `1444`
Top style semantic issues:
- `depth_numeric_missing` | `L海底地形` | `24168`
- `depth_numeric_missing` | `L等深線` | `11929`
- `safety_icon_missing` | `p航路標識群` | `1885`
- `depth_numeric_missing` | `L概略等深線` | `350`
- `clearance_numeric_missing` | `p高さ制限` | `33`
## Interpretation
- This report intentionally puts browser-rendered visual output and backend render-audit summary in one place.
- If the browser screenshot improves but backend counts do not, the current backend audit is likely blind to a browser/runtime issue such as sprite resolution.

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,325 @@
{
"compare_url": "http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html?profile=karatsu20&audit=1&center=130.40497,33.609376&zoom=12.8",
"compare_version": "compare-r16-20260401-1734",
"backend_audit_json": "/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm_2026-03-31.r7.json",
"visual_metrics": {
"image_width": 640,
"image_height": 400,
"total_pixels": 256000,
"changed_pixels": 197665,
"changed_ratio": 0.772129,
"mean_abs_rgb": [
32.0086,
32.0453,
50.0954
],
"rms_rgb": [
55.5445,
52.4228,
72.7955
],
"diff_bbox": [
0,
0,
640,
400
],
"full_crop_left": [
0,
150,
640,
550
],
"full_crop_right": [
640,
150,
1280,
550
],
"hotspots": [
{
"image_width": 243,
"image_height": 160,
"total_pixels": 38880,
"changed_pixels": 37267,
"changed_ratio": 0.958513,
"mean_abs_rgb": [
40.574,
41.1383,
79.1228
],
"rms_rgb": [
53.4675,
52.2038,
91.1668
],
"diff_bbox": [
0,
0,
243,
160
],
"id": "hakata_inner_harbor_facilities",
"label": "博多港内港设施区",
"notes": "校验港湾、渔港、海之驿、码头设施点是否保留细分类图标。",
"backend_focus": [
"p施設・境界線等",
"facility_boundary_point",
"class_code"
],
"pane_box_norm": [
0.48,
0.36,
0.86,
0.76
],
"pane_box_pixels": [
307,
144,
550,
304
],
"left_image": "report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_inner_harbor_facilities_left.png",
"right_image": "report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_inner_harbor_facilities_right.png",
"diff_image": "report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_inner_harbor_facilities_diff.png"
},
{
"image_width": 256,
"image_height": 104,
"total_pixels": 26624,
"changed_pixels": 13996,
"changed_ratio": 0.525691,
"mean_abs_rgb": [
11.0422,
11.6527,
12.9096
],
"rms_rgb": [
25.3171,
28.1219,
30.9885
],
"diff_bbox": [
0,
0,
256,
104
],
"id": "hakata_central_passage_marks",
"label": "博多港中央航路灯标区",
"notes": "校验 31135x 灯标、红绿小灯和航路文字是否仍然可见。",
"backend_focus": [
"p航路標識群",
"navigation_marks",
"display_code"
],
"pane_box_norm": [
0.02,
0.1,
0.42,
0.36
],
"pane_box_pixels": [
13,
40,
269,
144
],
"left_image": "report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_central_passage_marks_left.png",
"right_image": "report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_central_passage_marks_right.png",
"diff_image": "report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_central_passage_marks_diff.png"
},
{
"image_width": 269,
"image_height": 128,
"total_pixels": 34432,
"changed_pixels": 17320,
"changed_ratio": 0.50302,
"mean_abs_rgb": [
21.0853,
21.8568,
35.9215
],
"rms_rgb": [
37.9176,
39.6058,
61.1491
],
"diff_bbox": [
0,
0,
269,
128
],
"id": "hakata_route_outline_facility",
"label": "博多港航路边界与设施点区",
"notes": "校验紫色航路虚线是否存在,以及 class 505/520/530/550 设施点是否不再被画成通用图标。",
"backend_focus": [
"P航路ククリ",
"p施設・境界線等",
"route_outline",
"facility_boundary_point"
],
"pane_box_norm": [
0.2,
0.2,
0.62,
0.52
],
"pane_box_pixels": [
128,
80,
397,
208
],
"left_image": "report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_route_outline_facility_left.png",
"right_image": "report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_route_outline_facility_right.png",
"diff_image": "report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_route_outline_facility_diff.png"
}
]
},
"backend_summary": {
"original_feature_instances": 258317,
"engineering_feature_instances": 258317,
"result_count": 516634,
"status_counts": {
"extra_in_engineering": 258317,
"missing_in_engineering": 258317
},
"top_annotation_issues": [
{
"issue": "extra_text_in_engineering",
"source_layer": "bathymetry_line",
"count": 24168
},
{
"issue": "text_missing_in_engineering",
"source_layer": "L海底地形",
"count": 24168
},
{
"issue": "extra_text_in_engineering",
"source_layer": "depth_contour",
"count": 11929
},
{
"issue": "text_missing_in_engineering",
"source_layer": "L等深線",
"count": 11929
},
{
"issue": "extra_text_in_engineering",
"source_layer": "seabed_text_point",
"count": 4499
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p底質",
"count": 4499
},
{
"issue": "extra_text_in_engineering",
"source_layer": "navigation_marks",
"count": 1516
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p航路標識群",
"count": 1516
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p地名",
"count": 1444
},
{
"issue": "extra_text_in_engineering",
"source_layer": "place_label_sea",
"count": 1444
}
],
"top_style_semantic_issues": [
{
"issue": "depth_numeric_missing",
"source_layer": "L海底地形",
"count": 24168
},
{
"issue": "depth_numeric_missing",
"source_layer": "L等深線",
"count": 11929
},
{
"issue": "safety_icon_missing",
"source_layer": "p航路標識群",
"count": 1885
},
{
"issue": "depth_numeric_missing",
"source_layer": "L概略等深線",
"count": 350
},
{
"issue": "clearance_numeric_missing",
"source_layer": "p高さ制限",
"count": 33
}
],
"top_source_layer_issues": [
{
"status": "extra_in_engineering",
"source_layer": "baseline_outline",
"count": 87709
},
{
"status": "missing_in_engineering",
"source_layer": "P基本線ククリ",
"count": 87709
},
{
"status": "extra_in_engineering",
"source_layer": "baseline_area",
"count": 50421
},
{
"status": "missing_in_engineering",
"source_layer": "P基本線",
"count": 50421
},
{
"status": "extra_in_engineering",
"source_layer": "depth_contour",
"count": 36460
},
{
"status": "missing_in_engineering",
"source_layer": "L等深線",
"count": 36460
},
{
"status": "extra_in_engineering",
"source_layer": "bathymetry_line",
"count": 35940
},
{
"status": "missing_in_engineering",
"source_layer": "L海底地形",
"count": 35940
},
{
"status": "extra_in_engineering",
"source_layer": "onshore_structure_line",
"count": 10544
},
{
"status": "missing_in_engineering",
"source_layer": "L陸上構造物陸",
"count": 10544
}
]
},
"notes": [
"Visual metrics are browser-rendered screenshot diff metrics from the fixed compare page.",
"Backend metrics are current render-audit summary metrics and may remain blind to sprite-load failures."
]
}

View File

@@ -0,0 +1,104 @@
# NavSea Strict Audit Summary
## Scope
- Compare page: `http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html?profile=karatsu20&audit=1&center=130.40497,33.609376&zoom=12.8`
- Compare version: `compare-r16-20260401-1734`
- Backend render audit: `/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm_2026-03-31.r7.json`
## Visual Audit
- changed pixels: `197665` / `256000`
- changed ratio: `0.772129`
- mean abs rgb: `[32.0086, 32.0453, 50.0954]`
- rms rgb: `[55.5445, 52.4228, 72.7955]`
- left crop: `[0, 150, 640, 550]`
- right crop: `[640, 150, 1280, 550]`
Artifacts:
- `report/strict_audit_20nm_buoy_323_check_z128/compare_full.png`
- `report/strict_audit_20nm_buoy_323_check_z128/compare_left.png`
- `report/strict_audit_20nm_buoy_323_check_z128/compare_right.png`
- `report/strict_audit_20nm_buoy_323_check_z128/compare_diff.png`
## Hotspot AOI Audit
### 博多港内港设施区
- id: `hakata_inner_harbor_facilities`
- notes: `校验港湾、渔港、海之驿、码头设施点是否保留细分类图标。`
- backend focus: `['p施設・境界線等', 'facility_boundary_point', 'class_code']`
- changed pixels: `37267` / `38880`
- changed ratio: `0.958513`
- mean abs rgb: `[40.574, 41.1383, 79.1228]`
- pane box norm: `[0.48, 0.36, 0.86, 0.76]`
- pane box pixels: `[307, 144, 550, 304]`
- left image: `report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_inner_harbor_facilities_left.png`
- right image: `report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_inner_harbor_facilities_right.png`
- diff image: `report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_inner_harbor_facilities_diff.png`
### 博多港中央航路灯标区
- id: `hakata_central_passage_marks`
- notes: `校验 31135x 灯标、红绿小灯和航路文字是否仍然可见。`
- backend focus: `['p航路標識群', 'navigation_marks', 'display_code']`
- changed pixels: `13996` / `26624`
- changed ratio: `0.525691`
- mean abs rgb: `[11.0422, 11.6527, 12.9096]`
- pane box norm: `[0.02, 0.1, 0.42, 0.36]`
- pane box pixels: `[13, 40, 269, 144]`
- left image: `report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_central_passage_marks_left.png`
- right image: `report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_central_passage_marks_right.png`
- diff image: `report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_central_passage_marks_diff.png`
### 博多港航路边界与设施点区
- id: `hakata_route_outline_facility`
- notes: `校验紫色航路虚线是否存在,以及 class 505/520/530/550 设施点是否不再被画成通用图标。`
- backend focus: `['P航路ククリ', 'p施設・境界線等', 'route_outline', 'facility_boundary_point']`
- changed pixels: `17320` / `34432`
- changed ratio: `0.50302`
- mean abs rgb: `[21.0853, 21.8568, 35.9215]`
- pane box norm: `[0.2, 0.2, 0.62, 0.52]`
- pane box pixels: `[128, 80, 397, 208]`
- left image: `report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_route_outline_facility_left.png`
- right image: `report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_route_outline_facility_right.png`
- diff image: `report/strict_audit_20nm_buoy_323_check_z128/hotspots/hakata_route_outline_facility_diff.png`
## Backend Render Audit
- original feature instances: `258317`
- delivery feature instances: `258317`
- result count: `516634`
Status counts:
- `extra_in_engineering`: `258317`
- `missing_in_engineering`: `258317`
Top annotation issues:
- `extra_text_in_engineering` | `bathymetry_line` | `24168`
- `text_missing_in_engineering` | `L海底地形` | `24168`
- `extra_text_in_engineering` | `depth_contour` | `11929`
- `text_missing_in_engineering` | `L等深線` | `11929`
- `extra_text_in_engineering` | `seabed_text_point` | `4499`
- `text_missing_in_engineering` | `p底質` | `4499`
- `extra_text_in_engineering` | `navigation_marks` | `1516`
- `text_missing_in_engineering` | `p航路標識群` | `1516`
- `text_missing_in_engineering` | `p地名` | `1444`
- `extra_text_in_engineering` | `place_label_sea` | `1444`
Top style semantic issues:
- `depth_numeric_missing` | `L海底地形` | `24168`
- `depth_numeric_missing` | `L等深線` | `11929`
- `safety_icon_missing` | `p航路標識群` | `1885`
- `depth_numeric_missing` | `L概略等深線` | `350`
- `clearance_numeric_missing` | `p高さ制限` | `33`
## Interpretation
- This report intentionally puts browser-rendered visual output and backend render-audit summary in one place.
- If the browser screenshot improves but backend counts do not, the current backend audit is likely blind to a browser/runtime issue such as sprite resolution.

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,325 @@
{
"compare_url": "http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html?profile=karatsu20&audit=1&center=130.3838,33.6000&zoom=14.5",
"compare_version": "compare-r16-20260401-1734",
"backend_audit_json": "/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm_2026-03-31.r7.json",
"visual_metrics": {
"image_width": 640,
"image_height": 400,
"total_pixels": 256000,
"changed_pixels": 176671,
"changed_ratio": 0.690121,
"mean_abs_rgb": [
25.0472,
26.5545,
52.8248
],
"rms_rgb": [
46.9905,
45.1309,
74.3183
],
"diff_bbox": [
0,
0,
640,
400
],
"full_crop_left": [
0,
150,
640,
550
],
"full_crop_right": [
640,
150,
1280,
550
],
"hotspots": [
{
"image_width": 256,
"image_height": 104,
"total_pixels": 26624,
"changed_pixels": 16200,
"changed_ratio": 0.608474,
"mean_abs_rgb": [
14.2061,
15.8463,
28.4755
],
"rms_rgb": [
27.1713,
29.8138,
50.1278
],
"diff_bbox": [
0,
0,
256,
104
],
"id": "hakata_central_passage_marks",
"label": "博多港中央航路灯标区",
"notes": "校验 31135x 灯标、红绿小灯和航路文字是否仍然可见。",
"backend_focus": [
"p航路標識群",
"navigation_marks",
"display_code"
],
"pane_box_norm": [
0.02,
0.1,
0.42,
0.36
],
"pane_box_pixels": [
13,
40,
269,
144
],
"left_image": "report/strict_audit_20nm_clearance_check/hotspots/hakata_central_passage_marks_left.png",
"right_image": "report/strict_audit_20nm_clearance_check/hotspots/hakata_central_passage_marks_right.png",
"diff_image": "report/strict_audit_20nm_clearance_check/hotspots/hakata_central_passage_marks_diff.png"
},
{
"image_width": 243,
"image_height": 160,
"total_pixels": 38880,
"changed_pixels": 22576,
"changed_ratio": 0.580658,
"mean_abs_rgb": [
19.8046,
22.5103,
51.1398
],
"rms_rgb": [
30.5385,
34.7866,
73.2864
],
"diff_bbox": [
0,
0,
243,
160
],
"id": "hakata_inner_harbor_facilities",
"label": "博多港内港设施区",
"notes": "校验港湾、渔港、海之驿、码头设施点是否保留细分类图标。",
"backend_focus": [
"p施設・境界線等",
"facility_boundary_point",
"class_code"
],
"pane_box_norm": [
0.48,
0.36,
0.86,
0.76
],
"pane_box_pixels": [
307,
144,
550,
304
],
"left_image": "report/strict_audit_20nm_clearance_check/hotspots/hakata_inner_harbor_facilities_left.png",
"right_image": "report/strict_audit_20nm_clearance_check/hotspots/hakata_inner_harbor_facilities_right.png",
"diff_image": "report/strict_audit_20nm_clearance_check/hotspots/hakata_inner_harbor_facilities_diff.png"
},
{
"image_width": 269,
"image_height": 128,
"total_pixels": 34432,
"changed_pixels": 9073,
"changed_ratio": 0.263505,
"mean_abs_rgb": [
8.4599,
10.4334,
20.0573
],
"rms_rgb": [
20.5973,
24.881,
45.1404
],
"diff_bbox": [
0,
0,
269,
128
],
"id": "hakata_route_outline_facility",
"label": "博多港航路边界与设施点区",
"notes": "校验紫色航路虚线是否存在,以及 class 505/520/530/550 设施点是否不再被画成通用图标。",
"backend_focus": [
"P航路ククリ",
"p施設・境界線等",
"route_outline",
"facility_boundary_point"
],
"pane_box_norm": [
0.2,
0.2,
0.62,
0.52
],
"pane_box_pixels": [
128,
80,
397,
208
],
"left_image": "report/strict_audit_20nm_clearance_check/hotspots/hakata_route_outline_facility_left.png",
"right_image": "report/strict_audit_20nm_clearance_check/hotspots/hakata_route_outline_facility_right.png",
"diff_image": "report/strict_audit_20nm_clearance_check/hotspots/hakata_route_outline_facility_diff.png"
}
]
},
"backend_summary": {
"original_feature_instances": 258317,
"engineering_feature_instances": 258317,
"result_count": 516634,
"status_counts": {
"extra_in_engineering": 258317,
"missing_in_engineering": 258317
},
"top_annotation_issues": [
{
"issue": "extra_text_in_engineering",
"source_layer": "bathymetry_line",
"count": 24168
},
{
"issue": "text_missing_in_engineering",
"source_layer": "L海底地形",
"count": 24168
},
{
"issue": "extra_text_in_engineering",
"source_layer": "depth_contour",
"count": 11929
},
{
"issue": "text_missing_in_engineering",
"source_layer": "L等深線",
"count": 11929
},
{
"issue": "extra_text_in_engineering",
"source_layer": "seabed_text_point",
"count": 4499
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p底質",
"count": 4499
},
{
"issue": "extra_text_in_engineering",
"source_layer": "navigation_marks",
"count": 1516
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p航路標識群",
"count": 1516
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p地名",
"count": 1444
},
{
"issue": "extra_text_in_engineering",
"source_layer": "place_label_sea",
"count": 1444
}
],
"top_style_semantic_issues": [
{
"issue": "depth_numeric_missing",
"source_layer": "L海底地形",
"count": 24168
},
{
"issue": "depth_numeric_missing",
"source_layer": "L等深線",
"count": 11929
},
{
"issue": "safety_icon_missing",
"source_layer": "p航路標識群",
"count": 1885
},
{
"issue": "depth_numeric_missing",
"source_layer": "L概略等深線",
"count": 350
},
{
"issue": "clearance_numeric_missing",
"source_layer": "p高さ制限",
"count": 33
}
],
"top_source_layer_issues": [
{
"status": "extra_in_engineering",
"source_layer": "baseline_outline",
"count": 87709
},
{
"status": "missing_in_engineering",
"source_layer": "P基本線ククリ",
"count": 87709
},
{
"status": "extra_in_engineering",
"source_layer": "baseline_area",
"count": 50421
},
{
"status": "missing_in_engineering",
"source_layer": "P基本線",
"count": 50421
},
{
"status": "extra_in_engineering",
"source_layer": "depth_contour",
"count": 36460
},
{
"status": "missing_in_engineering",
"source_layer": "L等深線",
"count": 36460
},
{
"status": "extra_in_engineering",
"source_layer": "bathymetry_line",
"count": 35940
},
{
"status": "missing_in_engineering",
"source_layer": "L海底地形",
"count": 35940
},
{
"status": "extra_in_engineering",
"source_layer": "onshore_structure_line",
"count": 10544
},
{
"status": "missing_in_engineering",
"source_layer": "L陸上構造物陸",
"count": 10544
}
]
},
"notes": [
"Visual metrics are browser-rendered screenshot diff metrics from the fixed compare page.",
"Backend metrics are current render-audit summary metrics and may remain blind to sprite-load failures."
]
}

View File

@@ -0,0 +1,104 @@
# NavSea Strict Audit Summary
## Scope
- Compare page: `http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html?profile=karatsu20&audit=1&center=130.3838,33.6000&zoom=14.5`
- Compare version: `compare-r16-20260401-1734`
- Backend render audit: `/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm_2026-03-31.r7.json`
## Visual Audit
- changed pixels: `176671` / `256000`
- changed ratio: `0.690121`
- mean abs rgb: `[25.0472, 26.5545, 52.8248]`
- rms rgb: `[46.9905, 45.1309, 74.3183]`
- left crop: `[0, 150, 640, 550]`
- right crop: `[640, 150, 1280, 550]`
Artifacts:
- `report/strict_audit_20nm_clearance_check/compare_full.png`
- `report/strict_audit_20nm_clearance_check/compare_left.png`
- `report/strict_audit_20nm_clearance_check/compare_right.png`
- `report/strict_audit_20nm_clearance_check/compare_diff.png`
## Hotspot AOI Audit
### 博多港中央航路灯标区
- id: `hakata_central_passage_marks`
- notes: `校验 31135x 灯标、红绿小灯和航路文字是否仍然可见。`
- backend focus: `['p航路標識群', 'navigation_marks', 'display_code']`
- changed pixels: `16200` / `26624`
- changed ratio: `0.608474`
- mean abs rgb: `[14.2061, 15.8463, 28.4755]`
- pane box norm: `[0.02, 0.1, 0.42, 0.36]`
- pane box pixels: `[13, 40, 269, 144]`
- left image: `report/strict_audit_20nm_clearance_check/hotspots/hakata_central_passage_marks_left.png`
- right image: `report/strict_audit_20nm_clearance_check/hotspots/hakata_central_passage_marks_right.png`
- diff image: `report/strict_audit_20nm_clearance_check/hotspots/hakata_central_passage_marks_diff.png`
### 博多港内港设施区
- id: `hakata_inner_harbor_facilities`
- notes: `校验港湾、渔港、海之驿、码头设施点是否保留细分类图标。`
- backend focus: `['p施設・境界線等', 'facility_boundary_point', 'class_code']`
- changed pixels: `22576` / `38880`
- changed ratio: `0.580658`
- mean abs rgb: `[19.8046, 22.5103, 51.1398]`
- pane box norm: `[0.48, 0.36, 0.86, 0.76]`
- pane box pixels: `[307, 144, 550, 304]`
- left image: `report/strict_audit_20nm_clearance_check/hotspots/hakata_inner_harbor_facilities_left.png`
- right image: `report/strict_audit_20nm_clearance_check/hotspots/hakata_inner_harbor_facilities_right.png`
- diff image: `report/strict_audit_20nm_clearance_check/hotspots/hakata_inner_harbor_facilities_diff.png`
### 博多港航路边界与设施点区
- id: `hakata_route_outline_facility`
- notes: `校验紫色航路虚线是否存在,以及 class 505/520/530/550 设施点是否不再被画成通用图标。`
- backend focus: `['P航路ククリ', 'p施設・境界線等', 'route_outline', 'facility_boundary_point']`
- changed pixels: `9073` / `34432`
- changed ratio: `0.263505`
- mean abs rgb: `[8.4599, 10.4334, 20.0573]`
- pane box norm: `[0.2, 0.2, 0.62, 0.52]`
- pane box pixels: `[128, 80, 397, 208]`
- left image: `report/strict_audit_20nm_clearance_check/hotspots/hakata_route_outline_facility_left.png`
- right image: `report/strict_audit_20nm_clearance_check/hotspots/hakata_route_outline_facility_right.png`
- diff image: `report/strict_audit_20nm_clearance_check/hotspots/hakata_route_outline_facility_diff.png`
## Backend Render Audit
- original feature instances: `258317`
- delivery feature instances: `258317`
- result count: `516634`
Status counts:
- `extra_in_engineering`: `258317`
- `missing_in_engineering`: `258317`
Top annotation issues:
- `extra_text_in_engineering` | `bathymetry_line` | `24168`
- `text_missing_in_engineering` | `L海底地形` | `24168`
- `extra_text_in_engineering` | `depth_contour` | `11929`
- `text_missing_in_engineering` | `L等深線` | `11929`
- `extra_text_in_engineering` | `seabed_text_point` | `4499`
- `text_missing_in_engineering` | `p底質` | `4499`
- `extra_text_in_engineering` | `navigation_marks` | `1516`
- `text_missing_in_engineering` | `p航路標識群` | `1516`
- `text_missing_in_engineering` | `p地名` | `1444`
- `extra_text_in_engineering` | `place_label_sea` | `1444`
Top style semantic issues:
- `depth_numeric_missing` | `L海底地形` | `24168`
- `depth_numeric_missing` | `L等深線` | `11929`
- `safety_icon_missing` | `p航路標識群` | `1885`
- `depth_numeric_missing` | `L概略等深線` | `350`
- `clearance_numeric_missing` | `p高さ制限` | `33`
## Interpretation
- This report intentionally puts browser-rendered visual output and backend render-audit summary in one place.
- If the browser screenshot improves but backend counts do not, the current backend audit is likely blind to a browser/runtime issue such as sprite resolution.

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -0,0 +1,325 @@
{
"compare_url": "http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html?profile=karatsu20&audit=1&center=130.352,33.6385&zoom=13.2",
"compare_version": "compare-r16-20260401-1734",
"backend_audit_json": "/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm_2026-03-31.r7.json",
"visual_metrics": {
"image_width": 640,
"image_height": 400,
"total_pixels": 256000,
"changed_pixels": 109965,
"changed_ratio": 0.429551,
"mean_abs_rgb": [
16.1941,
15.6908,
19.9201
],
"rms_rgb": [
42.8799,
40.407,
44.4388
],
"diff_bbox": [
0,
0,
640,
400
],
"full_crop_left": [
0,
150,
640,
550
],
"full_crop_right": [
640,
150,
1280,
550
],
"hotspots": [
{
"image_width": 256,
"image_height": 104,
"total_pixels": 26624,
"changed_pixels": 15470,
"changed_ratio": 0.581055,
"mean_abs_rgb": [
12.2803,
11.4791,
21.5548
],
"rms_rgb": [
22.0725,
21.4186,
37.6166
],
"diff_bbox": [
0,
0,
256,
104
],
"id": "hakata_central_passage_marks",
"label": "博多港中央航路灯标区",
"notes": "校验 31135x 灯标、红绿小灯和航路文字是否仍然可见。",
"backend_focus": [
"p航路標識群",
"navigation_marks",
"display_code"
],
"pane_box_norm": [
0.02,
0.1,
0.42,
0.36
],
"pane_box_pixels": [
13,
40,
269,
144
],
"left_image": "report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_central_passage_marks_left.png",
"right_image": "report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_central_passage_marks_right.png",
"diff_image": "report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_central_passage_marks_diff.png"
},
{
"image_width": 269,
"image_height": 128,
"total_pixels": 34432,
"changed_pixels": 17210,
"changed_ratio": 0.499826,
"mean_abs_rgb": [
17.0247,
17.9334,
33.5461
],
"rms_rgb": [
30.4005,
33.2417,
56.9663
],
"diff_bbox": [
0,
0,
269,
128
],
"id": "hakata_route_outline_facility",
"label": "博多港航路边界与设施点区",
"notes": "校验紫色航路虚线是否存在,以及 class 505/520/530/550 设施点是否不再被画成通用图标。",
"backend_focus": [
"P航路ククリ",
"p施設・境界線等",
"route_outline",
"facility_boundary_point"
],
"pane_box_norm": [
0.2,
0.2,
0.62,
0.52
],
"pane_box_pixels": [
128,
80,
397,
208
],
"left_image": "report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_route_outline_facility_left.png",
"right_image": "report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_route_outline_facility_right.png",
"diff_image": "report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_route_outline_facility_diff.png"
},
{
"image_width": 243,
"image_height": 160,
"total_pixels": 38880,
"changed_pixels": 15174,
"changed_ratio": 0.390278,
"mean_abs_rgb": [
11.916,
12.6021,
18.7611
],
"rms_rgb": [
25.4782,
29.7997,
40.0854
],
"diff_bbox": [
0,
0,
243,
160
],
"id": "hakata_inner_harbor_facilities",
"label": "博多港内港设施区",
"notes": "校验港湾、渔港、海之驿、码头设施点是否保留细分类图标。",
"backend_focus": [
"p施設・境界線等",
"facility_boundary_point",
"class_code"
],
"pane_box_norm": [
0.48,
0.36,
0.86,
0.76
],
"pane_box_pixels": [
307,
144,
550,
304
],
"left_image": "report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_inner_harbor_facilities_left.png",
"right_image": "report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_inner_harbor_facilities_right.png",
"diff_image": "report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_inner_harbor_facilities_diff.png"
}
]
},
"backend_summary": {
"original_feature_instances": 258317,
"engineering_feature_instances": 258317,
"result_count": 516634,
"status_counts": {
"extra_in_engineering": 258317,
"missing_in_engineering": 258317
},
"top_annotation_issues": [
{
"issue": "extra_text_in_engineering",
"source_layer": "bathymetry_line",
"count": 24168
},
{
"issue": "text_missing_in_engineering",
"source_layer": "L海底地形",
"count": 24168
},
{
"issue": "extra_text_in_engineering",
"source_layer": "depth_contour",
"count": 11929
},
{
"issue": "text_missing_in_engineering",
"source_layer": "L等深線",
"count": 11929
},
{
"issue": "extra_text_in_engineering",
"source_layer": "seabed_text_point",
"count": 4499
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p底質",
"count": 4499
},
{
"issue": "extra_text_in_engineering",
"source_layer": "navigation_marks",
"count": 1516
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p航路標識群",
"count": 1516
},
{
"issue": "text_missing_in_engineering",
"source_layer": "p地名",
"count": 1444
},
{
"issue": "extra_text_in_engineering",
"source_layer": "place_label_sea",
"count": 1444
}
],
"top_style_semantic_issues": [
{
"issue": "depth_numeric_missing",
"source_layer": "L海底地形",
"count": 24168
},
{
"issue": "depth_numeric_missing",
"source_layer": "L等深線",
"count": 11929
},
{
"issue": "safety_icon_missing",
"source_layer": "p航路標識群",
"count": 1885
},
{
"issue": "depth_numeric_missing",
"source_layer": "L概略等深線",
"count": 350
},
{
"issue": "clearance_numeric_missing",
"source_layer": "p高さ制限",
"count": 33
}
],
"top_source_layer_issues": [
{
"status": "extra_in_engineering",
"source_layer": "baseline_outline",
"count": 87709
},
{
"status": "missing_in_engineering",
"source_layer": "P基本線ククリ",
"count": 87709
},
{
"status": "extra_in_engineering",
"source_layer": "baseline_area",
"count": 50421
},
{
"status": "missing_in_engineering",
"source_layer": "P基本線",
"count": 50421
},
{
"status": "extra_in_engineering",
"source_layer": "depth_contour",
"count": 36460
},
{
"status": "missing_in_engineering",
"source_layer": "L等深線",
"count": 36460
},
{
"status": "extra_in_engineering",
"source_layer": "bathymetry_line",
"count": 35940
},
{
"status": "missing_in_engineering",
"source_layer": "L海底地形",
"count": 35940
},
{
"status": "extra_in_engineering",
"source_layer": "onshore_structure_line",
"count": 10544
},
{
"status": "missing_in_engineering",
"source_layer": "L陸上構造物陸",
"count": 10544
}
]
},
"notes": [
"Visual metrics are browser-rendered screenshot diff metrics from the fixed compare page.",
"Backend metrics are current render-audit summary metrics and may remain blind to sprite-load failures."
]
}

View File

@@ -0,0 +1,104 @@
# NavSea Strict Audit Summary
## Scope
- Compare page: `http://192.168.200.184/newpec/navsea-compare-karatsu-20nm.html?profile=karatsu20&audit=1&center=130.352,33.6385&zoom=13.2`
- Compare version: `compare-r16-20260401-1734`
- Backend render audit: `/root/sourceserver/pbf/NavSea_Original_vs_Delivery_Render_Audit_Karatsu_20nm_2026-03-31.r7.json`
## Visual Audit
- changed pixels: `109965` / `256000`
- changed ratio: `0.429551`
- mean abs rgb: `[16.1941, 15.6908, 19.9201]`
- rms rgb: `[42.8799, 40.407, 44.4388]`
- left crop: `[0, 150, 640, 550]`
- right crop: `[640, 150, 1280, 550]`
Artifacts:
- `report/strict_audit_20nm_hakata_marks_zoom13/compare_full.png`
- `report/strict_audit_20nm_hakata_marks_zoom13/compare_left.png`
- `report/strict_audit_20nm_hakata_marks_zoom13/compare_right.png`
- `report/strict_audit_20nm_hakata_marks_zoom13/compare_diff.png`
## Hotspot AOI Audit
### 博多港中央航路灯标区
- id: `hakata_central_passage_marks`
- notes: `校验 31135x 灯标、红绿小灯和航路文字是否仍然可见。`
- backend focus: `['p航路標識群', 'navigation_marks', 'display_code']`
- changed pixels: `15470` / `26624`
- changed ratio: `0.581055`
- mean abs rgb: `[12.2803, 11.4791, 21.5548]`
- pane box norm: `[0.02, 0.1, 0.42, 0.36]`
- pane box pixels: `[13, 40, 269, 144]`
- left image: `report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_central_passage_marks_left.png`
- right image: `report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_central_passage_marks_right.png`
- diff image: `report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_central_passage_marks_diff.png`
### 博多港航路边界与设施点区
- id: `hakata_route_outline_facility`
- notes: `校验紫色航路虚线是否存在,以及 class 505/520/530/550 设施点是否不再被画成通用图标。`
- backend focus: `['P航路ククリ', 'p施設・境界線等', 'route_outline', 'facility_boundary_point']`
- changed pixels: `17210` / `34432`
- changed ratio: `0.499826`
- mean abs rgb: `[17.0247, 17.9334, 33.5461]`
- pane box norm: `[0.2, 0.2, 0.62, 0.52]`
- pane box pixels: `[128, 80, 397, 208]`
- left image: `report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_route_outline_facility_left.png`
- right image: `report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_route_outline_facility_right.png`
- diff image: `report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_route_outline_facility_diff.png`
### 博多港内港设施区
- id: `hakata_inner_harbor_facilities`
- notes: `校验港湾、渔港、海之驿、码头设施点是否保留细分类图标。`
- backend focus: `['p施設・境界線等', 'facility_boundary_point', 'class_code']`
- changed pixels: `15174` / `38880`
- changed ratio: `0.390278`
- mean abs rgb: `[11.916, 12.6021, 18.7611]`
- pane box norm: `[0.48, 0.36, 0.86, 0.76]`
- pane box pixels: `[307, 144, 550, 304]`
- left image: `report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_inner_harbor_facilities_left.png`
- right image: `report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_inner_harbor_facilities_right.png`
- diff image: `report/strict_audit_20nm_hakata_marks_zoom13/hotspots/hakata_inner_harbor_facilities_diff.png`
## Backend Render Audit
- original feature instances: `258317`
- delivery feature instances: `258317`
- result count: `516634`
Status counts:
- `extra_in_engineering`: `258317`
- `missing_in_engineering`: `258317`
Top annotation issues:
- `extra_text_in_engineering` | `bathymetry_line` | `24168`
- `text_missing_in_engineering` | `L海底地形` | `24168`
- `extra_text_in_engineering` | `depth_contour` | `11929`
- `text_missing_in_engineering` | `L等深線` | `11929`
- `extra_text_in_engineering` | `seabed_text_point` | `4499`
- `text_missing_in_engineering` | `p底質` | `4499`
- `extra_text_in_engineering` | `navigation_marks` | `1516`
- `text_missing_in_engineering` | `p航路標識群` | `1516`
- `text_missing_in_engineering` | `p地名` | `1444`
- `extra_text_in_engineering` | `place_label_sea` | `1444`
Top style semantic issues:
- `depth_numeric_missing` | `L海底地形` | `24168`
- `depth_numeric_missing` | `L等深線` | `11929`
- `safety_icon_missing` | `p航路標識群` | `1885`
- `depth_numeric_missing` | `L概略等深線` | `350`
- `clearance_numeric_missing` | `p高さ制限` | `33`
## Interpretation
- This report intentionally puts browser-rendered visual output and backend render-audit summary in one place.
- If the browser screenshot improves but backend counts do not, the current backend audit is likely blind to a browser/runtime issue such as sprite resolution.

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Some files were not shown because too many files have changed in this diff Show More