Initial import

This commit is contained in:
OpenAI Codex
2026-03-17 19:52:51 +08:00
commit c957fef15b
39 changed files with 7108 additions and 0 deletions

513
docs/Architecture.md Normal file
View File

@@ -0,0 +1,513 @@
# 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 部署