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

12 KiB
Raw Blame History

SBAS-InSAR Gamma 实现与专家文档对照审阅记录

审阅日期:2026-06-03
审阅对象:

  • 专家文档:D:\Code\Insar_management_system_v2\LT1_GAMMA_SBAS_逐命令处理流程.docx
  • 当前实现:backend/app/services/sbas_insar_production_service.py
  • 当前入库:backend/app/services/sbas_insar_catalog_service.py
  • 样本 Runbackend/runtime/sbas_insar_production/runs/sbas_7537cc71c998

1. 审阅结论

当前 SBAS-InSAR Gamma 实现不能视为专家文档的逐命令复刻。

它更接近“参考专家文档后形成的 Gamma/PyINT 混合生产链路”。这条链路曾跑出完整产物,但从专家文档一致性、结果验收语义和空间范围表达看,存在需要优先修正的问题。专家反馈“结果和实现路径有问题”,从代码和样本产物看是有依据的。

核心判断:

  1. 生产坐标系中的 RDC/SAR 栅格本身是矩形。
  2. 系统展示和入库使用的是地理坐标 bbox/GeoTIFF,而不是 SAR 坐标矩形。
  3. 当前把“发现阶段影像范围”“最终地理编码外包矩形”“最终有效像元范围”混在一起,容易造成范围和质量误判。
  4. 样本 Run 的 DEM 没有覆盖完整 stack bbox,但仍被标记为 ready,这是结果边缘异常和黑边风险的直接原因。

2. 专家文档主流程

专家文档的 LT-1 Gamma SBAS 主链路可以概括为:

par_LT1_SLC
ORB_filt_spline.py
multi_look
dem_import / fill_gaps
gc_map2 / pixel_area / create_diff_par / offset_pwrm / offset_fitm / gc_map_fine / geocode
create_offset / init_offset_orbit / init_offset / offset_pwr / offset_fit / SLC_interp
mk_mli_all
base_calc / base_plot / mk_diff_2d
mk_adf_2d / ave_image / rascc_mask / mk_unw_2d
quad_fit / quad_sub / atm_mod_2d / fill_gaps / atm_sim_2d / sub_phase
mb / unw_to_cpx / unw_model / mb / mb
replace_values / mask_data / dispmap / ts_rate
geocode_back / data2geotiff / disp_prt_2d

专家文档强调正式运行前必须用实际数据替换日期、极化、宽度、行数、DEM 宽度、种子点、阈值和小基线阈值,并用 grepSLC_corners、显示检查命令进行核对。

3. 当前实现主流程

当前系统实现的主要阶段是:

01_baseline_audit.sh
02_coreg_common_ref.sh
03_prepare_rdc_dem.sh
04_diff_unwrap_common_ref.sh
05_detrend_atm.sh
05_mb_ts_rate.sh
07_publish_products.sh
08_point_timeseries.sh

实现入口集中在:

  • backend/app/services/sbas_insar_production_service.py
  • backend/app/services/job_handlers.py
  • deploy/wsl/runners/gamma_sbas_product_tools.py

当前文档化的 stage 名称与专家文档相近,但部分脚本内部命令不是专家文档原命令序列。

4. 主要问题

4.1 DEM 允许只覆盖中心点,不强制覆盖完整 stack

严重级别:高

当前 DEM 选择逻辑允许以下任一条件成立即保留 DEM:

self._bbox_contains(coverage, stack_bbox, margin_degrees=0.05)
or self._bbox_contains_point(coverage, self._stack_center(stack_manifest), margin_degrees=0.05)

位置:

  • backend/app/services/sbas_insar_production_service.py::_resolve_rdc_dem_source

样本 Run sbas_7537cc71c998 的证据:

"covers_stack_bbox": false,
"covers_stack_center": true,
"stack_bbox": {
  "min_lon": 128.7690438245,
  "min_lat": 43.7486321624,
  "max_lon": 129.6293024728,
  "max_lat": 44.3582486206
}

同一 Run 的 DEM coverage

"coverage": {
  "min_lon": 127.99998768,
  "max_lon": 130.99998756,
  "min_lat": 44.00000064,
  "max_lat": 46.000000560000004
}

也就是说,stack 南界到 43.7486DEM 南界只到约 44.0000。这会造成南侧边缘缺失、NoData、黑边或地理编码结果范围不足。

当前 summary 仍显示:

"ready": true

这是验收逻辑漏洞。

建议:

  • DEM 选择必须强制 covers_stack_bbox=true,并增加安全缓冲。
  • 如果 DEM 不覆盖完整 stack,应直接阻断 RDC DEM 阶段,不允许标记 ready。
  • selection_note 不应写“covering the SBAS stack extent”,除非确实覆盖完整 stack bbox。

