Files
insar-management-system-v2/docs/PAIRING_ENHANCEMENT_DESIGN.md
T

18 KiB
Raw Blame History

D-InSAR 配对增强设计文档

版本: v2.0 日期: 2026-03-08 状态: 概念设计,部分能力已落地

更新说明(2026-04-26):截至 2026-04-25pairing cache、pairing health 状态和基础指标统计已经在现网落地。当前运行态事实请优先参考 CURRENT_STATUS_20260425.mdDATABASE_SELF_MAINTENANCE_AUDIT_20260425.md 和健康检查接口;本文档保留配对语义、策略命名、产品交互和后续演进方向的设计价值。


一、背景与目标

1.1 设计起点(2026-03-08 基线)

当前配对系统采用单池全组合模式:

  • 所有影像放入同一个池子,两两组合,用时间基线范围过滤
  • 无法控制主影像(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:footprint 中心距上限(米,兼容字段名保留)
  • overlap_threshold:两景 footprint 最小重叠率(兼容字段名保留)
  • 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 池子定义规则

主影像池

WHERE imaging_date >= master_date_from
  AND imaging_date <= master_date_to
  AND (其他约束: 卫星、轨道、模式、极化、精轨...)

辅影像池

WHERE imaging_date >= slave_date_from
  AND imaging_date <= slave_date_to
  AND (其他约束: 卫星、轨道、模式、极化、精轨...)

3.3 向后兼容

当四个日期参数全为 None 时:

  • 主辅池合并为同一个池子
  • 行为等效于现有系统(m.imaging_date <= s.imaging_date 避免重复)

四、多卫星扩展设计

4.1 当前硬编码问题

现有代码中卫星相关硬编码:

# spatial_service.py
if master.satellite != slave.satellite:
    continue

# 前端显示
satellite: "LT-1"

4.2 扩展方案

数据库层

  • radar_data.satellite 字段已支持任意字符串,无需修改
  • 配对函数增加 p_allowed_satellites 参数(数组)

后端层

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

配对逻辑

# 同卫星配对(默认)
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 卫星特性差异处理

不同卫星需要不同的配对参数:

卫星 典型时间基线 典型 footprint 中心距上限 波长 备注
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 新函数签名

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 逻辑变化

-- 现有逻辑
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 变更

# 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 服务层变更

# 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] 天                         │
│ footprint 中心距上限: [3000] 米                  │
│ 两景 footprint 最小重叠率: [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 两景影像的时间间隔
footprint 中心距 Footprint Center Distance 两景影像 footprint 的中心距离
短基线子集 SBAS (Small Baseline Subset) 配对策略之一
星型配对 Star Graph 单主影像配对策略
顺序配对 Sequential Pairing 时间顺序配对策略

文档结束