# 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 部署