11 KiB
NavSea 全国 Full PBF 重建流水线说明
最后确认:2026-06-11
1. 文档目的
本文固化当前全国 Full PBF 基线的可重复重建节点:
- 当前基线目录:
/home/wwwroot/pbf-delivery-full-20260418-rebuild - 原始海图来源:全国
newpecPBF - 语义来源:MySQL
pbf_analysis - 固定规则包:
navsea-core - 固定代码节点:Git commit
6d72340
本文用于以后重新生成与 pbf-delivery-full-20260418-rebuild 业务内容等价的全国 Full PBF。
这里的“业务内容等价”是指:
- 瓦片范围一致
- source layer、对象和属性语义一致
- 几何与 extent 一致
- 样式消费结果和人工视觉判断一致
不强制要求每个 PBF 文件的二进制 SHA256 完全一致。编码库版本、属性顺序或 feature 编码顺序变化,都可能造成字节不同。
2. 当前确认条件
2.1 数据库
当前已确认数据库内容没有被修改。
数据库配置由 navsea_tile_builder.py 的 DbConfig 提供:
- database:
pbf_analysis - unix socket:
/tmp/mysql.sock
当前关键表数量:
| 表 | 行数 |
|---|---|
features |
6685117 |
properties |
23659423 |
pbf_relayer_candidates |
6685117 |
规则包:
bundle_id = navsea-core- 当前状态:
v1-draft
2.2 原始 PBF
原始几何与原始属性来源:
/home/wwwroot/newpec/exported_auto/
tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles
本文后续命令将其写成单行路径。
2.3 Reference Footprint
全国瓦片生成范围使用:
/home/wwwroot/pbf-delivery-full-20260415
--reference-tile-root 只决定需要生成哪些 z/x/y 瓦片。
实际瓦片几何仍读取原始 newpec PBF,语义数据仍读取 MySQL。不要把 20260415 理解成新包的内容来源。
2.4 固定代码版本
2026-04-18 全国分片重建时,固定使用的是当时的 HEAD 版本。对应可追溯节点:
6d72340 guard high-extent tile reencoding
当前工作区的 navsea_tile_builder.py 已经包含后续修改,不能用于严格复建该历史基线。应使用独立 Git worktree,同时固定:
navsea_tile_builder.pynavsea_mapping_registry.pytasks/pbf/mappings/下的规则文件
3. 流水线总览
原始 newpec 全国 PBF
+
MySQL pbf_analysis 语义表
+
navsea-core 映射规则
↓
固定 6d72340 代码节点
↓
按 z0-8 / z9-10 / z11 / z12 分片重建
↓
合并全国候选根目录
↓
瓦片数量与 mapping audit
↓
对象保真与 geometry / extent audit
↓
全国固定 AOI 视觉审计
↓
人工确认后切换 style 和正式目录
4. 重建前准备
4.1 禁止直接覆盖当前基线
不要直接写入:
/home/wwwroot/pbf-delivery-full-20260418-rebuild
先生成候选目录,审计通过后再切换。本文示例候选目录:
/home/wwwroot/pbf-delivery-full-rebuild-candidate
4.2 建立固定代码 worktree
cd /root/sourceserver/pbf
git worktree add --detach /tmp/navsea-full-rebuild-code 6d72340
检查固定版本:
git -C /tmp/navsea-full-rebuild-code rev-parse HEAD
期望以 6d72340 开头。
4.3 设置路径变量
export REPO=/root/sourceserver/pbf
export CODE=/tmp/navsea-full-rebuild-code
export PY=/root/sourceserver/pbf/.venv/bin/python
export SOURCE=/home/wwwroot/newpec/exported_auto/tile.mapple-on.jp__newpec-mvt-20260106__z___x___y_.pbf/tiles
export REFERENCE=/home/wwwroot/pbf-delivery-full-20260415
export PARTS=/home/wwwroot/pbf-delivery-full-rebuild-candidate.parts
export CANDIDATE=/home/wwwroot/pbf-delivery-full-rebuild-candidate
4.4 输入预检
test -d "$SOURCE"
test -d "$REFERENCE"
test -x "$PY"
test -f "$CODE/navsea_tile_builder.py"
检查 reference 瓦片总数:
find "$REFERENCE" -type f -name '*.pbf' | wc -l
当前期望:
65148
检查数据库连接和关键表:
cd "$REPO"
$PY - <<'PY'
import pymysql
from navsea_tile_builder import DbConfig
config = DbConfig()
connection = pymysql.connect(
host=config.host,
port=config.port,
user=config.user,
password=config.password,
database=config.database,
unix_socket=config.unix_socket,
)
with connection:
with connection.cursor() as cursor:
for table in ("features", "properties", "pbf_relayer_candidates"):
cursor.execute(f"SELECT COUNT(*) FROM `{table}`")
print(table, cursor.fetchone()[0])
PY
5. 全国分片重建
5.1 清理候选输出
候选目录只能在确认它不是正式目录后删除:
rm -rf "$PARTS" "$CANDIDATE"
mkdir -p "$PARTS"
5.2 通用构建参数
四个分片必须使用相同业务参数:
--strip-legacy-japanese-delivery
--release-minimal
--fid-key 'thisMyWorld@2026'
--bundle-id navsea-core
机器实际只有 4 核。建议四个分片各使用 workers=1 并行执行,避免沿用历史上的过度并发参数。
5.3 z0 至 z8
$PY "$CODE/navsea_tile_builder.py" \
--source-root "$SOURCE" \
--reference-tile-root "$REFERENCE" \
--output "$PARTS/z0_8" \
--zmin 0 \
--zmax 8 \
--workers 1 \
--strip-legacy-japanese-delivery \
--release-minimal \
--fid-key 'thisMyWorld@2026' \
--bundle-id navsea-core
5.4 z9 至 z10
$PY "$CODE/navsea_tile_builder.py" \
--source-root "$SOURCE" \
--reference-tile-root "$REFERENCE" \
--output "$PARTS/z9_10" \
--zmin 9 \
--zmax 10 \
--workers 1 \
--strip-legacy-japanese-delivery \
--release-minimal \
--fid-key 'thisMyWorld@2026' \
--bundle-id navsea-core
5.5 z11
$PY "$CODE/navsea_tile_builder.py" \
--source-root "$SOURCE" \
--reference-tile-root "$REFERENCE" \
--output "$PARTS/z11" \
--zmin 11 \
--zmax 11 \
--workers 1 \
--strip-legacy-japanese-delivery \
--release-minimal \
--fid-key 'thisMyWorld@2026' \
--bundle-id navsea-core
5.6 z12
$PY "$CODE/navsea_tile_builder.py" \
--source-root "$SOURCE" \
--reference-tile-root "$REFERENCE" \
--output "$PARTS/z12" \
--zmin 12 \
--zmax 12 \
--workers 1 \
--strip-legacy-japanese-delivery \
--release-minimal \
--fid-key 'thisMyWorld@2026' \
--bundle-id navsea-core
如需四段并行,应分别保存日志并检查每个命令的退出状态。不能仅根据目录里已经出现 PBF 就判断任务完成。
6. 分片验收与合并
6.1 检查 mapping audit
每个分片会在其父目录生成对应的 mapping audit 文件。必须检查:
- 构建进程正常退出
written数量符合对应 zoom 范围- 没有影响交付字段的 unresolved mapping
- 没有异常大批量 skipped tile
6.2 合并候选根目录
mkdir -p "$CANDIDATE"
cp -a "$PARTS/z0_8/." "$CANDIDATE/"
cp -a "$PARTS/z9_10/." "$CANDIDATE/"
cp -a "$PARTS/z11/." "$CANDIDATE/"
cp -a "$PARTS/z12/." "$CANDIDATE/"
这些分片的 zoom 范围互不重叠,合并时不应出现同路径覆盖冲突。
6.3 检查瓦片数量
find "$CANDIDATE" -type f -name '*.pbf' -printf '%P\n' |
awk -F/ '{count[$1]++} END {for (z in count) print "z" z "=" count[z]}' |
sort -V
当前基线期望:
| Zoom | 瓦片数 |
|---|---|
0 |
1 |
5 |
10 |
6 |
27 |
7 |
76 |
8 |
230 |
9 |
813 |
10 |
3156 |
11 |
12279 |
12 |
48556 |
| 合计 | 65148 |
当前数据库没有 z1-z4 对应的受支持输出,因此最终目录中没有这些 zoom 的 PBF。
7. 交付审计
审计顺序必须保持:
- 对象保真审计
- 渲染与 geometry / extent 审计
- AOI / 人工视觉审计
不能因为画面看起来接近,就跳过对象和几何门禁。
7.1 Geometry / Extent 审计
cd "$REPO"
$PY navsea_geometry_native_audit.py \
--target-root "$CANDIDATE" \
--label full-rebuild-candidate \
--output-dir report/full_rebuild_candidate_geometry
重点检查:
source_extent_mismatch_tiles = 0- 不出现历史上的
extent=4096错退 - 高精度 tile 继续保持原始 source 的
extent=1048576 - 不出现旧坏片式的大范围几何错移
坐标超 extent 本身不一定是错误。必须结合 source extent 和原始 tile 对照判断。
7.2 与当前基线做结构比较
不要只比较 SHA256。推荐逐瓦片解码后比较:
- layer 集合
- layer extent
- feature 数量
- feature geometry
- 标准化后的 properties
- NavSea FID
对结构差异必须输出具体 z/x/y、layer 和 feature 锚点,不能只给一个全局差异数量。
7.3 全国 AOI 视觉审计
候选目录需要可通过 HTTP 访问,例如:
http://192.168.200.184/pbf-delivery-full-rebuild-candidate/{z}/{x}/{y}.pbf
通过 compare 页的临时覆盖参数审计候选包:
$PY navsea_full_aoi_visual_audit.py \
--compare-url 'http://192.168.200.184/newpec/navsea-compare-full-audit.html?deliveryTileUrl=http%3A%2F%2F192.168.200.184%2Fpbf-delivery-full-rebuild-candidate%2F%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf' \
--variant full \
--output-dir report/full_rebuild_candidate_visual
人工复核至少覆盖:
- 博多港
- 唐津
- 东京湾
- 大阪湾
- 冲绳
z10z12
重点确认:
- 没有大片空白
- 岛屿、岸线和危险物没有错位
- 安全图标和关键文字没有缺失
- 点击拾取仍能定位到正确对象
8. 发布切换
所有审计通过前,不修改正式 style,不覆盖当前基线。
推荐发布方式:
- 保留当前
/home/wwwroot/pbf-delivery-full-20260418-rebuild - 将候选目录部署为带新日期或版本号的正式目录
- 更新 extentfix style 的 tile URL
- 更新全国 compare 页可见版本字符串
- 部署 style 和 compare 页
- 清缓存后再次完成固定 AOI 人工确认
- 在
STEP_RECORD.md记录新目录、版本、审计报告和切换时间
只有明确要求原路径替换时,才对 pbf-delivery-full-20260418-rebuild 做原子目录切换。切换前必须保留可快速回退的旧目录。
9. 历史脚本的职责边界
navsea_tile_builder.py
全国 Full PBF 的核心生成器。
负责:
- 从原始 PBF 读取几何与原始 feature
- 从 MySQL 读取语义投影
- 应用 NavSea mapping registry
- 输出 delivery layer、标准字段和 NavSea FID
navsea_rebuild_hotspot_tiles.py
只用于固定 AOI 热点重建和问题定位。
它不是全国 Full PBF 的正式生成 pipeline,不能用它代替本文的全国分片重建。
navsea_geometry_native_audit.py
负责 geometry、extent 和 native 风险审计。
navsea_full_aoi_visual_audit.py
负责全国固定 AOI 的浏览器截图和视觉 diff。
10. 节点结论
以后需要重新生成全国 Full PBF 时,以本文作为入口节点。
固定重建要素为:
代码节点:6d72340
数据库:pbf_analysis 当前确认未修改的数据
规则包:navsea-core
原始 PBF:newpec-mvt-20260106
reference footprint:pbf-delivery-full-20260415
生成方式:四段分片重建后合并
审计顺序:对象保真 → 渲染/几何 → AOI 视觉
如果上述任一输入发生变化,生成结果应视为新的全国版本,不能继续沿用 20260418-rebuild 的版本含义。