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