fix: preserve Kyushu semantic fill patterns

This commit is contained in:
OpenAI Codex
2026-08-06 18:35:04 +08:00
parent e52328b3f5
commit 69b4f961a6
8 changed files with 600 additions and 23 deletions

View File

@@ -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-*` 图片名写入 PBFPBF 只保存灯色和灯弧语义,图片由 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-<class_code>` 的规则。
- 当前全国 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 512共 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 auditextent 与当前 raw source 不一致 0未修复 0报告中的 outside-extent 是当前既有坐标溢出表现,且对象审计确认本次没有新增几何变化。
- 博多/唐津 z10、z12 浏览器视觉截图已完成;左右差异较大主要来自原始 newpec 底图与 delivery 海图样式本身不同,不能单独作为图标替换失败依据。
- 机器可复现入口:`navsea_build_kyushu_semantic_icon_test.py`;对象审计入口:`navsea_audit_kyushu_semantic_icon_test.py`

View File

@@ -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

View File

@@ -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()

View File

@@ -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、几何和属性。

View File

@@ -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"

View File

@@ -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` 依赖。

View File

@@ -42,7 +42,7 @@
<div class="subtitle">左侧:原始 newpec右侧当前 Full 基线生成的九州语义图标测试版。两侧同步平移、缩放,可点击对象查看属性。</div>
</div>
<div class="actions">
<span id="version" class="chip">HTML: kyushu-semantic-icon-v1-20260806</span>
<span id="version" class="chip">HTML: kyushu-semantic-icon-v1-20260806-r2</span>
<span id="style" class="chip">Style: 加载中</span>
<button id="reload" type="button">重新加载</button>
<button id="home" type="button">回到九州</button>
@@ -56,7 +56,7 @@
<div id="status">等待加载样式…</div>
<script src="https://unpkg.com/maplibre-gl@4.7.1/dist/maplibre-gl.js"></script>
<script>
const VERSION = "kyushu-semantic-icon-v1-20260806";
const VERSION = "kyushu-semantic-icon-v1-20260806-r2";
const ORIGINAL_STYLE = "./domain/style.navsea-newpec-kyushu-icon-test-v1.json";
const DELIVERY_STYLE = "./domain/style.navsea-delivery-kyushu-semantic-icon-v1.json";
const CENTER = [130.4, 32.5], ZOOM = 7.5;

View File

@@ -1,7 +1,7 @@
{
"version": 8,
"name": "NavSea Kyushu Semantic Icon Test v1",
"sprite": "http://192.168.200.184/newpec/sprite-kyushu-semantic-icon-v1-20260806/sprite",
"sprite": "http://192.168.200.184/newpec/sprite-kyushu-semantic-icon-v1-20260806-r2/sprite",
"glyphs": "http://192.168.200.184/newpec/fonts/{fontstack}/{range}.pbf",
"sources": {
"mapple": {
@@ -2673,7 +2673,7 @@
}
],
"metadata": {
"navsea_test_version": "kyushu-semantic-icon-v1-20260806",
"navsea_test_version": "kyushu-semantic-icon-v1-20260806-r2",
"source_baseline": "/home/wwwroot/pbf-delivery-full-20260418-rebuild",
"icon_map": "/root/sourceserver/pbf/tasks/pbf/navsea_semantic_icon_map_v1.json"
}