# NavSea coast_wall_z12.bin 生成说明 本文说明如何从当前 MySQL 三层格子生成 `coast_wall_z12.bin`。 生成脚本: - [`coastline/build_coast_wall_z12_bin.py`](/root/sourceserver/pbf/coastline/build_coast_wall_z12_bin.py) 当前输入数据库: - `navsea_japan_coast_grid` 当前输入表: - `navsea_grid_cell` ## 1. 设计口径 这个 bin 文件不是重新从原始海岸线矢量或 PBF 几何开始栅格化。 当前口径是: 1. 先使用数据库里已经生成好的三层格子 2. 再按 `density_overview_grid` 的密度优先级融合 3. 最后编码成 z12 / 40x40 的 blocked wall 二进制文件 三层输入: - `fish_port_20m` - `hazard_50m` - `coast_200m` 融合规则: - `20x20` 永远保留 - `50x50` 如果和已保留的 `20x20` 重叠,则跳过 - `200x200` 如果和已保留的 `20x20` 或已保留的 `50x50` 重叠,则跳过 这和 `density_overview_grid.geojson` 的规则一致:同一区域优先使用更高密度格子,避免重复表达同一片阻断区域。 ## 2. bin 格式 输出 bin 用于快速查询: ```text isBlocked(lon, lat) -> bool ``` 空间划分: - zoom:`z12` - 每个 z12 tile 切成 `40 x 40` - 每个 tile 最多 `1600` 个 cell tile 内编码: - blocked cell 数量 `<= 96`:使用 sparse `uint16[]` - blocked cell 数量 `> 96`:使用 bitset `uint32[50]` 文件结构: - Header - BlockDirectory - TileDirectory - DataBlob 这个结构的目的主要是节约物理存储空间,同时让运行时可以按 block / tile 做快速查询。 ## 3. 九州测试生成 推荐先生成九州范围样例: ```bash cd /root/sourceserver/pbf ./.venv/bin/python coastline/build_coast_wall_z12_bin.py \ --preset kyushu \ --out out/navmask/coast_wall_z12_kyushu.bin \ --debug-geojson out/navmask/coast_wall_z12_kyushu.debug.geojson \ --debug-limit 2000 ``` 输出文件: - `out/navmask/coast_wall_z12_kyushu.bin` - `out/navmask/coast_wall_z12_kyushu.bin.meta.json` - `out/navmask/coast_wall_z12_kyushu.debug.geojson` 当前九州样例统计: ```text tiles=813 cells=148453 sparse=351 bitset=462 blocks=7 size=122625 bytes ``` ## 4. 小范围 smoke test 可以用福冈附近小范围做快速验证: ```bash cd /root/sourceserver/pbf ./.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 ``` 这个命令会: - 跑内置编码自测 - 生成小范围 bin - 用内置 reader 查询 `130.4,33.6` 当前验证结果: ```text query lon=130.4 lat=33.6 blocked=True ``` ## 5. 全国生成 全国生成命令: ```bash cd /root/sourceserver/pbf ./.venv/bin/python coastline/build_coast_wall_z12_bin.py \ --preset all \ --out out/navmask/coast_wall_z12.bin ``` 如果需要 debug GeoJSON,可以追加: ```bash --debug-geojson out/navmask/coast_wall_z12.debug.geojson \ --debug-limit 5000 ``` 全国生成会扫描完整三层数据库,耗时和内存都会高于九州样例。 ## 6. 参数说明 常用参数: - `--preset kyushu`:生成九州范围样例,默认值 - `--preset all`:生成全国范围 - `--bbox min_lon,min_lat,max_lon,max_lat`:自定义经纬度范围,优先于 `--preset` - `--out PATH`:输出 bin 路径 - `--meta-json PATH`:输出 meta JSON;不指定时默认写到 `.meta.json` - `--debug-geojson PATH`:输出抽样 blocked cell GeoJSON - `--debug-limit N`:debug GeoJSON 最多输出多少个 cell - `--query lon,lat`:生成后用内置 reader 查询一个点 - `--self-test`:执行基础编码自测 - `--progress-every N`:每读取 N 行打印一次进度,设为 `0` 可关闭 查看帮助: ```bash cd /root/sourceserver/pbf ./.venv/bin/python coastline/build_coast_wall_z12_bin.py --help ``` ## 7. 输出 meta 生成器会写出 meta JSON,包含: - 生成时间 - 数据库名 - bbox / preset - z12 cell 大小 - density 融合规则 - 三层源数据行数 - 三层去重后数量 - 三层保留 / 跳过统计 - bin 文件大小 - block / tile / sparse / bitset 统计 - 可选 query 查询结果 示例: - `out/navmask/coast_wall_z12_kyushu.bin.meta.json` ## 8. 当前验证项 脚本内已包含: - `tileId` pack / unpack - `cellId` pack - `blockId` pack - sparse encode - bitset encode - writer / reader 抽样 roundtrip - `is_blocked_lonlat()` 查询 已验证命令: ```bash cd /root/sourceserver/pbf ./.venv/bin/python -m py_compile coastline/build_coast_wall_z12_bin.py ./.venv/bin/python coastline/build_coast_wall_z12_bin.py --help ./.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 ```