4.2 干涉和解缠命令链与专家文档不一致

严重级别:高

专家文档:

mk_diff_2d
mk_adf_2d
ave_image
rascc_mask
mk_unw_2d

当前实现:

create_offset
phase_sim_orb
SLC_diff_intf
adf
cc_wave
rascc_mask
mcf

位置:

  • backend/app/services/sbas_insar_production_service.py::_write_interferogram_script

这不是简单命令名称不同,而是处理策略不同。当前链路可能可以跑通,但不能直接说“与专家逐命令流程一致”。如果专家按文档检查结果,当前实现路径会对不上。

建议:

  • 保留当前混合链路时,应将 profile 标记为 lt1_gamma_sbas_hybridexperimental
  • 新增严格专家链路 profile,例如 lt1_gamma_sbas_expert_v1,按专家文档生成 mk_diff_2d/mk_adf_2d/mk_unw_2d 脚本。

4.3 SBAS 反演缺少专家文档中的二次修正链路

严重级别:高

专家文档在第一次 mb 后包含:

unw_to_cpx
unw_model
mb
mb

当前实现基本是:

mb
ts_rate

位置:

  • backend/app/services/sbas_insar_production_service.py::_write_ipta_timeseries_script

这会影响 2π 跳变修正、最终反演稳定性和专家验收一致性。

建议:

  • 明确把第一次 mb、模型辅助解缠修正、第二次 mb、最终 mb 分成独立可审计步骤。
  • 每次 mb 输出都应记录输入列表、itab、参考点、窗口、阈值和输出统计。

4.4 配准实现不是专家文档的显式逐命令配准

严重级别:中高

专家文档配准链:

create_offset
init_offset_orbit
init_offset
offset_pwr
offset_fit
SLC_interp

当前实现调用:

SLC_coreg.py --init_offset

位置:

  • backend/app/services/sbas_insar_production_service.py::_write_coregistration_script

如果 SLC_coreg.py 内部等价,仍需要把内部日志和参数展开到系统审计里。否则专家无法按逐命令流程核对。

建议:

  • 专家链路 profile 中显式生成 create_offset/init_offset_orbit/init_offset/offset_pwr/offset_fit/SLC_interp
  • 混合链路可以保留 SLC_coreg.py,但必须与专家链路区分。

4.5 DEM 查找表链路与专家文档不一致

严重级别:中

专家文档:

dem_import
fill_gaps
gc_map2
pixel_area
create_diff_par
offset_pwrm
offset_fitm
gc_map_fine
geocode

当前实现:

复用已有 Gamma DEM cache
replace_values
gc_map1
geocode
create_diff_par
init_offsetm
offset_pwrm
offset_fitm
gc_map_fine
geocode

位置:

  • backend/app/services/sbas_insar_production_service.py::_write_rdc_dem_script

当前方式可能是工程上可行的,但与专家文档命令链不一致;同时 DEM 覆盖检查还存在高风险漏洞。

建议:

  • 专家链路 profile 中按文档执行 dem_import/gc_map2/pixel_area
  • 混合链路继续使用 DEM cache 时,必须加强 DEM 覆盖、坐标、分辨率、NoData 验收。

4.6 入库和展示范围来自 stack 元数据,不是最终产品有效范围

严重级别:中

当前 geographic coverage 构造来自 stack scenes 的 metadata bbox

  • backend/app/services/sbas_insar_production_service.py::_build_stack_geographic_coverage

入库时使用该 coverage 写入:

  • min_lon
  • min_lat
  • max_lon
  • max_lat
  • geom
  • coverage_polygon

位置:

  • backend/app/services/sbas_insar_catalog_service.py::_build_product

这意味着系统中展示的是“发现阶段影像范围”,不是最终 GeoTIFF 的真实 footprint,更不是最终有效像元 footprint。

样本 Run 的最终 GeoTIFF los_rate_toward_mm_per_year.tif 信息:

Size is 966, 435
Origin = (128.790404333349983,44.362917266649994)
Pixel Size = (0.000833333300000,-0.000833333300000)
Upper Left  = (128.7904043, 44.3629173)
Lower Right = (129.5954043, 44.0004173)
NoData Value=0

而 stack bbox 是:

{
  "min_lon": 128.7690438245,
  "min_lat": 43.7486321624,
  "max_lon": 129.6293024728,
  "max_lat": 44.3582486206
}

两者明显不同。

建议:

  • 入库时从主 GeoTIFF 读取外包矩形、CRS、transform 和 NoData。
  • 另行计算有效像元 footprint,或至少计算有效像元 bbox。
  • 前端明确区分:
    • stack metadata footprint
    • RDC/SAR processing grid
    • geocoded raster extent
    • valid-pixel footprint

