4.4 KiB
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 部署