# NavSea 任务说明(codex6 / V11) ## 任务名称 日本全国海岸线硬阻塞栅格预处理(GSI 基盤地図情報版) ## 任务编号 NAVSEA-TASK-COASTLINE-GRID-JP-001 ## 任务状态 待实现 ## 任务目标 基于日本国土地理院(GSI)提供的**基盤地図情報(FGD)海岸线数据**,构建一套可离线预处理的日本全国海域**200m × 200m 硬阻塞栅格底库**,供 NavSea 路由系统直接使用。 本任务只解决以下问题: - 将日本陆地 / 海岸线转化为路由可直接查询的硬阻塞格网; - 为后续叠加浅滩、禁航区、桥梁净空、港内限制区等语义层提供统一栅格基底; - 避免运行时直接依赖 MapLibre 的 MVT/PBF 做判障。 本任务**不**解决以下问题: - 不生成可显示用的地图瓦片; - 不替代官方航海图或 ENC; - 不在本阶段判断“安全可航行水深”; - 不在本阶段实现潮汐相关动态可航行性; - 不在本阶段实现最终航线规划器。 --- ## 业务背景 当前 NavSea 项目中的 PBF 为 **MapLibre 使用的矢量瓦片 PBF(MVT)**,适合显示,不适合作为全国统一的分析型原始数据库直接做路径判障。 因此需要额外建立一套**Routing Grid 预处理管线**: ```text GSI 海岸线 / 其他航海语义数据 -> 几何清洗与统一投影 -> 障碍膨胀(buffer) -> 200m fishnet 栅格化 -> 二进制 / 分块索引输出 -> NavSea 路由核心直接查询 ``` 本任务是该预处理体系中的第一阶段: > 先用官方海岸线把“陆地绝对不可通行”这件事做对。 --- ## 数据来源与现实约束 ### 主数据源 日本国土地理院(GSI)基盤地図情報(FGD)中的海岸线数据。 已确认事实: - GSI 基盤地図情報站点明确列出“海岸線”为可下载项; - 下载服务需要用户注册并登录; - 海岸线属于基盤地図情報的法定基础项之一; - 精度说明为:城市区域约 1:2500 级别,其它区域约 1:25000 级别; - 下载服务提供 JPGIS(GML)形式; - 提供文件按区域网格切分,文件命名规则中 `ss=02` 对应海岸线。 - 已经下载在目录里了。 ### 备选/补充数据源 国土数值信息(KSJ)海岸线数据可作为补充属性源,但其页面说明: - 最新数据作成年度为 2006 年度; ### 使用约束 本任务默认目标是: - 在 NavSea 内部离线预处理使用; - 不在仓库中直接提交受许可限制的原始 GSI 数据; - 原始下载数据路径加入 `.gitignore`; --- ## 本任务的成功标准 完成后,系统应具备以下能力: 1. 可以从本地 GSI 海岸线原始数据目录读取全国数据; 2. 可以统一转换为 NavSea 内部标准几何坐标体系; 3. 可以生成经过安全膨胀的硬阻塞面; 4. 可以按固定 origin 生成 200m × 200m 的全国海域格网; 5. 可以将与硬阻塞面相交的格子标记为 `hardBlocked = true`; 6. 可以导出供运行时快速查询的二进制结果; 7. 生成过程支持分块处理、断点重建、日志输出与结果校验; 8. 不依赖 MapLibre 前端进行任何运行时几何判障。 --- ## 范围定义 ### In Scope - GSI 海岸线数据下载后的本地导入与解析; - GML -> 内部几何数据转换; - 海岸线质量检查、闭合/拼接/拓扑清洗; - 海岸线转陆地硬阻塞面; - 陆地障碍安全 buffer; - 全国 200m 栅格生成; - 格子状态计算; - 分块导出二进制格网; - 校验工具与统计输出; - 针对东京湾 / 大阪湾 / 北海道沿岸的抽样验收。 ### Out of Scope - 水深区、浅滩、礁石、干出区、桥梁净空; - 港口规则、禁航区、养殖区; - 潮汐动态更新; - 路由算法本体; - UI 显示层改造; - 在线下载 GSI 数据功能。 --- ## 输入与输出定义 ### 输入 1. GSI 基盤地図情報原始下载目录(本地,不入库) 2. 配置文件: - 输入目录 - 输出目录 - 目标区域 bbox - 栅格尺寸(默认 200m) - 安全 buffer 距离 - 投影方案 3. 日本区域边界配置 4. 船舶安全参数(本任务中仅使用岸线横向安全余量) ### 输出 1. `routing-grid-jp-coast-v1.bin` 2. `routing-grid-jp-coast-v1.index.json` 3. `routing-grid-jp-coast-v1.meta.json` 4. 校验报告: - 总格子数 - 被阻塞格子数 - 未知格子数 - 各分块统计 5. 抽样 PNG / GeoJSON 调试输出(仅调试用途) --- ## 栅格语义定义 本任务只定义第一版最小语义: ```text CellState: 0 = UNKNOWN 1 = NAVIGABLE_CANDIDATE 2 = HARD_BLOCKED ``` 说明: - `UNKNOWN`:未纳入当前处理范围或缺少足够信息; - `NAVIGABLE_CANDIDATE`:当前阶段未发现岸线硬阻塞,仅表示“未被岸线阻塞”,不代表安全可航行; - `HARD_BLOCKED`:与陆地 / 经膨胀后的海岸硬阻塞面相交,禁止通行。 ### 最低字段设计 建议每个格子最终至少具备以下字段: ```text struct CoastGridCellV1 { uint8 state; // 0 unknown, 1 candidate, 2 hard_blocked uint8 sourceMask; // bit mask,当前阶段至少标记 GSI_COASTLINE uint16 blockedPermille; // 0..1000,表示障碍覆盖率千分比 } ``` 备注: - 本阶段不要过早把格式做复杂; - 允许后续升级到 `GridCellV2/V3` 增加 depth / clearance / risk; - V11 阶段不得破坏已有读取接口,后续升级采用 wrapper 或版本扩展。 --- ## 技术设计原则 ### 1. 显示层与路由层分离 - MapLibre 的 MVT/PBF 继续只服务于显示; - 路由判障只读取预处理后的 routing grid; - 不允许运行时对 MVT 做空间判障。 ### 2. 先建立官方岸线“硬真值基底” - 以 GSI 海岸线为陆地硬阻塞基线; - MapLibre 中显示出来的岸线不得反向覆盖 routing 真值; - 后续其他语义层只能在该基底上叠加,不得削弱陆地阻塞语义。 ### 3. 所有距离计算使用米制坐标 - 不允许直接在经纬度下用近似角度长度做 200m 格网; - 统一先转换到米制坐标后再生成 fishnet; - 投影方案允许一期先用单一米制投影跑通,后续再按日本区域分带优化。 ### 4. 禁止中心点判障 - 不允许只用格子中心点判断是否阻塞; - 必须按面积相交比例判断; - 必须支持陆地障碍 buffer 后再相交。 ### 5. 支持分块处理 - 日本全国数据不得要求一次性整体载入内存; - 必须支持按区域块 / tile / mesh 批处理; - 必须允许断点续跑。 ### 6. 原始数据不入库 - 仓库中仅保留导入脚本、格式说明、配置模板; - 不提交 GSI 原始下载文件; - 若需要示例数据,仅保留极小匿名/脱敏调试切片(如许可允许)。 --- ## 推荐处理流程 ### 阶段 A:原始数据导入 目标:把 GSI 原始 GML 数据转成统一内部几何集合。 步骤: 1. 扫描输入目录,识别海岸线数据文件; 2. 解析文件名与区域标识; 3. 读取 GML 几何与属性; 4. 写入中间层(如 GeoPackage / FlatGeobuf / 临时二进制几何块)。 产出: - 标准化海岸线线要素集合; - 区域索引; - 导入日志。 ### 阶段 B:几何清洗与陆地阻塞面构造 目标:把原始海岸线转换为可用于判障的封闭障碍面。 步骤: 1. 统一坐标系; 2. 去除明显坏几何; 3. 线拼接与拓扑清洗; 4. 构造陆地区域面或沿岸阻塞面; 5. 对陆地边界做安全膨胀(buffer)。 注意: - 如果无法全国一次性可靠构造完整陆地面,可采用“海岸线 + 陆地方向约定 + 沿岸膨胀面”作为一期方案; - 二期再升级为完整 seam-less land polygon。 ### 阶段 C:生成 200m fishnet 目标:生成路由统一栅格索引。 步骤: 1. 确定全国处理范围 bbox; 2. 确定固定 grid origin; 3. 生成 200m × 200m 分块格网; 4. 给每格分配全局 `cellId` 或 `(gx, gy)`。 要求: - origin 固定,保证不同批次重建结果完全一致; - 必须能按区域分块增量重算。 ### 阶段 D:格子阻塞判定 目标:将海岸线障碍面落入格网。 推荐规则: ```text if blockedOverlapRatio > 0: state = HARD_BLOCKED else if insideCoverageArea: state = NAVIGABLE_CANDIDATE else: state = UNKNOWN ``` 更稳妥的建议: - 同时记录 `blockedPermille`; - 若后续发现边缘误判过多,可升级阈值为: - `> 20‰` 即 hard block; - 或与 buffer 配合后采用更保守规则。 ### 阶段 E:导出运行时格式 目标:让 NavSea 在运行时做到 O(1) 或近 O(1) 查询。 建议: - 按分块导出二进制; - 使用轻量索引文件记录块范围; - 运行时只加载当前位置邻近块。 --- ## 推荐目录结构(建议,不强制) ```text navsea/ tools/ chart-grid-builder/ src/ ingest/ normalize/ rasterize/ export/ validate/ config/ scripts/ README.md data/ generated/ routing-grid/ docs/ tasks/ NAVSEA-TASK-COASTLINE-GRID-JP-001.md ``` 说明: - 原始 GSI 数据目录不放入仓库; - 通过环境变量或本地配置指定; - 所有新 `.ts/.tsx` 文件必须遵守 NavSea 的 logger 初始化规则。 --- ## 配置建议 ### 配置文件建议字段 ```yaml jobName: jp-coast-grid-v1 input: gsiCoastRoot: /local/path/to/gsi/coast output: root: /local/path/to/output region: bbox: minLon: 122.0 minLat: 20.0 maxLon: 154.0 maxLat: 46.5 projection: mode: metric_projected grid: cellSizeMeters: 200 originX: 0 originY: 0 obstacle: coastBufferMeters: 50 processing: chunkSizeMeters: 20000 resume: true validation: sampleAreas: - tokyo_bay - osaka_bay - hokkaido_coast ``` 备注: - `coastBufferMeters` 需结合你的船长、定位误差、岸边保守量再定; - 一期可先用固定值,二期再改成基于船型配置。 --- ## 关键实现要求 ### 1. 导入器要求 - 能处理批量 GML; - 能输出导入统计; - 能跳过坏文件并记录错误; - 支持断点续跑。 ### 2. 几何模块要求 - 能统一投影; - 能做拓扑清洗; - 能做 buffer; - 能输出调试几何。 ### 3. 栅格模块要求 - 使用固定 grid origin; - 支持按 chunk 生成; - 可根据 bbox 仅重建局部区域; - 输出 deterministic 结果。 ### 4. 导出模块要求 - 文件格式需带版本号; - 必须包含元数据文件; - 元数据至少包含: - 版本 - 生成时间 - 输入数据摘要 - cellSize - bbox - 分块信息 - 统计信息 ### 5. 验证模块要求 - 生成统计摘要; - 支持抽样区域导出 GeoJSON/PNG 调试图; - 支持人工核查岸线附近格子是否被正确封堵。 --- ## 验收标准 ### 功能验收 1. 可从本地 GSI 数据生成至少一个样例区域的 200m 栅格; 2. 东京湾样例中,陆地区域相邻格子被正确标记为 `HARD_BLOCKED`; 3. 非陆地区域不会被大面积误封; 4. 相同输入重复运行结果一致; 5. 局部重建不会改变未涉及分块结果; 6. 运行时查询不依赖 GSI 原始数据与 MVT。 ### 数据验收 1. 输出包含版本与元数据; 2. 统计报告完整; 3. 至少完成三个区域的人工抽样检查: - 东京湾 - 大阪湾 / 濑户内海入口 - 北海道沿岸 ### 工程验收 1. 原始下载数据不进入 git; 2. 代码结构符合 V11; 3. 新增 `.ts/.tsx` 文件遵守 logger 初始化规则; 4. 不引入未知依赖; 5. 对外接口保持后续可扩展。 --- ## 风险与应对 ### 风险 1:海岸线无法直接构造成稳定陆地面 应对: - 一期先实现“海岸线 + buffer”阻塞带; - 二期再升级为完整 land polygon。 ### 风险 2:全国数据量导致内存占用过高 应对: - 强制 chunk 化处理; - 中间结果写盘; - 禁止一次性全量几何载入。 ### 风险 3:投影方案导致边缘区域误差不一致 应对: - 一期先统一米制投影跑通; - 二期再评估按区域分带; - 元数据中记录投影方案版本。 ### 风险 4:岸线细节不足导致近岸误判 应对: - 记录样例区域误差; - 后续叠加港口高精层或局部更高精数据; - 不将 `NAVIGABLE_CANDIDATE` 误解为真实安全通航。 ### 风险 5:许可边界不清 应对: - 明确原始数据不入库; - 在 docs 中记录数据来源与许可审查待办; - 若未来要发布生成结果,单独评估。 --- ## 分阶段实施计划 ### Phase 1:最小可运行样例 目标:跑通单一区域。 交付: - GSI 海岸线导入器 - 投影转换 - 200m 栅格生成 - `hardBlocked` 判定 - 东京湾样例输出 ### Phase 2:全国化与分块化 目标:支持全国离线构建。 交付: - 分块处理 - 断点续跑 - 二进制导出 - 索引文件 - 统计报告 ### Phase 3:质量提升 目标:提高近岸判障质量。 交付: - 岸线拓扑清洗增强 - 更稳妥的陆地面构造 - 局部高风险区域人工校验工具 ### Phase 4:为后续航海语义层预留接口 目标:让后续浅滩/限制区/桥梁等数据可无缝叠加。 交付: - `GridCellV2` 设计草案 - source mask 扩展规则 - depth / clearance / risk 预留位设计 --- ## 对 Codex 的具体执行要求 ### 规则 1:遵守 NavSea V11 宪章 - 不破坏现有架构; - 不在显示层混入路由判障逻辑; - 不直接修改 MapLibre 数据消费方式来偷跑此功能; - 以独立预处理模块实现。 ### 规则 2:遵守现有协作流程 - 新文件:由实现方直接给出文件路径和完整代码; - 旧文件:必须先读取用户提供的当前版本,再给完整替换版本; - 不只给片段补丁; - 不臆测未提供的项目结构。 ### 规则 3:版本标识 - 每个完整替换文件头部必须带明确版本注释; - 建议统一使用如 `v11.x-coast-grid` 标识。 ### 规则 4:日志要求 - 每个新增 `.ts/.tsx` 文件顶部必须加入 NavSea 规定的 logger 初始化; - 日志要覆盖:导入、分块处理、异常、统计输出。 ### 规则 5:不要引入未知重依赖 - 优先使用现有项目依赖与成熟轻量方案; - 若确需增加 geospatial 依赖,必须先说明必要性、体积和运行影响。 --- ## 建议的首批交付文件(示意,不代表固定路径) ```text /tools/chart-grid-builder/src/config/CoastGridJobConfig.ts /tools/chart-grid-builder/src/ingest/GsiCoastlineScanner.ts /tools/chart-grid-builder/src/ingest/GsiCoastlineParser.ts /tools/chart-grid-builder/src/normalize/CoastlineNormalizer.ts /tools/chart-grid-builder/src/normalize/CoastObstacleBuilder.ts /tools/chart-grid-builder/src/rasterize/FishnetGrid.ts /tools/chart-grid-builder/src/rasterize/CoastGridRasterizer.ts /tools/chart-grid-builder/src/export/CoastGridBinaryWriter.ts /tools/chart-grid-builder/src/validate/CoastGridValidator.ts /tools/chart-grid-builder/src/cli/buildJapanCoastGrid.ts /docs/tasks/NAVSEA-TASK-COASTLINE-GRID-JP-001.md ``` --- ## 非功能要求 - 可重复构建; - 结果确定性; - 可追踪元数据; - 支持未来增量升级; - 输出格式稳定; - 允许未来按海区局部重建。 --- ## 备注 1. 本任务是“全国路由底库”的起点,不是最终航海安全判定系统; 2. `NAVIGABLE_CANDIDATE` 只是“未被海岸线阻塞”,不是“确认可安全航行”; 3. 后续必须叠加至少以下层才能形成更可靠的海上路由基础: - 浅水 / 水深层 - 干出区 - 礁石 / 危险物 - 桥梁净空 - 禁航区 / 受限区 - 港内限制区 - 养殖区 / 网具区 --- ## 参考资料(供实现时核对) - GSI 基盤地図情報站点:明确基盤地図情報可下载,且需要注册登录。 - GSI 基盤地図情報说明:海岸线属于法定基础项之一。 - GSI 下载服务:海岸线为可选下载项。 - GSI FAQ / Help:下载服务为注册制,基本项下载为 JPGIS(GML)形式。 - GSI 文件命名规则:提供类编号 `02` 对应海岸线。 - GSI 数值地图(国土基本信息)说明:城市区域约 1:2500,其它区域约 1:25000 级精度。 - KSJ 海岸线数据页:可作补充参考,但年度老且页面标示非商用。 --- ## 完成定义(Definition of Done) 当且仅当以下条件同时满足时,本任务可标记完成: 1. 样例区域可以从 GSI 原始数据成功生成 200m 海岸硬阻塞格网; 2. 全国构建流程可运行并支持分块; 3. 输出带版本号、元数据与统计; 4. 东京湾 / 大阪湾 / 北海道沿岸完成抽样验证; 5. 运行时可仅依赖生成后的 grid 查询,不再读取 GSI 原始数据与 MVT 判障; 6. 实现过程遵守 NavSea V11、codex6、logger、完整替换文件等协作规则。