114 lines
1.7 KiB
Markdown
114 lines
1.7 KiB
Markdown
# NavSea Weather Server
|
|
Task: WeatherServer_Pipeline
|
|
Architecture: NavSea V11
|
|
Codex: codex6
|
|
Status: TODO
|
|
|
|
---
|
|
|
|
# 1 任务目标
|
|
|
|
创建 Weather Pipeline。
|
|
|
|
Pipeline 负责自动执行整个天气数据生产流程:
|
|
|
|
Downloader
|
|
→ Grid Builder
|
|
→ Vector Tile Generator
|
|
|
|
输入:
|
|
|
|
NOAA GFS
|
|
|
|
输出:
|
|
|
|
/weather/{time}/{z}/{x}/{y}.pbf
|
|
|
|
用于 NavSea 客户端加载天气图层。
|
|
|
|
---
|
|
|
|
# 2 Pipeline 结构
|
|
|
|
weather_server/
|
|
|
|
downloader/
|
|
grid/
|
|
tiles/
|
|
pipeline/
|
|
|
|
创建文件:
|
|
|
|
weather_server/pipeline/weather_pipeline.py
|
|
|
|
---
|
|
|
|
# 3 Pipeline 执行流程
|
|
|
|
step1 下载 GRIB
|
|
|
|
step2 生成 Weather Grid
|
|
|
|
step3 生成 Vector Tiles
|
|
|
|
---
|
|
|
|
# 4 创建 Pipeline 文件
|
|
|
|
weather_server/pipeline/weather_pipeline.py
|
|
|
|
---
|
|
|
|
# 5 实现代码
|
|
|
|
```python
|
|
import os
|
|
import subprocess
|
|
import time
|
|
|
|
DOWNLOADER = "weather_server/downloader/gfs_downloader.py"
|
|
GRID_BUILDER = "weather_server/grid/grid_builder_v2.py"
|
|
TILE_GENERATOR = "weather_server/tiles/vector_tile_generator.py"
|
|
|
|
|
|
def run_step(name, script):
|
|
|
|
print("\n==========================")
|
|
print("Running:", name)
|
|
print("==========================\n")
|
|
|
|
start = time.time()
|
|
|
|
result = subprocess.run(
|
|
["python", script],
|
|
capture_output=True,
|
|
text=True
|
|
)
|
|
|
|
print(result.stdout)
|
|
|
|
if result.returncode != 0:
|
|
print("ERROR:", result.stderr)
|
|
raise RuntimeError(name + " failed")
|
|
|
|
end = time.time()
|
|
|
|
print("\nFinished:", name)
|
|
print("Time:", round(end-start,2),"seconds")
|
|
|
|
|
|
def main():
|
|
|
|
print("\nNavSea Weather Pipeline\n")
|
|
|
|
run_step("Downloader", DOWNLOADER)
|
|
|
|
run_step("Grid Builder", GRID_BUILDER)
|
|
|
|
run_step("Vector Tile Generator", TILE_GENERATOR)
|
|
|
|
print("\nWeather pipeline completed.\n")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |