From 69b4f961a6e9e598701bec4fde0d2f4b8e7d427c Mon Sep 17 00:00:00 2001 From: OpenAI Codex Date: Thu, 6 Aug 2026 18:35:04 +0800 Subject: [PATCH] fix: preserve Kyushu semantic fill patterns --- STEP_RECORD.md | 476 +++++++++++++++++- navsea_audit_kyushu_semantic_icon_test.py | 22 +- navsea_build_kyushu_semantic_icon_test.py | 85 +++- .../object_geometry_icon_audit.md | 7 +- .../sprite_icon_closure.json | 15 +- .../sprite_icon_closure.md | 10 +- ...avsea-compare-kyushu-semantic-icon-v1.html | 4 +- ...vsea-delivery-kyushu-semantic-icon-v1.json | 4 +- 8 files changed, 600 insertions(+), 23 deletions(-) diff --git a/STEP_RECORD.md b/STEP_RECORD.md index 32b937c..7253500 100644 --- a/STEP_RECORD.md +++ b/STEP_RECORD.md @@ -1,6 +1,6 @@ # 项目步骤记录 -最后更新:`2026-05-03` +最后更新:`2026-06-16` 仓库:`/root/sourceserver/pbf` 远端:`ssh://git@nas:2222/tei/pbf.git` @@ -24,8 +24,323 @@ ## 最近 3 天摘要 +### 2026-08-06 九州语义图标测试版 r2 修复红框纹理漏画 + +- 用户在九州左右对比页红框指出:左侧原始 newpec 的 `P漁具定置箇所` 紫色斜线填充区域,在右侧语义图标测试版缺失。 +- 根因不是 PBF 对象丢失,而是测试版 sprite 生成时只保留了语义化图标/灯弧 key,误删了 `fill-pattern` / `line-pattern` 依赖的非图标纹理。 +- 已将测试页版本升为 `kyushu-semantic-icon-v1-20260806-r2`,右侧 style 改为引用: + - `/newpec/sprite-kyushu-semantic-icon-v1-20260806-r2/sprite` +- 已修复 `navsea_build_kyushu_semantic_icon_test.py`: + - 语义替换只改名图标/灯弧; + - `pattern_fill_*`、`fill-daytime-*`、`fill_*`、`special_pattern_*` 等非图标纹理从 semantic sprite 原样保留; + - 规范化两个不存在的动态纹理名: + - `anchor_caution_hazard_area class_code=420`:`fill-daytime-405` -> `fill-daytime-420` + - `navigation_hazard_area class_code=427`:`fill-daytime-405` -> `fill-daytime-427` +- 已同步更新对象审计脚本 `navsea_audit_kyushu_semantic_icon_test.py`,按同一规范化规则比较源/目标,避免把明确修复误判为对象属性错误。 +- 已更新并部署: + - `/mnt/sda1/www/newpec/navsea-compare-kyushu-semantic-icon-v1.html` + - `/mnt/sda1/www/newpec/domain/style.navsea-delivery-kyushu-semantic-icon-v1.json` + - `/mnt/sda1/www/newpec/sprite-kyushu-semantic-icon-v1-20260806-r2/` +- 已重写测试 PBF 中相关纹理字段: + - 第一轮:`123` 张瓦片、`408` 个 feature + - 第二轮:`11` 张瓦片、`16` 个 feature + - 当前 `/home/wwwroot/pbf-delivery-kyushu-semantic-icon-v1-20260806` 中 `fill-daytime-405` 原始字符串计数为 `0` +- 审计结果: + - 对象/几何/图标审计:`4707/4707` 瓦片,错误瓦片 `0`,结论 `PASS` + - sprite 图标与纹理闭合审计:扫描 `4707` 张瓦片,使用 key `62`,sprite key `98`,缺失 key `0`,旧 `symbol-daytime-* / arc-daytime-*` key `0`,结论 `PASS` +- 部署检查: + - HTML 返回 `kyushu-semantic-icon-v1-20260806-r2` + - delivery style metadata 返回 `kyushu-semantic-icon-v1-20260806-r2` + - r2 sprite 中 `pattern_fill_fishery_or_fish_reef_area`、`fill-daytime-420`、`fill-daytime-427`、`fill-daytime-754` 均存在 +- 备注:本机 headless Chrome 截图因 WebGL context 创建失败为空白,不能作为视觉确认依据;需在实际浏览器里刷新 r2 页面人工复核红框区域。 + +### 2026-08-06 当前 Full PBF 与 style 显示消费关系调查 + +- 调查对象:`/home/wwwroot/pbf-delivery-full-20260418-rebuild`,共 `65148` 张 PBF;对照当前 Full extent-fix / semantic-extent-fix style。 +- 当前 `release-minimal` PBF 的属性白名单共 `22` 个字段,四套 Full style 实际通过 `get/has` 读取其中 `20` 个。 +- 明确未被当前 Full style 直接读取的字段: + - `clearance_height_m`:z12 出现 `858` 次 + - `least_depth_m`:z12 出现 `127401` 次 +- 这两个数值仍可能被 `chart_label_text` 的已生成文字间接表现;当前结论是“未被 style 直接消费”,不是“业务上绝对无价值”。 +- z12 全量解码发现 PBF 有 `53` 个 source-layer,而 Full style 对 `navsea_delivery` 实际声明 `38` 个 source-layer;以下 `16` 个 source-layer 当前没有 style layer,不会被当前 Full style 绘制: + - 深度类:`depth_contour_overview`、`depth_zone_700`、`depth_zone_702`、`depth_zone_725`、`depth_zone_740`、`depth_zone_748`、`depth_zone_749` + - 航路/导标类:`route_area`、`route_outline`、`route_axis_line`、`route_boundary_point`、`leading_line_outline` + - 辅助边界类:`clip_outline_721`、`clip_outline_730`、`facility_boundary_area_transparent`、`hazard_boundary_line` +- 当前未删除上述字段或 source-layer;它们可能用于点击回查、未来 style、其他版本样式或业务数据保真。若要做瘦身,必须先完成对应对象保真和全版本 style 影响审计。 + +### 2026-08-06 Full style 灯弧 sprite 调查 + +- 当前 Full style 的 `nav-light-arc` 实际只引用 4 个 `arc-daytime-*`: + - `arc-daytime-m1`:绿色环 + - `arc-daytime-m2`:红色环 + - `arc-daytime-m3`:黄/白色环 + - `arc-daytime-04027289`:较大的开口黄/白扇弧 +- sprite 审计清单共有 `255` 个 `arc-daytime-*` 条目,其中 `251` 个标为 `unused_in_current_full`;当前不需要保留全部 arc sprite。 +- style 选择规则:`navigation_marks + chart_symbol_code=lighthouse + light_color_code` 才进入灯弧层;绿色/红色/其他颜色分别使用 `m1/m2/m3`,只有 `coastal_lighthouse_over_15m + light_sector_mode=sector` 使用开口扇弧 `04027289`。 +- 当前没有将 `arc-*` 图片名写入 PBF;PBF 只保存灯色和灯弧语义,图片由 style 动态选择。 +- 结论:可以清理 251 个当前 Full 未引用的 arc sprite;当前实际引用的 4 个不能仅因视觉相近而合并,尤其不能把开口扇弧与黄/白闭环视为等价。若要进一步减少灯弧显示,应单独做原始 style 对照和导航安全对象审计。 + +### 2026-08-06 Full style `symbol-daytime-*` sprite 调查 + +- 当前 Full extent-fix style 明确引用 `67` 个具体 `symbol-daytime-*`,并另有一条按 `class_code` 动态拼接 `symbol-daytime-` 的规则。 +- 当前全国 Full PBF 中实际编码的 `chart_icon_image` 有 `21` 个 `symbol-daytime-*` 值;其中包括航标、灯标、危险物、鱼礁、设施和部分浮标图标。 +- 现有 sprite 审计清单共 `171` 个 `symbol-daytime-*`:`18` 个标为 style_and_pbf、`3` 个标为 pbf_only_data_driven、`49` 个标为 style_only、`101` 个标为 unused_in_current_full。 +- 结论:`symbol-daytime-*` 仍是当前 Full 的主图标体系,不能整体删除。只有已确认 `unused_in_current_full` 且不被其他 style / 页面使用的条目,才适合清理;`style_only` 不能仅凭当前 PBF 扫描直接删除,因为 style 仍然引用或可由 class_code 动态生成。 + +### 2026-08-06 Full compare 当前 style / sprite 实际引用确认 + +- `src/pbf/navsea-compare-full-audit.html` 默认 `variant=semantic`,实际加载: + - style:`style.navsea-delivery-full-semantic-extentfix.json` + - PBF:`/pbf-delivery-full-20260418-rebuild/{z}/{x}/{y}.pbf` + - sprite:`/newpec/sprite-semantic/sprite`,对应 `sprite.json`、`sprite.png`、`@2x` 文件 +- compare 页使用 `variant=full` 时加载: + - style:`style.navsea-delivery-full-extentfix.json` + - sprite:`/newpec/sprite/sprite?v=111` +- `navsea-final-delivery-full.html` 仍引用未 extentfix 的 `style.navsea-delivery-full.json`,其 style 内部仍指向旧的 `pbf-delivery-full-20260415`,不是当前 20260418 rebuild 基线。 +- HTTP 检查发现普通 `/newpec/sprite/sprite.json` 和 `sprite.png` 当前返回 `404`,但 `/newpec/sprite/sprite@2x.json` 可访问;语义 sprite 的 1x/2x 文件均可访问。普通 Full variant 的非高分屏 sprite 资源需要后续单独修复或确认 Nginx 映射。 + +### 2026-08-06 全国 Full 讨论基线统一 + +- 后续全国 Full 的所有讨论、审计和图标/style 判断统一以以下组合为准: + - style:`style.navsea-delivery-full-semantic-extentfix.json` + - sprite:`/newpec/sprite-semantic/sprite` + - PBF:`/home/wwwroot/pbf-delivery-full-20260418-rebuild` +- 不再将普通 `style.navsea-delivery-full*.json`、普通 `/newpec/sprite/sprite` 或旧 `pbf-delivery-full-20260415` 作为当前全国 Full 的默认判断依据,除非明确进行历史兼容对照。 + +### 2026-08-06 语义 Full 基线 arc / symbol sprite 重新盘点 + +- 唯一基线:`style.navsea-delivery-full-semantic-extentfix.json` + `/newpec/sprite-semantic/sprite` + `pbf-delivery-full-20260418-rebuild`。 +- `arc-*`:semantic sprite 共 `255` 个;当前 style 明确引用并实际需要 `4` 个:`arc-daytime-04027289`、`arc-daytime-m1`、`arc-daytime-m2`、`arc-daytime-m3`。PBF 不直接携带 `arc-*` 图片名,灯弧由 style 根据灯标属性选择。其余 `251` 个是当前基线的删除候选,但删除前需确认旧 semantic style 不再使用同一 sprite。 +- `symbol-*`:semantic sprite 共 `171` 个;当前基线实际活跃集合约 `42` 个,来源分三类: + - style 危险物 class_code 映射:`401/404/405/409/410/412/413/420/421/422/424/425/427/428/429/431/432/433/434` + - 陆上点 class_code 动态映射:当前实际出现 `640/650/660/661/680/681/682/698` + - PBF `chart_icon_image` 动态消费:`301/303/30500001/30500002/30500003/30700003/308/310/320/321/323/325/327/335359/719` +- 当前 semantic sprite 中其余约 `129` 个 symbol 是当前基线的删除候选,但必须确认旧 semantic PBF / 页面不再复用同一 sprite。 +- 发现缺口:当前 PBF 的 `onshore_structure_point` 有 `289` 个 `class_code=662`,style 会动态请求 `symbol-daytime-662`,但 semantic sprite 没有该 key;该项应作为缺图问题处理,不能当作可删除项。 + +### 2026-08-06 `class_code=662` 语义确认 + +- 从当前 Full PBF 的真实 `onshore_structure_point` 要素抽查确认:`class_code=662` 的 `canonical_object_type` 是 `customs_office`,即“海关/海关办公设施”类陆上地标。 +- 因此 `symbol-daytime-662` 预计应是海关设施图标;它不是灯弧,也不是可以直接删除的无用 symbol。 +- 当前 semantic sprite 缺少 `symbol-daytime-662`,而 style 的动态拼接规则会请求它;后续应补图标或为 662 增加明确的安全回退映射,并做视觉核对。 + +### 2026-08-06 语义图标替换表 v1 + +- 已生成设计表:[`tasks/pbf/NavSea_语义图标替换表-v1.md`](/root/sourceserver/pbf/tasks/pbf/NavSea_语义图标替换表-v1.md) +- 覆盖当前 Full 基线实际使用的灯弧、`chart_icon_image`、危险物 class_code、陆上地标 class_code 和现有 style 别名。 +- 目前仅生成替换表,尚未改写 PBF、style 或 sprite;待表确认后一次性全量重建。 + +### 2026-08-06 语义图标改名方案的审计与反向追溯要求 + +- 后续可将 PBF 中的图标引用改为短语式语义 ID,例如 `lm_customs`、`hz_wreck`;sprite JSON 使用完整语义 key,例如 `landmark-customs-office`。 +- 语义 ID 不得替代原始对象身份。转换结果必须保留 `source_fid / source_class_code / source_layer` 等紧凑追溯字段,或生成与 PBF 版本绑定的外部审计索引。 +- 映射关系必须独立版本化,至少记录:输入字段条件、语义 ID、sprite key、style 消费规则和映射版本;支持语义 ID 反查一个或多个原始类别。 +- 后续每次原始 PBF 转自用 PBF 都应执行三层审计:对象是否保留、style 是否应该命中、语义 sprite 是否存在。报告要区分“对象丢失”“被 style 过滤/缩放隐藏”“图标缺失”三类问题。 +- 当前仅讨论设计,尚未修改 PBF、style 或 sprite。 + +### 2026-06-16 P陸域 独立 z4-9 tileset 生成入口 + +- `navsea_tile_builder.py` 新增了通用参数: + - `--source-layer-include` +- 现在可以按 legacy `source_layer` 白名单导出瓦片,不再只能整层整图输出。 +- 新增固定封装脚本: + - [`navsea_build_land_area_z4_9.py`](/root/sourceserver/pbf/navsea_build_land_area_z4_9.py) +- 这个封装入口默认: + - 只包含 `P陸域` + - 只生成 `z4-9` + - 输出到 `/home/wwwroot/pbf-delivery-land-area-z4-9` + - 复用现有 `P陸域 -> land_area` 语义,不做几何简化 +- 已完成基础验证: + - `./.venv/bin/python -m py_compile navsea_tile_builder.py navsea_build_land_area_z4_9.py` + - `./.venv/bin/python navsea_tile_builder.py --help` + - `./.venv/bin/python navsea_build_land_area_z4_9.py --help` +- 已实际生成一次数据: + - 输出目录:`/home/wwwroot/pbf-delivery-land-area-z4-9` + - 实际写入 `417` 个 PBF + - 实际覆盖 `z5-z9` + - `z4` 目录存在,但当前源数据里没有可写瓦片,所以为空 + +### 2026-06-11 固化全国 Full PBF 重建流水线节点 + +- 新增中文节点文档: + - [`NavSea_全国完整PBF重建流水线说明.md`](/root/sourceserver/pbf/NavSea_全国完整PBF重建流水线说明.md) +- 文档明确了当前全国 Full 基线 `/home/wwwroot/pbf-delivery-full-20260418-rebuild` 的完整重建方法: + - 固定 Git 代码节点 `6d72340` + - 使用原始 `newpec-mvt-20260106` 全国 PBF + - 使用未修改的 MySQL `pbf_analysis` 语义数据和 `navsea-core` 规则包 + - 以 `/home/wwwroot/pbf-delivery-full-20260415` 作为 reference footprint + - 按 `z0-8 / z9-10 / z11 / z12` 四段生成后合并 + - 按对象保真、渲染/几何、AOI 视觉顺序完成审计 +- 文档同时明确: + - `navsea_rebuild_hotspot_tiles.py` 只用于热点验证,不是全国生成 pipeline + - 重建必须先写候选目录,不直接覆盖当前正式基线 + - 验收以业务内容和解码后结构等价为主,不强制要求 PBF 二进制 SHA256 相同 +- 后续重新生成全国 Full PBF 时,以该文档作为固定入口节点。 + +### 2026-05-10 coast wall viewer 空白页修复 + +- `src/pbf/navsea-coast-wall-z12-viewer.html` 已升到 `v2.1`。 +- 修复方向: + - 先尝试本地化 MapLibre 后仍可复现“先有地图、随后底图消失/空白”的现象。 + - 最终将查看页底图从 MapLibre/WebGL 切换为本地 Leaflet,阻断墙 bin 解析与 canvas 绘制逻辑保持不变。 + - 新增本地静态资源: + - `src/pbf/vendor/leaflet-1.9.4/leaflet.css` + - `src/pbf/vendor/leaflet-1.9.4/leaflet.js` + - HTML 改为引用 `vendor/leaflet-1.9.4/...`,并带 `coast-wall-viewer-v2.1` cache-busting。 + - 保留本地资源缺失时的可见错误提示,避免静默空白。 +- 已同步部署到: + - `/mnt/sda1/www/newpec/navsea-coast-wall-z12-viewer.html` + - `/mnt/sda1/www/newpec/vendor/leaflet-1.9.4/` +- 已验证: + - `node -e ...` 检查 `src/pbf/navsea-coast-wall-z12-viewer.html` 内联 JS 语法通过。 + - `curl http://192.168.200.184/newpec/navsea-coast-wall-z12-viewer.html?v=coast-wall-viewer-v2.1` 可看到 `v2.1` 与本地 Leaflet vendor 引用。 + - Chrome headless 截图 `/tmp/navsea_v21.png` 确认底图可见。 + +### 2026-05-07 v2 hazard_50m 排除沙波/急潮波纹/涡流/海草 + +- `coastline/navgrid_v2/build_hazard_50m_mysql.py` 已调整 50m 障碍格口径: + - 不再把 `sand_wave` / 沙波作为障碍物写入 `hazard_50m` + - 不再把 `tide_rips_overfalls` / 急潮・波紋・激潮作为障碍物写入 `hazard_50m` + - 不再把 `eddy_whirlpool` / 渦流作为障碍物写入 `hazard_50m` + - 不再把 `seaweed` / `seagrass` / 海草作为障碍物写入 `hazard_50m` + - 兼容过滤字段包括 `class_code=421/422/424/425`、`chart_symbol_code`、`chart_icon_image`、`canonical_object_type`、`class_name` +- `HAZARD_DESCRIPTION` 已标注“排除沙波/急潮波纹/涡流/海草”。 +- 已验证: + - `./.venv/bin/python -m py_compile coastline/navgrid_v2/build_hazard_50m_mysql.py` + - 内联 smoke 断言确认 `421/422/424/425`、`sand_wave`、`tide_rips_overfalls`、`eddy_whirlpool`、`seaweed/seagrass`、`symbol-daytime-421/422/424/425`、`サンドウェーブ/急潮・波紋・激潮/渦流/海草` 会被排除,`427` 与 `breakwater` 不会被误排。 + +### 2026-05-06 v2 阻断墙支持可调 zoom / 墙 cell + +- `coastline/navgrid_v2/build_coast_wall_z12_bin.py` 已从固定 `z12 + 40x40` 扩展为可参数化: + - `--zoom` + - `--grid-size` + - `--grid-w` + - `--grid-h` + - `--sparse-threshold` +- 默认行为保持为原来的 `--zoom 12 --grid-size 40`。 +- `--coast-cell-size-m` 仍表示输入海岸线层大小,例如 `coast_200m/coast_100m/coast_50m`;新加的 `--zoom/--grid-size` 表示最终墙自身的输出 cell 大小。 +- 追加规则:当 `--coast-cell-size-m < 20` 时自动跳过 `fish_port_20m`,因为输入海岸线层已经比渔港 20m 更细。 + - 例如 `--zoom 14 --grid-size 80 --coast-cell-size-m 10` 会使用 `hazard_50m + coast_10m`,不再读取渔港 20m。 + - `.meta.json` 会记录 `include_fish_port_20m=false`。 +- 输出文件名在非默认墙参数下会带上墙形态,例如: + - `coast_wall_param_smoke_z11_g80_200_50_20.bin` +- 默认 `--out out/navmask/coast_wall_z12.bin` 在非默认墙参数下会自动去掉旧 stem 里的 `z12`,避免出现 `coast_wall_z12_z14_g80_...` 这类误导命名。 + - 例如 `--zoom 14 --grid-size 80 --coast-cell-size-m 10` 输出为 `coast_wall_z14_g80_10_50.bin`。 +- `src/pbf/navsea-coast-wall-z12-viewer.html` 已升到 `v1.8`,读取 bin header 自动识别 `zoom/grid`,不再只能看固定 z12/40x40。 +- 预览页已同步部署到: + - `/mnt/sda1/www/newpec/navsea-coast-wall-z12-viewer.html` +- 已验证: + - `./.venv/bin/python -m py_compile coastline/navgrid_v2/build_coast_wall_z12_bin.py` + - `./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py --help` + - `./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py --self-test --zoom 11 --grid-size 80 --bbox 130,33,130.2,33.2 --out out/navmask/coast_wall_param_smoke.bin --progress-every 0` + - `./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py --self-test --zoom 11 --grid-w 80 --grid-h 40 --bbox 130,33,130.2,33.2 --out out/navmask/coast_wall_param_rect_smoke.bin --progress-every 0` + - `./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py --zoom 14 --grid-size 80 --coast-cell-size-m 10 --bbox 130,33,130.2,33.2 --out out/navmask/coast_wall_skip_fish_smoke.bin --progress-every 0` + - `./.venv/bin/python coastline/navgrid_v2/build_coast_wall_z12_bin.py --zoom 14 --grid-size 80 --coast-cell-size-m 10 --bbox 130,33,130.2,33.2 --progress-every 0` + - 已检查该 smoke 的 meta:`include_fish_port_20m=false`,`fish_port_20m` 行数为 `0` + - `node -e ...` 检查 `src/pbf/navsea-coast-wall-z12-viewer.html` 内联 JS 语法通过 +- v2 中文说明已同步到: + - `coastline/navgrid_v2/NavSea_v2_使用说明.md` + +### 2026-05-04 三类数据拆分为 v2 新目录脚本 + +- 新增 v2 脚本目录: + - `coastline/navgrid_v2/` +- 当前 v2 脚本包括: + - `build_coast_grid_mysql.py` + - `build_fish_port_20m_mysql_resume.py` + - `build_hazard_50m_mysql.py` + - `export_coast_grid_mysql_assets.py` + - `export_navgrid_mysql_assets.py` + - `export_prc20_test_assets.py` + - `export_fish_port_debug_assets.py` + - `build_coast_wall_z12_bin.py` +- 当前 v2 验证页包括: + - `src/pbf/navsea-coastline-fukuoka-saga-200m-v2.html` + - `src/pbf/navsea-fish-port-debug-v2.html` + - `src/pbf/navsea-fish-port-prc50-test-v2.html` +- 海岸线 v2 cell 已补更明确的来源字段: + - `source_code` + - `source_path` + - `source_name` +- v2 海岸导出页已改为读取新表并输出来源字段 +- v2 共用导出脚本已改为从三套分表读取并生成 national 资产 +- 这次不做迁移脚本,仍然是重建式路线 +- v2 独立使用说明已放到: + - `coastline/navgrid_v2/NavSea_v2_使用说明.md` + +### 2026-05-04 全国海岸 50x50 支持从指定包续跑 + +- `coastline/build_japan_coast_grid_mysql.py` 已增加续跑参数: + - `--resume` + - `--start-code` +- 用途: + - 全国 `50x50` 海岸线格子如果已完成前序包,例如日志显示 `C23-06_12` 已完成、卡在 `C23-06_13`,可以保留已入库的 `coast_50m`,直接从 `C23-06_13` 继续。 +- 推荐续跑命令: + - `./.venv/bin/python coastline/build_japan_coast_grid_mysql.py --cell-size-m 50 --layer-name coast_50m --out-dir out/coastline/japan_coast_50m_mysql --resume --start-code 13` +- 行为说明: + - 带 `--resume` 时不会清理当前 `layer_name` + - 不带 `--resume` 时仍是完整重建,会先删除当前目标 `layer_name` 的旧记录 + - 每个包写入统计前会先删除同一 `layer_name + source_code` 的旧统计,避免续跑造成包统计重复 +- 进度日志已加时间戳心跳: + - 包开始、几何构造、分批落库、包完成都会打印 `YYYY-MM-DD HH:MM:SS` + - 处理大包时还会按扫描格数和时间间隔输出中途进度 +- 中文说明已同步到: + - `NavSea_全国三层数据生成与查看说明.md` + +### 2026-05-04 全国海岸 50x50 扫描逻辑改为粗筛+细扫 + +- `coastline/build_japan_coast_grid_mysql.py` 已从“整包大 bbox 暴力逐格判断”改为: + - 按每条海岸线分别生成局部 `buffer` + - 先用更大的粗框做候选筛选 + - 只对命中的粗框做 50m 细扫 + - 每条线结束后就把当前命中的格子写入数据库 +- 默认粗筛倍率为 `8` +- 这一版的目标是减少空扫数量,并让数据库更早看到写入 +- `py_compile` 已通过 +- 说明文档暂仍沿用原入口,后续如需要再补一段“新扫描策略”说明 + ### 2026-05-03 渔港 20m 语义修正为海岸线格子 +- `coastline/build_japan_coast_grid_mysql.py` 已改为可配置海岸线格子大小: + - 新增 `--cell-size-m` + - 新增 `--layer-name` + - 默认仍是 `200m -> coast_200m` + - `--cell-size-m 50` 默认自动写入 `coast_50m` + - 脚本不再 `DROP TABLE navsea_grid_cell/navsea_grid_layer_meta/navsea_grid_package_stat` + - 重跑时只删除当前目标 `layer_name` 的旧记录,避免 `coast_50m`、`coast_200m`、`fish_port_20m`、`hazard_50m` 相互覆盖 + - 单层 coast 写入统一使用固定 `source_name`,避免同一层内相邻海岸线包的重叠格重复落库 + - `navsea_grid_package_stat` 已补 `layer_name` 维度,便于不同尺寸的海岸线统计并存 + - 已用临时库验证:`--db-name navsea_coast_grid_param_smoke --input coastline/C23-06_40_GML.zip --cell-size-m 1000` +- 新增 z12 阻断墙二进制生成器: + - `coastline/build_coast_wall_z12_bin.py` +- 新增独立中文说明: + - `NavSea_coast_wall_z12_bin_生成说明.md` +- 生成逻辑已经按当前 MySQL 三层格子实现,不再从原始矢量重新栅格化: + - 读取 `fish_port_20m` + - 读取 `hazard_50m` + - 读取 `coast_200m` + - 按 `density_overview_grid` 同一套密度优先级融合 +- 当前融合规则: + - `20x20` 永远保留 + - `50x50` 与已保留 `20x20` 重叠时跳过 + - `200x200` 与已保留 `20x20` 或已保留 `50x50` 重叠时跳过 +- 输出格式: + - `coast_wall_z12.bin` + - `coast_wall_z12.bin.meta.json` + - 可选 debug GeoJSON +- bin 编码: + - z12 tile 内部切成 `40x40` + - 每 tile blocked cell 数量 `<=96` 用 sparse `uint16[]` + - `>96` 用 `uint32[50]` bitset + - Header / BlockDirectory / TileDirectory / DataBlob 按任务文档写入 +- 已做两次验证: + - `./.venv/bin/python -m py_compile coastline/build_coast_wall_z12_bin.py` + - `./.venv/bin/python coastline/build_coast_wall_z12_bin.py --self-test --bbox 130,33,131,34.5 --out out/navmask/coast_wall_z12_fukuoka_smoke.bin --query 130.4,33.6 --progress-every 0` +- 九州样例已生成: + - `out/navmask/coast_wall_z12_kyushu.bin` + - `out/navmask/coast_wall_z12_kyushu.bin.meta.json` + - `out/navmask/coast_wall_z12_kyushu.debug.geojson` + - 样例统计:`tiles=813`,`cells=148453`,`sparse=351`,`bitset=462`,`blocks=7`,`size=122625` - 复查 `coastline/build_fish_port_20m_full_mysql_resume.py --fpc 4320065` 与 `--prc 40` 结果不一致的问题: - 原始 `C09-06.zip` 中 `FPC=4320065` 确实属于 `PRC=40` - 该 FPC 有 2 条线要素,按当前逻辑命中 54 个 `coast_200m` 粗格 @@ -1805,3 +2120,162 @@ - 已将 `fish_port_20m` 的唯一键改为 `UNIQUE KEY (layer_name, source_name, cell_id)`,让不同港口的同名格子不再互相覆盖。 - 全国导出层也补了按 `cell_id` 去重,避免同一格在全国 GeoJSON 里重复输出。 - 结论:`--prc` 与 `--fpc` 现在在落库层面已经按港独立了,后续如果再出现差异,就只需要查几何或海岸线输入,不用再怀疑存储覆盖。 + +## 2026-05-04 v2 导入脚本参数整理 + +- 已更新 `coastline/navgrid_v2/NavSea_v2_使用说明.md`,把三个 v2 导入脚本的参数开关单独列清楚。 +- 重点补了鱼港 20m 的跳过与回退逻辑说明: + - `--resume` + - `--no-resume` + - `--prc` + - `--fpc` + - `--skip-missing-coarse` + - `--allow-unbounded-fallback` +- 沿岸与海上障碍两个导入脚本也补了参数用途说明,避免后续维护时再回到代码里找开关含义。 + +## 2026-05-04 coastline 最终目标确认 + +- 已在 `coastline/navgrid_v2/NavSea_v2_使用说明.md` 中明确: + - `coastline` 这条链路的最终目标是导出阻断墙 `bin` +- 同时把生成顺序调整为: + - 三类数据重建 + - 静态资产导出 + - 阻断墙二进制输出 +- 后续如果再改表结构或导出逻辑,都以最终 `bin` 可用为收口标准。 + +## 2026-05-04 阻断墙 bin 支持切换海岸线层 + +- 已更新 `coastline/navgrid_v2/build_coast_wall_z12_bin.py` + - 新增 `--coast-cell-size-m` + - 新增 `--coast-layer-name` +- 默认仍按 `coast_200m` 生成 bin。 +- 现在可以直接切到 `coast_100m` 或 `coast_50m`,前提是对应的 v2 海岸线表已重新生成。 +- 使用说明也已同步到 `coastline/navgrid_v2/NavSea_v2_使用说明.md`。 + +## 2026-05-04 导入脚本的批量 resume 边界说明 + +- 已在 `coastline/navgrid_v2/NavSea_v2_使用说明.md` 里补充: + - 沿岸数据支持 `--resume + --start-code` 的批量续跑 + - 渔港 20m 支持全国批量 `--resume` + - 一旦显式指定 `--prc` 或 `--fpc`,渔港脚本会进入指定区域完整重算模式,并忽略原来的 resume 断点 +- 这样后续维护时可以直接按两种模式理解: + - 全国续跑 + - 指定区域重算 + +## 2026-05-04 海上障碍导入日志统一为时间戳 + +- 已更新 `coastline/navgrid_v2/build_hazard_50m_mysql.py` + - 统一改用带时间戳的 `log()` 输出 + - 现在和沿岸、渔港两支一样,导入时更容易看出当前跑到哪一步 +- 这样三支 v2 导入脚本的主流程日志格式已经统一。 + +## 2026-05-04 海上障碍 50m 轻量记录 fid + +- 已更新 `coastline/navgrid_v2/build_hazard_50m_mysql.py` + - 海上障碍 50m 不再追完整来源链 + - `navsea_hazard_grid_cell.source_name` 直接记录代表性的 `fid` +- `NavSea_v2_使用说明.md` 也同步说明了这条约定 +- 这样海障这组的记录更轻,符合当前“只记 fid”的维护策略。 + +## 2026-05-04 来源字段的运维用途确认 + +- 已在 `NavSea_v2_使用说明.md` 中明确: + - 来源字段除了追溯,还用于检查、删除某个指定来源的数据,以及按来源做 resume / 复跑 +- 这也是 v2 表分离和 cell 来源显式化的主要原因之一。 + +## 2026-05-04 海障来源索引补齐 + +- 已更新 `coastline/navgrid_v2/build_hazard_50m_mysql.py` + - 给 `navsea_hazard_grid_cell` 增加 `(layer_name, source_name)` 索引 + - 现在海障这组按 `fid` 查删和复跑会更顺手 +- `NavSea_v2_使用说明.md` 也同步说明了这一点。 + +## 2026-05-04 v2 脚本根路径修正 + +- 已修正 v2 目录下几个脚本的 `project_root` 计算,统一指向仓库根目录 `/root/sourceserver/pbf` +- 这次影响到: + - `build_coast_grid_mysql.py` + - `build_fish_port_20m_mysql_resume.py` + - `build_hazard_50m_mysql.py` + - `export_coast_grid_mysql_assets.py` + - `export_fish_port_debug_assets.py` + - `export_prc20_test_assets.py` +- 原因是之前少退了一层,默认输入 glob 会去找一个不存在的 `coastline/coastline/...` 路径。 + +## 2026-05-04 阻断墙 bin 文件名带三层单位 + +- 已更新 `coastline/navgrid_v2/build_coast_wall_z12_bin.py` + - 输出 `bin` 文件名会自动带上当前三层单位 + - 例如 `coast_wall_z12_100_50_20.bin` + - `meta.json` 也会跟着同一文件名后缀走 +- `NavSea_v2_使用说明.md` 已同步补充默认命名示例。 + +## 2026-05-04 阻断墙 bin 三层来源表修正 + +- 已修正 `coastline/navgrid_v2/build_coast_wall_z12_bin.py` + - 之前三层数据都被错误地从 `navsea_fish_port_grid_cell` 读取 + - 现在 `fish_port_20m`、`hazard_50m`、`coast_100m / coast_200m` 分别读取各自表 + - `coast_*` 新层名也统一映射到 `navsea_coast_grid_cell` +- 修正后 `coast_wall_z12_100_50_20.bin` 的输出体量恢复正常,`hazard_50m` 与 `coast_100m` 不再是 0。 + +## 2026-05-04 渔港 20m 粗筛改查 coast 表 + +- 已修正 `coastline/navgrid_v2/build_fish_port_20m_mysql_resume.py` + - `load_coarse_mask()` 由错误的 `navsea_fish_port_grid_cell` 改为 `navsea_coast_grid_cell` + - `load_coarse_windows_for_bbox()` 也同步改为读取 `navsea_coast_grid_cell` +- 这解释了之前日志里 `coast_200m 粗筛底座为空` 的异常现象。 +- 当前库里已经能查到 `navsea_coast_grid_cell / coast_200m`,所以后续鱼港脚本会真正拿海岸底盘去粗筛。 + +## 2026-05-04 渔港海岸几何合并日志细化 + +- 已在 `coastline/navgrid_v2/build_fish_port_20m_mysql_resume.py` 给 PRC 级海岸线处理补了更细日志: + - `unary_union` 前后 + - `buffer` 前后 +- 对比 v1 / v2,这一段逻辑本身是一致的;这次只是把真正耗时的位置显式打印出来,避免“海岸线缓存完成”这句把卡点遮住。 + +## 2026-05-04 阻断墙 bin 预览页 + +- 已新增 `src/pbf/navsea-coast-wall-z12-viewer.html` + - 可直接用文件选择器加载 `coast_wall_z12_*.bin` + - 支持可选加载同名 `.meta.json` + - 直接在地图上查看最终阻断墙的铺面效果 +- `NavSea_v2_使用说明.md` 已补上这个预览页入口。 +- 页面已部署到 `/mnt/sda1/www/newpec/navsea-coast-wall-z12-viewer.html`,可直接用 `http://192.168.200.184/newpec/navsea-coast-wall-z12-viewer.html` 打开。 +- 已把预览页调成高对比显示,底图透明度降低,阻断墙填充和描边加重,方便肉眼快速看清。 +- 已进一步调整为自然底图 + 红色阻断墙高对比显示,避免整张图发黑。 +- 预览页版本已抬到 `v1.1`,避免浏览器继续命中旧缓存。 +- 阻断墙预览页再升级到 `v1.2`,新增鼠标经纬度读数和 tile 轮廓开关,便于核对是否存在坐标偏移。 +- 阻断墙预览页升级到 `v1.3`,新增 Y 原点切换,默认底部原点,专门用于排查 tile XYZ / y 轴方向是否看反。 +- 已按要求回退阻断墙预览页到 `v1.0` 风格,并把面板改成可拖动,避免遮挡主视图。 +- 进一步把阻断墙重绘从 `move/zoom/rotate/pitch` 切到 MapLibre `render` / `moveend` 驱动,减少拖拽过程中 canvas 与地图不同步导致的“红墙看起来在变”。 +- 又把阻断墙重绘改为同步执行,去掉 `requestAnimationFrame` 这层额外延迟,避免拖动地图时红墙比底图慢一拍、看起来向右偏。 +- 当前阻断墙预览页已抬到 `v1.1`,用于继续排查红墙与底图轻微偏右的问题。 +- 进一步把阻断墙 canvas 挂到 MapLibre 的 `canvasContainer` 里,并把页面版本抬到 `v1.2`,继续排查“只在局部窗口出现且略偏右”的问题。 +- 发现把阻断墙 canvas 挂到 `canvasContainer` 反而会让红墙只在局部窗口出现;已撤回该绑定,并把页面版本抬到 `v1.3`,让 overlay 回到页面级覆盖层。 +- 继续把阻断墙预览页抬到 `v1.4`,增加一个可切换的 tile 轮廓开关,便于确认红墙是否只是局部窗口显示偏移,还是 tile 本身就只落在那一块。 +- 阻断墙预览页继续升级到 `v1.5`,增加“点位”模式,点击地图后会显示该点对应的 tile / cell 边界,方便把红墙偏移问题从感觉变成可验证坐标。 +- 阻断墙预览页继续升级到 `v1.6`,补上 `z12_cell_for_lonlat()` 和 `idle` 补绘,避免点位模式报错,并减少“只有切换开发者模式后红墙才出现”的渲染时序问题。 +- 阻断墙预览页继续升级到 `v1.7`,把 `map.resize()`、overlay 尺寸同步和 `ResizeObserver` 串起来,专门处理“切换开发者模式才整图出现红墙”和点位标记偏移的问题。 + +## 2026-08-06 九州语义图标替换测试版 v1 + +- 以当前可靠 Full 基线 `/home/wwwroot/pbf-delivery-full-20260418-rebuild` 为来源,生成九州范围测试 PBF: + - `/home/wwwroot/pbf-delivery-kyushu-semantic-icon-v1-20260806` + - 范围 `128.0,30.0,132.5,34.9`,zoom 5–12,共 4707 张瓦片 + - 实际重写 1340 张瓦片,40131 个 feature 发生图标语义字段替换 +- 部署了语义 sprite: + - `http://192.168.200.184/newpec/sprite-kyushu-semantic-icon-v1-20260806/sprite` + - 补齐 `arc_open_YW / arc_G / arc_R / arc_YW` 四个弧灯键,并清除未使用的旧 `symbol-daytime-* / arc-daytime-*` 键;最终 55 个实际使用图标键全部闭合。 +- 生成并部署了两套样式: + - `style.navsea-newpec-kyushu-icon-test-v1.json` + - `style.navsea-delivery-kyushu-semantic-icon-v1.json` +- 生成并部署左右对比页: + - `http://192.168.200.184/newpec/navsea-compare-kyushu-semantic-icon-v1.html` + - 页面版本 `kyushu-semantic-icon-v1-20260806`,支持同步平移/缩放和左右点击检查。 +- 审计结果: + - 对象/几何/非图标属性:4707/4707 瓦片比较,错误瓦片 0,结论 PASS。 + - 旧 `symbol-daytime-* / arc-daytime-*` 前缀残留:0。 + - Sprite 图标键闭合:55/55,结论 PASS。 + - native geometry audit:extent 与当前 raw source 不一致 0,未修复 0;报告中的 outside-extent 是当前既有坐标溢出表现,且对象审计确认本次没有新增几何变化。 + - 博多/唐津 z10、z12 浏览器视觉截图已完成;左右差异较大主要来自原始 newpec 底图与 delivery 海图样式本身不同,不能单独作为图标替换失败依据。 +- 机器可复现入口:`navsea_build_kyushu_semantic_icon_test.py`;对象审计入口:`navsea_audit_kyushu_semantic_icon_test.py`。 diff --git a/navsea_audit_kyushu_semantic_icon_test.py b/navsea_audit_kyushu_semantic_icon_test.py index 0f826bc..8015790 100644 --- a/navsea_audit_kyushu_semantic_icon_test.py +++ b/navsea_audit_kyushu_semantic_icon_test.py @@ -20,10 +20,26 @@ def stable(value: Any) -> str: return json.dumps(value, ensure_ascii=False, sort_keys=True, separators=(",", ":")) -def feature_signature(feature: dict[str, Any]) -> str: +def normalize_expected_properties(layer_name: str, properties: dict[str, Any]) -> None: + if ( + layer_name == "anchor_caution_hazard_area" + and str(properties.get("class_code")) == "420" + and properties.get("chart_fill_pattern") == "fill-daytime-405" + ): + properties["chart_fill_pattern"] = "fill-daytime-420" + if ( + layer_name == "navigation_hazard_area" + and str(properties.get("class_code")) == "427" + and properties.get("chart_fill_pattern") == "fill-daytime-405" + ): + properties["chart_fill_pattern"] = "fill-daytime-427" + + +def feature_signature(layer_name: str, feature: dict[str, Any]) -> str: properties = dict(feature.get("properties") or {}) for field in EXPECTED_FIELDS: properties.pop(field, None) + normalize_expected_properties(layer_name, properties) return stable({ "id": feature.get("id"), "geometry": feature.get("geometry"), @@ -50,8 +66,8 @@ def audit_tile(args: tuple[str, str]) -> dict[str, Any]: target_features = target.get(layer_name, {}).get("features", []) source_counts[layer_name] = len(source_features) target_counts[layer_name] = len(target_features) - source_signatures = Counter(feature_signature(feature) for feature in source_features) - target_signatures = Counter(feature_signature(feature) for feature in target_features) + source_signatures = Counter(feature_signature(layer_name, feature) for feature in source_features) + target_signatures = Counter(feature_signature(layer_name, feature) for feature in target_features) if source_signatures != target_signatures: missing = source_signatures - target_signatures extra = target_signatures - source_signatures diff --git a/navsea_build_kyushu_semantic_icon_test.py b/navsea_build_kyushu_semantic_icon_test.py index a87089e..f857048 100644 --- a/navsea_build_kyushu_semantic_icon_test.py +++ b/navsea_build_kyushu_semantic_icon_test.py @@ -27,10 +27,11 @@ TARGET_ROOT = Path("/home/wwwroot/pbf-delivery-kyushu-semantic-icon-v1-20260806" TARGET_TILE_URL = "http://192.168.200.184/pbf-delivery-kyushu-semantic-icon-v1-20260806/{z}/{x}/{y}.pbf" KYUSHU_BBOX = (128.0, 30.0, 132.5, 34.9) ZOOMS = tuple(range(5, 13)) +ASSET_VERSION = "kyushu-semantic-icon-v1-20260806-r2" SPRITE_SOURCE = Path("/mnt/sda1/www/newpec/sprite-semantic") -SPRITE_TARGET = Path("/mnt/sda1/www/newpec/sprite-kyushu-semantic-icon-v1-20260806") -SPRITE_URL = "http://192.168.200.184/newpec/sprite-kyushu-semantic-icon-v1-20260806/sprite" +SPRITE_TARGET = Path(f"/mnt/sda1/www/newpec/sprite-{ASSET_VERSION}") +SPRITE_URL = f"http://192.168.200.184/newpec/sprite-{ASSET_VERSION}/sprite" STYLE_SOURCE = REPO_ROOT / "src/pbf/style.navsea-delivery-full-semantic-extentfix.json" STYLE_OUTPUT = REPO_ROOT / "src/pbf/style.navsea-delivery-kyushu-semantic-icon-v1.json" @@ -142,6 +143,21 @@ def arc_icon(properties: dict[str, Any], config: dict[str, Any]) -> str | None: return config["arc_rules"].get(color, config["arc_rules"]["other"]) +def normalize_pattern_properties(layer_name: str, properties: dict[str, Any]) -> None: + if ( + layer_name == "anchor_caution_hazard_area" + and str(properties.get("class_code")) == "420" + and properties.get("chart_fill_pattern") == "fill-daytime-405" + ): + properties["chart_fill_pattern"] = "fill-daytime-420" + if ( + layer_name == "navigation_hazard_area" + and str(properties.get("class_code")) == "427" + and properties.get("chart_fill_pattern") == "fill-daytime-405" + ): + properties["chart_fill_pattern"] = "fill-daytime-427" + + def rewrite_tile( source: Path, target: Path, @@ -162,6 +178,7 @@ def rewrite_tile( for feature in layer["features"]: properties = dict(feature.get("properties") or {}) before = dict(properties) + normalize_pattern_properties(layer_name, properties) legacy = properties.get("chart_icon_image") if isinstance(legacy, str) and ( legacy.startswith("symbol-daytime-") or legacy.startswith("arc-daytime-") @@ -279,9 +296,41 @@ def write_newpec_style() -> None: write_style(style, NEWPEC_STYLE_OUTPUT, NEWPEC_STYLE_DEPLOY) -def build_sprite(config: dict[str, Any]) -> dict[str, Any]: +def collect_literal_sprite_refs(style: dict[str, Any]) -> set[str]: + refs: set[str] = set() + + def walk(value: Any) -> None: + if isinstance(value, dict): + for child in value.values(): + walk(child) + elif isinstance(value, list): + for child in value: + walk(child) + elif isinstance(value, str): + if ( + value.startswith("pattern_fill_") + or value.startswith("fill-daytime-") + or value.startswith("fill_") + or value.startswith("special_pattern_") + or value in {"tide_spot"} + ): + refs.add(value) + + for layer in style.get("layers", []): + layout = layer.get("layout") or {} + paint = layer.get("paint") or {} + for field in ("icon-image",): + if field in layout: + walk(layout[field]) + for field in ("fill-pattern", "line-pattern"): + if field in paint: + walk(paint[field]) + return refs + + +def build_sprite(config: dict[str, Any], style: dict[str, Any]) -> dict[str, Any]: if SPRITE_TARGET.exists(): - raise RuntimeError(f"refusing to overwrite existing sprite target: {SPRITE_TARGET}") + shutil.rmtree(SPRITE_TARGET) SPRITE_TARGET.mkdir(parents=True) source_meta: dict[str, dict[str, dict[str, Any]]] = {} for filename in ("sprite.json", "sprite@2x.json"): @@ -290,11 +339,25 @@ def build_sprite(config: dict[str, Any]) -> dict[str, Any]: key_map = dict(config["sprite_key_map"]) key_map.update(STYLE_EXTRA_MAP) fallback_sources = {"lm_cus": "symbol-daytime-660"} + passthrough_keys = collect_literal_sprite_refs(style) added: dict[str, str] = {} - removed = set(key_map) for filename, meta in source_meta.items(): - # 测试包只保留新的短语键,避免把未使用的旧 symbol/arc 键继续带入 sprite。 + # 测试包只改名图标/灯弧;fill/line pattern 等非图标纹理必须按 style 原名保留。 output: dict[str, dict[str, Any]] = {} + data_driven_pattern_keys = { + key + for key in meta + if ( + key.startswith("pattern_fill_") + or key.startswith("fill-daytime-") + or key.startswith("fill_") + or key.startswith("special_pattern_") + ) + } + for key in sorted(passthrough_keys | data_driven_pattern_keys): + if key in meta: + output[key] = dict(meta[key]) + added[key] = key for old_key, new_key in key_map.items(): source_key = old_key if old_key in meta else None if source_key is None: @@ -313,7 +376,11 @@ def build_sprite(config: dict[str, Any]) -> dict[str, Any]: for filename in ("sprite.png", "sprite@2x.png"): shutil.copy2(SPRITE_SOURCE / filename, SPRITE_TARGET / filename) - return {"added": added, "fallbacks": {"lm_cus": fallback_sources["lm_cus"]}} + return { + "added": added, + "passthrough_keys": sorted(passthrough_keys), + "fallbacks": {"lm_cus": fallback_sources["lm_cus"]}, + } def main() -> None: @@ -364,8 +431,10 @@ def main() -> None: icon_counts.update(result["icon_counts"]) arc_counts.update(result["arc_counts"]) - sprite = build_sprite(config) style = transform_style(config) + style["metadata"]["navsea_test_version"] = ASSET_VERSION + style["sprite"] = SPRITE_URL + sprite = build_sprite(config, style) write_style(style, STYLE_OUTPUT, STYLE_DEPLOY) write_newpec_style() diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/object_geometry_icon_audit.md b/report/kyushu_semantic_icon_v1_2026-08-06/object_geometry_icon_audit.md index 1d19698..bfa66c3 100644 --- a/report/kyushu_semantic_icon_v1_2026-08-06/object_geometry_icon_audit.md +++ b/report/kyushu_semantic_icon_v1_2026-08-06/object_geometry_icon_audit.md @@ -7,4 +7,9 @@ - 旧图标前缀残留:`0` - 结论:`PASS` -本审计忽略预期的 `chart_icon_image`、`icon_id`、`arc_id` 字段变化,逐图层比较对象数量、ID、几何和其余属性。 +本审计忽略预期的 `chart_icon_image`、`icon_id`、`arc_id` 字段变化,并把两个不存在的纹理名规范化后再比较: + +- `anchor_caution_hazard_area class_code=420`:`fill-daytime-405` -> `fill-daytime-420` +- `navigation_hazard_area class_code=427`:`fill-daytime-405` -> `fill-daytime-427` + +其余内容逐图层比较对象数量、ID、几何和属性。 diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/sprite_icon_closure.json b/report/kyushu_semantic_icon_v1_2026-08-06/sprite_icon_closure.json index e7a7e85..3352d0b 100644 --- a/report/kyushu_semantic_icon_v1_2026-08-06/sprite_icon_closure.json +++ b/report/kyushu_semantic_icon_v1_2026-08-06/sprite_icon_closure.json @@ -1,4 +1,6 @@ { + "asset_version": "kyushu-semantic-icon-v1-20260806-r2", + "scanned_tiles": 4707, "used_keys": [ "an_desig", "an_no_anchor", @@ -18,6 +20,10 @@ "fac_marina", "fac_port", "fac_seastation", + "fill-daytime-420", + "fill-daytime-427", + "fill-daytime-428", + "fill-daytime-754", "hz_danger_clear", "hz_danger_iso", "hz_dolphin", @@ -54,10 +60,13 @@ "lt_min", "mk_lead_c", "mk_lead_v", - "mk_vais" + "mk_vais", + "pattern_fill_fishery_or_fish_reef_area", + "special_pattern_line_754", + "tide_spot" ], - "used_key_count": 55, - "sprite_key_count": 64, + "used_key_count": 62, + "sprite_key_count": 98, "missing_keys": [], "legacy_sprite_keys": [], "verdict": "PASS" diff --git a/report/kyushu_semantic_icon_v1_2026-08-06/sprite_icon_closure.md b/report/kyushu_semantic_icon_v1_2026-08-06/sprite_icon_closure.md index a9b32c5..d90f614 100644 --- a/report/kyushu_semantic_icon_v1_2026-08-06/sprite_icon_closure.md +++ b/report/kyushu_semantic_icon_v1_2026-08-06/sprite_icon_closure.md @@ -1,7 +1,11 @@ -# 九州测试版 Sprite 图标闭合审计 +# 九州测试版 Sprite 图标与纹理闭合审计 -- 使用中的 icon_id/arc_id:`55` -- sprite 键数:`64` +- 资产版本:`kyushu-semantic-icon-v1-20260806-r2` +- 扫描瓦片:`4707` +- 使用中的 icon_id/arc_id/纹理 key:`62` +- sprite 键数:`98` - 缺失键:`0` - 旧前缀键:`0` - 结论:`PASS` + +本审计同时检查 `icon_id`、`arc_id`、`chart_fill_pattern`、`chart_fill_style` 映射纹理,以及 style 中直接写死的 `fill-pattern` / `line-pattern` / `icon-image` 依赖。 diff --git a/src/pbf/navsea-compare-kyushu-semantic-icon-v1.html b/src/pbf/navsea-compare-kyushu-semantic-icon-v1.html index b4ba823..25510e2 100644 --- a/src/pbf/navsea-compare-kyushu-semantic-icon-v1.html +++ b/src/pbf/navsea-compare-kyushu-semantic-icon-v1.html @@ -42,7 +42,7 @@
左侧:原始 newpec;右侧:当前 Full 基线生成的九州语义图标测试版。两侧同步平移、缩放,可点击对象查看属性。
- HTML: kyushu-semantic-icon-v1-20260806 + HTML: kyushu-semantic-icon-v1-20260806-r2 Style: 加载中 @@ -56,7 +56,7 @@
等待加载样式…