Files
pbf/NavSea_coast_wall_z12_bin_生成说明.md

207 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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;不指定时默认写到 `<out>.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
```