511 lines
14 KiB
Markdown
511 lines
14 KiB
Markdown
# 洪涝灾害分析模块工程交接文档
|
||
|
||
日期:2026-06-02
|
||
面向对象:算法工程师、后端工程师
|
||
范围:新洪涝灾害分析模块 `/flood/*`,不包含旧兼容 `/water/*` 页面和接口。
|
||
|
||
## 1. 当前定位
|
||
|
||
系统现在把洪涝分析拆成两层:
|
||
|
||
1. 工程层:负责数据入库、场景标准化、任务队列、状态更新、预览上图、套合分析、产品登记。
|
||
2. 算法层:只负责从标准化 SAR GeoTIFF 生成水体/洪涝分类栅格,并返回面积、像元数、阈值、模型信息等元数据。
|
||
|
||
后续算法优化应尽量只替换或新增 processor,不要绕开现有 `SARSceneGeoORM`、`WaterExtractionORM`、`FloodDetectionORM` 和任务队列。
|
||
|
||
## 2. 关键代码入口
|
||
|
||
| 职责 | 文件 |
|
||
| --- | --- |
|
||
| 洪涝 API 路由 | `backend/app/routers/flood.py` |
|
||
| 洪涝业务编排 | `backend/app/services/flood_analysis_service.py` |
|
||
| 后台任务执行 | `backend/app/services/job_handlers.py` |
|
||
| analysis-ready GeoTIFF 注册 | `backend/app/services/sar_analysis_ready_service.py` |
|
||
| 当前水体提取算法 | `backend/app/services/water_detect_service.py` |
|
||
| 水体 processor 包装 | `backend/app/services/water_extraction_service.py` |
|
||
| 当前洪涝变化检测算法 | `backend/app/services/flood_detection_service.py` |
|
||
| 洪涝矢量化与套合 | `backend/app/services/flood_overlay_service.py` |
|
||
| 洪涝产品登记 | `backend/app/services/flood_product_service.py` |
|
||
| 前端工作台 | `frontend/src/FloodAnalysisWorkspace.jsx` |
|
||
| 前端 API | `frontend/src/api/flood.js` |
|
||
|
||
旧 `/water/*` 路由仍在,但只作为历史兼容,不作为新算法接入目标。
|
||
|
||
## 3. 数据模型
|
||
|
||
### 3.1 SARSceneGeoORM
|
||
|
||
表:`sar_scene_geo`
|
||
|
||
这是算法输入场景表。每条记录对应一景已标准化的 SAR 分析影像。
|
||
|
||
关键字段:
|
||
|
||
| 字段 | 含义 |
|
||
| --- | --- |
|
||
| `radar_data_id` | 关联源影像 `radar_data.id` |
|
||
| `analysis_tif_path` | 算法统一输入,单波段 GeoTIFF |
|
||
| `analysis_dir` | analysis-ready 目录 |
|
||
| `analysis_preview_path` | 场景预览 PNG |
|
||
| `analysis_engine` | 标准化引擎,如 `gf3_sarscape`、`gf3_gdal`、`lt_gamma` |
|
||
| `analysis_profile` | 标准化 profile |
|
||
| `analysis_backscatter_unit` | 后向散射单位,如 `sigma0_db`、`unknown` |
|
||
| `analysis_quality_json` | 栅格尺寸、范围、nodata、采样统计 |
|
||
| `pixel_size_m` | 近似像元大小 |
|
||
| `status` | `PENDING/RUNNING/DONE/FAILED` |
|
||
|
||
当前 GF3 SARscape 链路会先产出原生 `_geo` ENVI 二进制,再由平台转换为 `D:\production_results\gf3\standard_l2` 下的 GeoTIFF,并注册到这里。
|
||
|
||
### 3.2 WaterExtractionORM
|
||
|
||
表:`water_extractions`
|
||
|
||
用于单景水体提取。
|
||
|
||
关键字段:
|
||
|
||
| 字段 | 含义 |
|
||
| --- | --- |
|
||
| `scene_id` | 输入场景 |
|
||
| `processor` | 算法名称,当前默认 `otsu` |
|
||
| `input_path` | 实际输入 GeoTIFF |
|
||
| `output_path` | 输出水体掩膜 GeoTIFF |
|
||
| `preview_path` | 预留,目前预览按需渲染 |
|
||
| `vector_path` | 预留,用于未来水体矢量 |
|
||
| `water_area_km2` | 水体面积 |
|
||
| `water_pixel_count` | 水体像元数 |
|
||
| `threshold_value` | 阈值或模型置信阈值 |
|
||
| `metadata_json` | 算法元数据 |
|
||
| `status/error_msg/task_id` | 任务状态 |
|
||
|
||
### 3.3 FloodDetectionORM
|
||
|
||
表:`flood_detections`
|
||
|
||
用于灾前/灾后两景洪涝变化检测。
|
||
|
||
关键字段:
|
||
|
||
| 字段 | 含义 |
|
||
| --- | --- |
|
||
| `pre_scene_id` | 灾前场景 |
|
||
| `post_scene_id` | 灾后场景 |
|
||
| `output_dir` | 输出目录,默认 `WATER_RESULTS_DIR/flood_{id}` |
|
||
| `classified_path` | 分类结果 GeoTIFF |
|
||
| `flood_area_km2` | 新增洪涝面积 |
|
||
| `stable_water_area_km2` | 稳定水体面积 |
|
||
| `status/error_msg` | 任务状态 |
|
||
|
||
分类图当前约定:
|
||
|
||
| 值 | 类别 | 前端颜色 |
|
||
| ---: | --- | --- |
|
||
| 0 | nodata | 透明 |
|
||
| 1 | stable_water | 蓝色 |
|
||
| 2 | flood | 红色 |
|
||
| 3 | high_backscatter | 橙色 |
|
||
| 4 | non_water | 灰色 |
|
||
|
||
## 4. 现有业务流程
|
||
|
||
### 4.1 单景水体提取
|
||
|
||
流程:
|
||
|
||
```text
|
||
前端选择 SARSceneGeo
|
||
-> POST /flood/water-extractions { scene_id }
|
||
-> 创建 WaterExtractionORM(PENDING)
|
||
-> 创建 SystemJob: WATER_DETECT
|
||
-> job_handlers._handle_water_detect
|
||
-> water_extraction_service.run_otsu_water_extraction
|
||
-> water_detect_service.run_water_detection
|
||
-> 写 water_mask.tif
|
||
-> 更新 WaterExtractionORM 为 DONE/FAILED
|
||
-> 前端 GET /flood/water-extractions/{id}/preview 上图
|
||
```
|
||
|
||
当前输出目录:
|
||
|
||
```text
|
||
WATER_RESULTS_DIR/
|
||
water_extraction_{id}/
|
||
water_mask.tif
|
||
```
|
||
|
||
当前算法状态:
|
||
|
||
- Otsu 阈值;
|
||
- GF3 线性强度自动转 `10*log10`;
|
||
- 支持 COPDEM/SRTM 类 DEM 栅格约束;
|
||
- 中值滤波、高斯滤波、形态学、连通域过滤;
|
||
- 可作为 baseline,不适合作为最终高精度算法。
|
||
|
||
### 4.2 灾前/灾后洪涝检测
|
||
|
||
流程:
|
||
|
||
```text
|
||
前端输入灾害日期 + 行政区 AOI
|
||
-> POST /flood/disaster-pairs/search
|
||
-> 后端按时间窗、AOI 覆盖率、重叠率推荐 pre/post 配对
|
||
-> POST /flood/detections { pre_scene_id, post_scene_id, refine }
|
||
-> 创建 FloodDetectionORM(PENDING)
|
||
-> 创建 SystemJob: FLOOD_DETECTION
|
||
-> job_handlers._handle_flood_detection
|
||
-> flood_detection_service.run_geotiff_flood_detection
|
||
-> 写 classified.tif/flood_mask.tif/stable_water_mask.tif/metadata.json
|
||
-> 更新 FloodDetectionORM
|
||
-> 前端加载 pre/post/classified 图层
|
||
```
|
||
|
||
当前输出目录:
|
||
|
||
```text
|
||
WATER_RESULTS_DIR/
|
||
flood_{id}/
|
||
classified.tif
|
||
flood_mask.tif
|
||
stable_water_mask.tif
|
||
metadata.json
|
||
```
|
||
|
||
当前算法状态:
|
||
|
||
- 灾前、灾后分别 Otsu;
|
||
- 灾后水体且灾前非水体判为 flood;
|
||
- 灾前灾后均水体判为 stable_water;
|
||
- 可选 `refine` 做简单形态学清理;
|
||
- 支持灾前重投影到灾后网格;
|
||
- 还未接入更强的 GF3 双极化分类、深度学习或弱监督模型。
|
||
|
||
### 4.3 套合分析
|
||
|
||
流程:
|
||
|
||
```text
|
||
FloodDetection DONE
|
||
-> POST /flood/detections/{id}/overlay
|
||
-> classified.tif 中 value=2 的 flood 区域矢量化
|
||
-> 与灾害点、DInSAR 产品、行政区 AOI 套合
|
||
-> 写 flood_detection_{id}_overlay.geojson
|
||
-> 新增 FloodOverlayORM
|
||
```
|
||
|
||
输出:
|
||
|
||
```text
|
||
WATER_RESULTS_DIR/
|
||
flood_overlays/
|
||
flood_detection_{id}_overlay.geojson
|
||
```
|
||
|
||
### 4.4 产品登记
|
||
|
||
流程:
|
||
|
||
```text
|
||
FloodDetection DONE
|
||
-> POST /flood/detections/{id}/products
|
||
-> 创建 FloodProductORM
|
||
-> GET /flood/products 或 /flood/results 查询
|
||
```
|
||
|
||
当前只是轻量登记,没有完整归档包导出。
|
||
|
||
## 5. analysis-ready 输入契约
|
||
|
||
算法工程师应以 `SARSceneGeoORM.analysis_tif_path` 为唯一标准输入。
|
||
|
||
输入约定:
|
||
|
||
| 项 | 要求 |
|
||
| --- | --- |
|
||
| 格式 | 单波段 GeoTIFF |
|
||
| 坐标 | 有 CRS,推荐 EPSG:4326 或投影坐标 |
|
||
| transform | 必须正确 |
|
||
| nodata | 支持 `NaN` 或明确 nodata |
|
||
| 单位 | 可能是 dB,也可能是线性强度,需读 `analysis_backscatter_unit` 或自行稳健判断 |
|
||
| 文件大小 | GF3 单极化可达几千万像元 |
|
||
|
||
现有 GF3 SARscape 标准化结果大致为:
|
||
|
||
- 数据来自 ENVI/SARscape `_geo`;
|
||
- 转为 GeoTIFF 后注册;
|
||
- `analysis_backscatter_unit` 当前可能为 `unknown`;
|
||
- 实际数值可能是线性强度,需做 dB 转换。
|
||
|
||
## 6. 算法 processor 输出契约
|
||
|
||
### 6.1 水体提取 processor
|
||
|
||
建议新增统一接口:
|
||
|
||
```python
|
||
def run_xxx_water_extraction(
|
||
*,
|
||
input_path: str,
|
||
output_dir: str,
|
||
job_id: str | None = None,
|
||
options: dict | None = None,
|
||
) -> dict:
|
||
...
|
||
```
|
||
|
||
返回:
|
||
|
||
```python
|
||
{
|
||
"ok": True,
|
||
"processor": "gf3_rf_v1",
|
||
"output_path": ".../water_mask.tif",
|
||
"water_area_km2": 123.45,
|
||
"water_pixel_count": 123456,
|
||
"threshold_value": 0.62,
|
||
"metadata": {
|
||
"model_version": "...",
|
||
"features": ["hh_db", "hv_db", "ratio", "slope"],
|
||
"confidence_path": ".../water_probability.tif"
|
||
}
|
||
}
|
||
```
|
||
|
||
最低要求:
|
||
|
||
- `output_path` 是 GeoTIFF;
|
||
- 水体像元值为 `255` 或 `1`,背景为 `0`;
|
||
- CRS/transform 与输入一致;
|
||
- nodata 推荐为 `0`;
|
||
- 面积统计要与输出一致。
|
||
|
||
### 6.2 洪涝检测 processor
|
||
|
||
建议接口:
|
||
|
||
```python
|
||
def run_xxx_flood_detection(
|
||
*,
|
||
pre_tif_path: str,
|
||
post_tif_path: str,
|
||
output_dir: str,
|
||
job_id: str | None = None,
|
||
refine: bool = False,
|
||
options: dict | None = None,
|
||
) -> dict:
|
||
...
|
||
```
|
||
|
||
返回:
|
||
|
||
```python
|
||
{
|
||
"ok": True,
|
||
"processor": "gf3_change_rf_v1",
|
||
"classified_path": ".../classified.tif",
|
||
"flood_mask_path": ".../flood_mask.tif",
|
||
"stable_water_mask_path": ".../stable_water_mask.tif",
|
||
"metadata_path": ".../metadata.json",
|
||
"flood_area_km2": 12.34,
|
||
"stable_water_area_km2": 56.78,
|
||
"flood_pixel_count": 12345,
|
||
"stable_water_pixel_count": 67890,
|
||
"metadata": {
|
||
"model_version": "...",
|
||
"pre_scene_reprojected": True
|
||
}
|
||
}
|
||
```
|
||
|
||
`classified.tif` 必须遵守第 3.3 节的分类值,否则前端预览和套合分析会失效。
|
||
|
||
## 7. 推荐算法路线
|
||
|
||
### 7.1 短期:GF3 快速分类器
|
||
|
||
目标:替换当前单阈值水体提取,减少误判。
|
||
|
||
建议 processor 名称:
|
||
|
||
- `gf3_rf_v1`
|
||
- `gf3_lgbm_v1`
|
||
|
||
输入:
|
||
|
||
- 优先支持 GF3 HH/HV 双极化;
|
||
- 如果系统当前只注册单极化 `analysis_ready.tif`,工程侧需要补充“同一产品多极化查找”能力,或算法先支持单极化。
|
||
|
||
特征建议:
|
||
|
||
- `HH_db`
|
||
- `HV_db`
|
||
- `HH-HV`
|
||
- `HH/HV ratio`
|
||
- 局部均值、方差、纹理;
|
||
- DEM 高程、坡度;
|
||
- 可选永久水体、河网、土地覆盖先验。
|
||
|
||
样本策略:
|
||
|
||
- 第一版可用弱监督样本:永久水体为正样本,远离水系/坡度较大/高后向散射区域为负样本;
|
||
- 后续在系统内加入人工修正样本导出;
|
||
- 不建议用当前 Otsu 结果直接当唯一标签。
|
||
|
||
### 7.2 中期:GF3 深度学习推理
|
||
|
||
目标:面向洪涝产品的高质量识别。
|
||
|
||
可参考:
|
||
|
||
- Sen2GF3Floods:GF3 洪水数据集和 PyTorch 代码;
|
||
- FCN/UNet++/DeepLabV3+/SegFormer;
|
||
- 支持 patch 推理和边缘重叠融合。
|
||
|
||
工程要求:
|
||
|
||
- 模型权重必须版本化;
|
||
- processor 输出必须仍是标准 GeoTIFF;
|
||
- 推理可以 GPU 加速,但不能阻塞任务队列主进程;
|
||
- 大图必须 tile 化,避免一次性占满显存/内存。
|
||
|
||
### 7.3 保留 baseline
|
||
|
||
当前 `otsu` 应保留为:
|
||
|
||
- 快速预览;
|
||
- 无模型时兜底;
|
||
- 算法对比 baseline。
|
||
|
||
不建议作为最终默认高质量结果。
|
||
|
||
## 8. 工程侧下一步
|
||
|
||
### 8.1 后端 processor 注册
|
||
|
||
建议在 `water_extraction_service.py` 增加 processor 分发:
|
||
|
||
```python
|
||
def run_water_extraction(processor: str, **kwargs):
|
||
if processor == "otsu":
|
||
return run_otsu_water_extraction(**kwargs)
|
||
if processor == "gf3_rf_v1":
|
||
return run_gf3_rf_water_extraction(**kwargs)
|
||
...
|
||
```
|
||
|
||
`FloodWaterExtractionRequest` 需要增加:
|
||
|
||
```python
|
||
processor: str = "otsu"
|
||
options: dict | None = None
|
||
```
|
||
|
||
然后 `submit_water_extraction` 把 processor/options 写入 `WaterExtractionORM` 和 job payload。
|
||
|
||
### 8.2 多极化场景组织
|
||
|
||
目前 `SARSceneGeoORM` 与 `RadarDataORM` 基本是一景一条。GF3 标准化链路可能存在 HH/HV 两个 GeoTIFF,但洪涝算法输入仍是单 `analysis_tif_path`。
|
||
|
||
如果算法需要 HH/HV,应补一个工程能力:
|
||
|
||
- 在 `analysis_metadata_json` 中记录同产品全部极化 GeoTIFF;
|
||
- 或新增 `SARSceneBandORM`/`analysis_assets` 表;
|
||
- 或在 processor 内根据当前路径和命名规则寻找同目录同产品 HV/HH。
|
||
|
||
建议先采用 metadata 方案,改动最小。
|
||
|
||
### 8.3 水体结果矢量化
|
||
|
||
当前水体提取只按需返回 PNG 预览,没有持久化矢量。
|
||
|
||
建议新增:
|
||
|
||
- `water_vector_path` GeoJSON;
|
||
- `confidence_path` 概率图;
|
||
- `preview_path` 持久 PNG;
|
||
- 后端接口支持水体结果矢量上图。
|
||
|
||
### 8.4 质量评估字段
|
||
|
||
建议 `metadata_json` 至少写入:
|
||
|
||
- `processor`
|
||
- `model_version`
|
||
- `input_paths`
|
||
- `features`
|
||
- `threshold`
|
||
- `confidence_stats`
|
||
- `valid_pixel_count`
|
||
- `water_ratio`
|
||
- `runtime_seconds`
|
||
- `warnings`
|
||
|
||
### 8.5 前端入口
|
||
|
||
当前前端有水体提取按钮,但没有 processor 选择。
|
||
|
||
建议增加:
|
||
|
||
- 水体提取 processor 下拉框;
|
||
- `快速 Otsu / GF3 RF / 深度学习`;
|
||
- 结果行显示 processor 和模型版本;
|
||
- 可选显示置信度图层。
|
||
|
||
## 9. 算法开发边界
|
||
|
||
算法工程师只需要保证:
|
||
|
||
1. 能读取输入 GeoTIFF;
|
||
2. 能输出符合契约的 GeoTIFF;
|
||
3. 返回标准 dict;
|
||
4. 大图处理不会把内存/显存打爆;
|
||
5. 错误抛出清晰异常或返回 `{"ok": False, "error": "..."}`。
|
||
|
||
算法工程师不需要处理:
|
||
|
||
- 前端;
|
||
- 任务队列;
|
||
- 用户权限;
|
||
- 数据库事务;
|
||
- 资产扫描;
|
||
- 上图预览;
|
||
- 套合分析;
|
||
- 产品登记。
|
||
|
||
## 10. 当前风险和已知问题
|
||
|
||
1. 当前 Otsu 水体提取误判较多,只能作为 baseline。
|
||
2. GF3 双极化没有形成正式算法输入契约。
|
||
3. `analysis_backscatter_unit` 对 GF3 SARscape 输出仍可能是 `unknown`。
|
||
4. 洪涝变化检测仍是双阈值差分,复杂地物下误判会明显。
|
||
5. 水体和洪涝结果缺少质量评价和置信度图层。
|
||
6. 产品登记还不是完整归档包。
|
||
7. 旧 `/water/*` 和新 `/flood/*` 共存,后续需要逐步收敛到 `/flood/*`。
|
||
|
||
## 11. 建议交付里程碑
|
||
|
||
### M1:GF3 RF 水体 processor
|
||
|
||
- 输入单景 GF3 HH/HV 或单极化;
|
||
- 输出 `water_mask.tif`;
|
||
- 写入模型元数据;
|
||
- 接入 `/flood/water-extractions`。
|
||
|
||
### M2:多极化输入契约
|
||
|
||
- 工程侧让 processor 能稳定拿到 HH/HV;
|
||
- 文档化极化路径和 metadata;
|
||
- 前端显示使用的极化。
|
||
|
||
### M3:洪涝变化 processor
|
||
|
||
- 输入灾前/灾后;
|
||
- 输出标准 `classified.tif`;
|
||
- 与现有套合和产品链路兼容。
|
||
|
||
### M4:深度学习推理
|
||
|
||
- 支持 tile 推理;
|
||
- 支持模型版本;
|
||
- 输出概率图和二值图;
|
||
- 与 RF/baseline 可切换。
|