4.7 质量统计把 0 当成有效值

严重级别:中

当前 _gamma_float32_stats 使用 finite 像元作为 valid_count,只额外记录 nonzero_count。但 GeoTIFF 明确 NoData Value=0,因此黑边或无效像元会被 valid_count 掩盖。

位置:

  • backend/app/services/sbas_insar_production_service.py::_gamma_float32_stats

样本质量统计:

"pixel_count": 11480259,
"valid_count": 11480259,
"nonzero_count": 1956770

nonzero_count 只占约 17%,但 valid_count 却是 100%。这会误导验收。

建议:

  • 对最终产品统计必须把 NoData 排除。
  • 对 RDC 中间文件可以同时报告:
    • finite_count
    • nonzero_count
    • nodata_count
    • valid_pixel_ratio
    • valid_bbox
  • ready 不应只看文件尺寸和 finite 统计。

5. SAR 坐标矩形问题

专家反馈“SAR 坐标应该是矩形”,需要拆成两个层次理解。

5.1 处理坐标

RDC/SAR 处理网格应该是规则矩形。

样本 Run 中:

"reference_geometry": {
  "range_samples": 2693,
  "azimuth_lines": 4263,
  "expected_float32_bytes": 45921036
}

RDC 文件大小匹配 2693 * 4263 * 4,说明处理中间产品本身是矩形栅格。

5.2 展示和入库坐标

系统前端和 catalog 当前展示的是 EPSG:4326 的地理 bbox 或 scene bbox,不是 SAR 坐标矩形。

地理编码后的 GeoTIFF 是经纬度网格矩形,但有效像元可能因为 SAR 覆盖、DEM 覆盖、查找表外推、NoData 而不是满矩形。前端如果只画地理 bbox,会让用户误以为整块都有效。

5.3 结论

当前问题不是“RDC 文件不是矩形”,而是系统把以下内容混用了:

  1. SAR/RDC 处理矩形。
  2. 原始 scene metadata bbox。
  3. stack 多景 bbox union/intersection。
  4. 最终 GeoTIFF 地理外包矩形。
  5. 最终有效像元 footprint。

建议把这些空间语义拆开保存和展示。

6. 建议整改路线

第一阶段:先修验收与范围表达

目标:不改变核心 Gamma 命令,先避免错误结果被标记为 ready。

  1. DEM 必须完整覆盖 stack bbox,加缓冲;否则阻断。
  2. rdc_dem_summary.ready 必须检查 DEM coverage。
  3. publish_product_summary 读取主 GeoTIFF 的真实 extent、NoData、valid pixel ratio。
  4. catalog 入库优先使用主 GeoTIFF extent 和 valid footprint,而不是 stack metadata bbox。
  5. 前端展示拆分为“数据发现范围”和“产品有效范围”。

第二阶段:建立专家文档严格链路

目标:给专家可逐命令审计的生产路径。

新增 profile

lt1_gamma_sbas_expert_v1

特性:

  • 按专家文档 12 节生成脚本。
  • 每节脚本命令、输入、输出、日志与专家文档一一对应。
  • 保留当前混合链路,但命名为 hybrid/experimental,不再和专家链路混称。

第三阶段:结果质量验收

目标:形成可解释的质量结论。

建议增加:

  • DEM 覆盖检查。
  • RDC 栅格尺寸检查。
  • GeoTIFF extent 检查。
  • NoData/valid-pixel ratio 检查。
  • 相干性统计。
  • 每对干涉图解缠覆盖率。
  • mb 输入层数、有效像元、参考点窗口记录。
  • LOS 速度范围和 sigma 分布阈值告警。

7. 当前不建议的做法

  1. 不建议继续把当前链路称为“专家文档逐命令链路”。
  2. 不建议只看产物文件存在和文件大小判断成功。
  3. 不建议用 stack metadata bbox 代表最终产品有效范围。
  4. 不建议把 0 NoData 统计为有效像元。
  5. 不建议在 DEM 未覆盖完整 stack 的情况下继续标记 ready。

8. 后续需要专家确认的问题

  1. 是否要求严格使用专家文档中的 mk_diff_2d/mk_adf_2d/mk_unw_2d,还是允许保留 SLC_diff_intf/adf/mcf 混合链路。
  2. DEM 来源是否必须每次从 GeoTIFF 通过 dem_import 重新导入,还是允许复用 Gamma DEM cache。
  3. mb 的三次反演和 unw_model 修正是否必须进入正式链路。
  4. 参考点 R_REF/A_REF、窗口、阈值是否由系统自动选择,还是必须由专家人工确认。
  5. 最终业务展示默认应展示 SAR/RDC 矩形、GeoTIFF extent,还是有效像元 footprint。