系统架构

生产环境为单 Docker 镜像(linux/amd64):FastAPI 托管 API + 静态前端 + Redis 缓存。预测编排由 predictor.py 统一完成;点位 ML 模型与景区 JSON 打包在镜像内,标注库持久化在 Docker 卷。

整体架构

Vue3 前端主应用 · 标注页
Meteogram · 分享
FastAPIpredictor 编排
规则 · ML 融合 · 场景
外部数据Open-Meteo
Himawari · 天地图 POI
浏览器 (Vue3)
  ├─ POST /api/predict          → predictor.py
  ├─ GET  /api/spots/search     → 精选景区 JSON(70+ 点)
  ├─ POST /api/share            → 分享快照 + OG/长图渲染
  ├─ POST /api/advisory         → AI 出行解读(可选)
  └─ 天地图 POI / 底图           → 浏览器直连

predictor.py
  ├─ score_cloudsea (规则 + Type A/B/水体)
  ├─ cloudsea_ml v7 (03–07 点融合 · precursor 12h 特征)
  ├─ prediction_feedback (访问快照 · 异步写 log)
  ├─ build_scenario (日出云海 / 晴日日出…)
  └─ Himawari 卫星轻量校正(当天已发生时段)

Open-Meteo 主站不可达时 → Historical Forecast API 回退

预测流水线

  1. 按观景点 WGS84 坐标拉取 Open-Meteo 5 天逐小时场(含 850/925/700 hPa)。
  2. DEM 地形:海拔窗、日出方位剖面、可选 local_water 近库水体。
  3. 逐小时规则评分;03:00–07:00 且 ML 激活时按 precursor 12h + dawn 日特征融合 ML 概率(v7)。
  4. 输出综合场景标签与日出/云海双概率。
  5. 可选 Himawari 红外区域云量校正。

标注 · ML · 预测反馈闭环

label.html 人工标注
    ↓
cloudsea.db (SQLite 持久化卷)
    ↓
backfill_meteo_hourly → train_cloudsea_model (--window v7)
    ↓
spot 模型 pkl → Docker 镜像 / 热补丁
    ↓
线上 03–07 融合预测
    ↓
/api/predict 访问快照 → prediction_access_log
    ↓
reconcile_outcomes → forecast vs 实况 → 标注页历史面板

核心 API

GET  /api/spots/search?q=…
POST /api/predict  { lat, lng, elevation, spot_id, viewpoint_id }
GET  /api/meteo/profile?…
GET  /api/satellite/cloud?…
POST /api/share
GET  /api/share/{id}/og.png
GET  /api/share/{id}/image.png
POST /api/advisory
GET  /health

部署拓扑

docker-compose.prod.yml
├── yunhai (yunhai:latest)  :8088→8080
│   ├── /app/static          前端 dist + docs
│   ├── /app/data/scenic-spots  精选景区 JSON
│   └── volumes: cloudsea_data, analytics_data
└── redis:6379               预报 / 海拔缓存