# NavSea Weather Server V1 设计文档 Architecture: NavSea V11 Codex: codex6 Component: Weather Server Version: Draft v1 --- # 1 设计目标 NavSea Weather Server 负责: 1 下载气象 GRIB 数据 2 解析 GRIB 数据 3 生成天气网格数据 4 生成 Vector Tile (PBF) 5 通过 HTTP 提供 tile 服务 系统原则: - 客户端不解析 GRIB - 所有计算在服务器完成 - 客户端只加载 Vector Tile - 数据结构稳定可扩展 - 支持未来 routing 算法 技术栈: Python + Nginx --- # 2 系统总体架构 系统分为两个主要组件: Weather Processing System Tile HTTP Server 架构: GRIB Source │ ▼ Downloader │ ▼ GRIB Parser │ ▼ Grid Builder │ ▼ Tile Generator │ ▼ Tile Storage │ ▼ Nginx HTTP Service │ ▼ NavSea Client --- # 3 技术栈 Python版本: Python 3.11+ Python库: cfgrib xarray numpy mercantile mapbox-vector-tile shapely Web服务器: Nginx 任务调度: cron --- # 4 项目目录结构 weather_server/ config/ config.py downloader/ gfs_downloader.py grib/ grib_parser.py grid/ grid_builder.py tiles/ tile_generator.py pipeline/ pipeline.py utils/ geo_utils.py data/ grib/ grid/ output/ weather_tiles/ --- # 5 数据目录 GRIB 下载目录: data/grib/ 示例: gfs_20260312_00.grib Grid 中间数据: data/grid/ 示例: grid_20260312_00.json Vector Tile 输出: output/weather_tiles/ 结构: /weather_tiles/{time}/{z}/{x}/{y}.pbf 示例: weather_tiles/20260312_12/4/10/7.pbf --- # 6 GRIB 下载模块 模块: downloader/gfs_downloader.py 职责: 从 NOAA GFS 下载 GRIB 文件。 下载参数: 分辨率: 0.25° 区域: 120E – 150E 20N – 50N 预测时间: 0h 3h 6h 9h 12h 24h 48h 72h 输出: data/grib/ --- # 7 GRIB 解析模块 模块: grib/grib_parser.py 职责: 解析 GRIB 数据。 读取字段: UGRD VGRD HTSGW DIRPW PERPW APCP TMP PRMSL 输出: grid 数据结构。 示例: { "lat": 34.5, "lon": 138.2, "wind_u": -3.2, "wind_v": 4.1, "wave_h": 2.4, "wave_dir": 210, "wave_period": 9, "rain": 0.2, "temp": 21, "pressure": 1012 } --- # 8 Grid Builder 模块: grid/grid_builder.py 职责: 构建统一天气网格。 网格间距: 0.25° grid 示例: 120 × 120 输出: data/grid/ 格式: JSON 示例: grid_20260312_12.json --- # 9 Tile Generator 模块: tiles/tile_generator.py 职责: 生成 MapLibre Vector Tile。 Tile Layer: weather ├ wind ├ wave ├ rain ├ sst └ pressure --- # 10 Wind Layer Geometry: Point 属性: speed dir speed 由 U/V 分量计算: speed = sqrt(u² + v²) dir = atan2(u,v) --- # 11 Wave Layer Geometry: Point 属性: h dir p h 浪高 dir 浪方向 p 浪周期 --- # 12 Rain Layer Geometry: Point 属性: rain 单位: mm --- # 13 SST Layer Geometry: Point 属性: temp 单位: 摄氏度 --- # 14 Pressure Layer Geometry: Point 属性: pressure 单位: hPa --- # 15 Tile 坐标系统 使用: WebMercator tile库: mercantile Zoom级别: 2 4 6 8 --- # 16 Tile URL 结构 Nginx 提供: /weather/{time}/{z}/{x}/{y}.pbf 示例: /weather/20260312_12/4/10/7.pbf --- # 17 Tile 生成流程 tile_generator 处理流程: 加载 grid ↓ 计算 tile bounds ↓ 筛选 grid 点 ↓ 生成 feature ↓ 编码 vector tile ↓ 写入 pbf --- # 18 Pipeline 模块: pipeline/pipeline.py 流程: download_grib ↓ parse_grib ↓ build_grid ↓ generate_tiles 执行一次生成全部天气 tile。 --- # 19 定时任务 CRON: 每6小时执行: pipeline.py 示例: 30 0 * * * python pipeline.py 30 6 * * * python pipeline.py 30 12 * * * python pipeline.py 30 18 * * * python pipeline.py --- # 20 Nginx 配置 Nginx 直接提供 tile: location /weather/ { root /weather_server/output/weather_tiles; } --- # 21 数据量估算 日本区域: grid ≈ 120 × 120 points ≈ 14400 tile后: ≈ 2MB / 时间 72小时: ≈ 70MB --- # 22 系统扩展 未来可增加: 海流 Current 台风 Typhoon 等压线 等温线 风流动画 航线天气预测 --- # 23 下一开发阶段 下一阶段任务: 1 环境安装 2 GRIB 下载模块 3 GRIB 解析模块 4 Grid Builder 5 Tile Generator 6 Pipeline 7 Nginx 部署