chore: initialize insar management system v2

This commit is contained in:
2026-04-14 13:16:01 +08:00
commit ecc72ec9cd
361 changed files with 2142522 additions and 0 deletions
+536
View File
@@ -0,0 +1,536 @@
# D-InSAR 配对增强设计文档
**版本**: v2.0
**日期**: 2026-03-08
**状态**: 设计阶段
---
## 一、背景与目标
### 1.1 现有系统局限
当前配对系统采用**单池全组合**模式:
- 所有影像放入同一个池子,两两组合,用时间基线范围过滤
- 无法控制主影像(master)和辅影像(slave)的时间段
- 无法指定配对策略(星型、链式、SBAS 网络等)
- 不支持手动选定参考影像
这种设计适合探索性分析,但不满足生产级 InSAR 处理需求。
### 1.2 行业标准实践
参考成熟 InSAR 软件(ISCE、LiCSBAS、MintPy、GAMMA):
| 特性 | 行业标准 | 现有系统 |
|---|---|---|
| 主/辅影像分池 | 明确的 reference/secondary 选择 | ❌ 无 |
| 配对策略 | SBAS / Sequential / Star | ❌ 仅全组合 |
| 时间范围控制 | 主辅池独立时间段 | ❌ 单一 start_date |
| 参考影像指定 | 支持手动或自动选择 | ❌ 无 |
| 多卫星支持 | 预留扩展机制 | ⚠️ 硬编码 LT-1 |
### 1.3 设计目标
1. **双池配对机制**:主影像池和辅影像池独立时间范围
2. **多策略支持**SBAS / Sequential / Star 三种标准策略
3. **参考影像控制**:自动选择或用户指定
4. **多卫星扩展性**:预留 Sentinel-1、ALOS-2、TerraSAR-X 等卫星接入
5. **向后兼容**:现有配对逻辑作为 SBAS 策略保留
---
## 二、配对策略详解
### 2.1 SBAS(短基线子集)
**定义**:在时空基线阈值内全组合配对,形成冗余网络。
**适用场景**
- 大范围形变监测
- 需要高时间分辨率和空间覆盖
- 对大气误差敏感的区域
**参数**
- `time_baseline_min/max`:时间基线范围(天)
- `spatial_baseline_max_meters`:空间基线上限(米)
- `overlap_threshold`:重叠率阈值
- `coverage_diversity_penalty`:覆盖多样性惩罚因子
**配对逻辑**
```
主池影像 × 辅池影像 → 满足时空基线约束 → 覆盖优化 → 最终配对
```
**示例**
```
主池: 2024-01-01 ~ 2024-06-30 (10 景)
辅池: 2024-07-01 ~ 2024-12-31 (12 景)
时间基线: 30~90 天
→ 生成 45 对(经覆盖优化后约 20 对)
```
### 2.2 Sequential(顺序配对)
**定义**:按时间排序,每景影像与后续 N 景配对。
**适用场景**
- 连续监测(如滑坡、地面沉降)
- 需要时间连续性的形变序列
- 计算资源有限时
**参数**
- `num_connections`:每景与后续几景配对(默认 1
- 其他时空约束同 SBAS
**配对逻辑**
```
1. 合并主辅池,按日期排序
2. 每景与后续 num_connections 景配对
3. 应用时空基线过滤
```
**示例**
```
影像序列: [A, B, C, D, E, F]
num_connections = 2
→ 配对: A-B, A-C, B-C, B-D, C-D, C-E, D-E, D-F, E-F
```
### 2.3 Star(星型配对)
**定义**:选择一个参考影像,所有其他影像与它配对。
**适用场景**
- 时序形变分析(PS-InSAR 前处理)
- 需要统一参考基准
- 参考影像质量已知且优秀
**参数**
- `reference_image_id`:指定参考影像 ID(可选)
- 自动选择策略:选择与其他影像平均重叠率最高的影像
**配对逻辑**
```
1. 确定参考影像(用户指定 或 自动选择)
2. 参考影像 × 所有其他影像
3. 应用时空基线过滤
```
**示例**
```
参考影像: 2024-06-15 (质量最优)
其他影像: 20 景
→ 配对: 20 对(全部以 2024-06-15 为主影像)
```
---
## 三、双池配对机制
### 3.1 时间范围控制
| 参数 | 说明 | 默认值 |
|---|---|---|
| `master_date_from` | 主影像起始日期 (YYYYMMDD) | None(不限) |
| `master_date_to` | 主影像截止日期 (YYYYMMDD) | None(不限) |
| `slave_date_from` | 辅影像起始日期 (YYYYMMDD) | None(不限) |
| `slave_date_to` | 辅影像截止日期 (YYYYMMDD) | None(不限) |
### 3.2 池子定义规则
**主影像池**
```sql
WHERE imaging_date >= master_date_from
AND imaging_date <= master_date_to
AND (: ...)
```
**辅影像池**
```sql
WHERE imaging_date >= slave_date_from
AND imaging_date <= slave_date_to
AND (: ...)
```
### 3.3 向后兼容
当四个日期参数全为 `None` 时:
- 主辅池合并为同一个池子
- 行为等效于现有系统(`m.imaging_date <= s.imaging_date` 避免重复)
---
## 四、多卫星扩展设计
### 4.1 当前硬编码问题
现有代码中卫星相关硬编码:
```python
# spatial_service.py
if master.satellite != slave.satellite:
continue
# 前端显示
satellite: "LT-1"
```
### 4.2 扩展方案
**数据库层**
- `radar_data.satellite` 字段已支持任意字符串,无需修改
- 配对函数增加 `p_allowed_satellites` 参数(数组)
**后端层**
```python
class PairingRequest(BaseModel):
# 新增
allowed_satellites: Optional[List[str]] = None # ["LT-1", "S1A", "S1B"]
cross_satellite_pairing: bool = False # 是否允许跨卫星配对
```
**前端层**
- 配对 Modal 增加卫星多选框
- 从数据库动态获取可用卫星列表:`SELECT DISTINCT satellite FROM radar_data`
**配对逻辑**
```python
# 同卫星配对(默认)
if not cross_satellite_pairing:
if master.satellite != slave.satellite:
continue
# 跨卫星配对(高级功能,需谨慎)
if allowed_satellites:
if master.satellite not in allowed_satellites:
continue
if slave.satellite not in allowed_satellites:
continue
```
### 4.3 卫星特性差异处理
不同卫星需要不同的配对参数:
| 卫星 | 典型时间基线 | 典型空间基线 | 波长 | 备注 |
|---|---|---|---|---|
| LT-1 | 30~90 天 | < 3000 m | L 波段 | 当前系统 |
| Sentinel-1 | 6~12 天 | < 150 m | C 波段 | 高重访频率 |
| ALOS-2 | 14 天 | < 500 m | L 波段 | 与 LT-1 类似 |
| TerraSAR-X | 11 天 | < 200 m | X 波段 | 高分辨率 |
**建议**
- 前端提供"卫星预设"按钮,自动填充推荐参数
- 数据库增加 `satellite_config` 表存储默认配对参数
---
## 五、数据库函数设计
### 5.1 新函数签名
```sql
CREATE OR REPLACE FUNCTION find_dinsar_pairs_v2(
-- 时空约束
p_time_baseline_min INTEGER,
p_time_baseline_max INTEGER,
p_spatial_baseline_max_meters NUMERIC,
p_overlap_threshold NUMERIC,
p_aoi_geom GEOMETRY DEFAULT NULL,
p_require_orbit_data BOOLEAN DEFAULT TRUE,
p_require_same_imaging_mode BOOLEAN DEFAULT TRUE,
p_require_same_polarization BOOLEAN DEFAULT TRUE,
p_aoi_overlap_threshold NUMERIC DEFAULT NULL,
-- 双池日期(新增)
p_master_date_from TEXT DEFAULT NULL,
p_master_date_to TEXT DEFAULT NULL,
p_slave_date_from TEXT DEFAULT NULL,
p_slave_date_to TEXT DEFAULT NULL,
-- 多卫星支持(新增)
p_allowed_satellites TEXT[] DEFAULT NULL,
p_cross_satellite_pairing BOOLEAN DEFAULT FALSE
)
RETURNS TABLE (
master_id INTEGER,
slave_id INTEGER,
master_imaging_date TEXT,
slave_imaging_date TEXT,
time_baseline_days INTEGER,
spatial_baseline_meters NUMERIC,
overlap_ratio NUMERIC
)
```
### 5.2 核心 SQL 逻辑变化
```sql
-- 现有逻辑
WHERE m.id < s.id -- 避免重复
AND m.satellite = s.satellite
-- 新逻辑
WHERE m.id <> s.id
AND m.imaging_date <= s.imaging_date -- 主影像早于辅影像
-- 主池日期约束
AND (p_master_date_from IS NULL OR m.imaging_date >= p_master_date_from)
AND (p_master_date_to IS NULL OR m.imaging_date <= p_master_date_to)
-- 辅池日期约束
AND (p_slave_date_from IS NULL OR s.imaging_date >= p_slave_date_from)
AND (p_slave_date_to IS NULL OR s.imaging_date <= p_slave_date_to)
-- 卫星约束
AND (p_allowed_satellites IS NULL OR m.satellite = ANY(p_allowed_satellites))
AND (p_allowed_satellites IS NULL OR s.satellite = ANY(p_allowed_satellites))
AND (p_cross_satellite_pairing OR m.satellite = s.satellite)
```
### 5.3 部署策略
1. 创建 `003_pairing_enhancement.sql` 迁移文件
2. `init_db.py` 自动应用(已有机制,line 354-356
3. 保留 `find_dinsar_pairs` 旧函数(向后兼容)
4. 后端优先调用 `find_dinsar_pairs_v2`,失败时回退
---
## 六、后端 API 设计
### 6.1 Schema 变更
```python
# models/schemas.py
class PairingRequest(BaseModel):
"""D-InSAR 配对请求参数(增强版)"""
# === 时空约束(保留) ===
time_baseline_min: int = Field(default=1, ge=0, le=3650)
time_baseline_max: int = Field(default=90, ge=1, le=3650)
overlap_threshold: float = Field(default=0.5, ge=0.0, le=1.0)
spatial_baseline_max_meters: int = Field(default=3000, ge=0, le=100000)
coverage_diversity_penalty: float = Field(default=0.3, ge=0.0, le=1.0)
require_same_imaging_mode: bool = True
require_same_polarization: bool = True
aoi_overlap_threshold: Optional[float] = Field(default=None, ge=0.0, le=1.0)
# === 双池日期(新增) ===
master_date_from: Optional[str] = Field(default=None, pattern=r'^\d{8}$')
master_date_to: Optional[str] = Field(default=None, pattern=r'^\d{8}$')
slave_date_from: Optional[str] = Field(default=None, pattern=r'^\d{8}$')
slave_date_to: Optional[str] = Field(default=None, pattern=r'^\d{8}$')
# === 配对策略(新增) ===
strategy: str = Field(default="sbas", pattern=r'^(sbas|sequential|star)$')
num_connections: int = Field(default=1, ge=1, le=10)
reference_image_id: Optional[int] = None
# === 多卫星支持(新增) ===
allowed_satellites: Optional[List[str]] = None
cross_satellite_pairing: bool = False
# === 向后兼容(保留) ===
start_date: Optional[str] = Field(default=None, pattern=r'^\d{8}$')
@field_validator('master_date_to')
def validate_master_date_range(cls, v, info):
if v and info.data.get('master_date_from'):
if v < info.data['master_date_from']:
raise ValueError('master_date_to must >= master_date_from')
return v
@field_validator('slave_date_to')
def validate_slave_date_range(cls, v, info):
if v and info.data.get('slave_date_from'):
if v < info.data['slave_date_from']:
raise ValueError('slave_date_to must >= slave_date_from')
return v
```
### 6.2 服务层变更
```python
# services/spatial_service.py
async def find_dinsar_pairs(
self,
db: AsyncSession,
params: PairingRequest,
aoi_wkt: Optional[str] = None,
require_orbit_data: bool = True
) -> Tuple[List[RadarPair], List[str], bool]:
"""
增强版配对逻辑:
1. 调用 find_dinsar_pairs_v2 SQL 函数
2. 根据 strategy 后处理结果
3. 回退路径同步更新
"""
# 1. 调用数据库函数
pairs = await self._call_db_pairing_function(db, params, aoi_wkt, require_orbit_data)
# 2. 策略后处理
if params.strategy == "sbas":
# 覆盖优化(现有逻辑)
pairs = self._optimize_coverage_diversity(pairs, params.coverage_diversity_penalty)
elif params.strategy == "sequential":
# 顺序配对
pairs = self._apply_sequential_strategy(pairs, params.num_connections)
elif params.strategy == "star":
# 星型配对
pairs = self._apply_star_strategy(pairs, params.reference_image_id)
# 3. 生成 task_name 并去重
pairs = self._generate_task_names(pairs)
return pairs, warnings, fallback_used
```
---
## 七、前端 UI 设计
### 7.1 配对 Modal 布局
```
┌─────────────────────────────────────────────────┐
│ D-InSAR 配对参数 │
├─────────────────────────────────────────────────┤
│ 配对策略: ○ SBAS ○ Sequential ○ Star │
│ │
│ [策略说明] │
│ SBAS: 短基线子集,形成冗余网络,适合大范围监测 │
│ │
├─────────────────────────────────────────────────┤
│ 主影像时间范围 │
│ 从: [日期选择器 YYYYMMDD] 至: [日期选择器] │
│ │
│ 辅影像时间范围 │
│ 从: [日期选择器 YYYYMMDD] 至: [日期选择器] │
│ │
│ ☑ 使用双池模式(不勾选则主辅池合并) │
├─────────────────────────────────────────────────┤
│ 时间基线: [1] ~ [90] 天 │
│ 空间基线上限: [3000] 米 │
│ 重叠率阈值: [0.5] │
│ 覆盖多样性惩罚: [0.3] │
│ │
│ ☑ 成像模式一致 ☑ 极化一致 ☑ 仅精轨影像 │
├─────────────────────────────────────────────────┤
│ AOI 来源: ○ 上传 SHP ○ 行政区选择 │
│ [AOI 选择区域...] │
│ │
│ AOI 覆盖率阈值: [0] (0 表示不限制) │
├─────────────────────────────────────────────────┤
│ 高级选项 [展开 ▼] │
│ 卫星选择: ☑ LT-1 ☐ Sentinel-1 ☐ ALOS-2 │
│ ☐ 允许跨卫星配对(谨慎使用) │
│ │
│ Sequential 参数: │
│ 每景配对数: [1] │
│ │
│ Star 参数: │
│ 参考影像: [自动选择 ▼] 或 手动指定 ID: [___] │
├─────────────────────────────────────────────────┤
│ [取消] [开始配对] │
└─────────────────────────────────────────────────┘
```
### 7.2 策略切换交互
- 选择 SBAS:显示"覆盖多样性惩罚"参数
- 选择 Sequential:显示"每景配对数"参数
- 选择 Star:显示"参考影像选择"下拉框(从已有影像列表动态加载)
### 7.3 卫星选择
-`GET /api/radar-data/available-satellites` 动态获取
- 默认只勾选 LT-1
- 跨卫星配对显示警告提示
---
## 八、实施计划
### Phase 1: 数据库层(1 天)
- [ ] 创建 `003_pairing_enhancement.sql`
- [ ] 实现 `find_dinsar_pairs_v2` 函数
- [ ] 更新 `init_db.py` 应用迁移
- [ ] 测试 SQL 函数(手动执行验证)
### Phase 2: 后端层(2 天)
- [ ] 更新 `PairingRequest` Schema
- [ ] 实现策略后处理逻辑(Sequential / Star
- [ ] 更新 `spatial_service.py` 调用新函数
- [ ] 更新回退路径逻辑
- [ ] 新增 `GET /api/radar-data/available-satellites` 端点
- [ ] 单元测试(pytest
### Phase 3: 前端层(2 天)
- [ ] 更新 `pairingStore.js` 增加新字段
- [ ] 重构 `PairingModal.jsx` UI
- [ ] 实现策略切换交互
- [ ] 实现卫星多选
- [ ] 更新 `usePairingLogic.js` 传参
- [ ] 前端构建测试
### Phase 4: 集成测试(1 天)
- [ ] 端到端测试(SBAS / Sequential / Star
- [ ] 双池配对测试
- [ ] 多卫星配对测试
- [ ] 向后兼容测试(旧参数仍可用)
- [ ] 性能测试(大数据量)
### Phase 5: 文档与部署(0.5 天)
- [ ] 更新 `CLAUDE.md` 记录改动
- [ ] 更新用户手册(如有)
- [ ] 部署到测试环境
- [ ] 用户验收测试
**总计**: 约 6.5 天
---
## 九、风险与缓解
| 风险 | 影响 | 缓解措施 |
|---|---|---|
| SQL 函数性能下降 | 配对速度变慢 | 保留旧函数,性能对比测试 |
| 前端 UI 复杂度增加 | 用户学习成本 | 提供"快速模式"和"高级模式"切换 |
| 多卫星配对参数不当 | 生成无效配对 | 前端参数校验 + 后端警告提示 |
| 向后兼容性破坏 | 旧配对失效 | 保留 `start_date` 参数,自动转换 |
---
## 十、未来扩展
1. **基线网络可视化**:时间-空间基线散点图(D3.js / ECharts
2. **配对质量评分**:根据相干性、大气条件预估配对质量
3. **自动参数推荐**:基于历史配对结果的机器学习推荐
4. **批量配对模板**:保存常用配对参数为模板
5. **Sentinel-1 轨道框架**:支持 Sentinel-1 的 Track/Frame 概念
---
## 附录 A:术语对照表
| 中文 | 英文 | 说明 |
|---|---|---|
| 主影像 | Master / Reference | 配对中的参考影像 |
| 辅影像 | Slave / Secondary | 配对中的从属影像 |
| 时间基线 | Temporal Baseline | 两景影像的时间间隔 |
| 空间基线 | Spatial Baseline | 两景影像的空间距离 |
| 短基线子集 | SBAS (Small Baseline Subset) | 配对策略之一 |
| 星型配对 | Star Graph | 单主影像配对策略 |
| 顺序配对 | Sequential Pairing | 时间顺序配对策略 |
---
**文档结束**