13 KiB
SBAS InSAR 嵌入系统设计稿
更新日期:2026-04-06
1. 设计目标
目标不是把当前实验脚本“塞进系统”,而是把已经验证成功的 SBAS 路线变成系统内可提交、可跟踪、可复跑、可发布的正式能力。
设计必须同时满足四个约束:
- 不破坏现有 D-InSAR 生产
- 尽量复用现有
task/job/workflow/result catalog骨架 - 以发布级 bundle 作为系统注册边界,而不是 MintPy 运行目录
- 保留 WSL + conda 的现实部署方式,但把路径和环境耦合收敛到专门层
2. 设计原则
2.1 规划层和生产层分离
现有:
find-ps-timeseriesps_task_batchesps_task_items
这些应该继续保留,但它们只负责:
- 选片
- 栈定义
- 输入快照
它们不应该继续承担:
- 生产运行主记录
- 产物发布状态
- 重试与失败恢复
2.2 一个 SBAS 运行对应一个发布 bundle
不要把 SBAS 多个文件当成多个独立产品行。
推荐模型:
- 一个
ps_timeseries_run - 对应一个 publish bundle
- 对应
result_products中一条psinsar产品记录 - bundle 内部多个文件通过
result_assets管理
这样最贴合当前系统的 result_products -> result_assets 结构。
2.3 发布边界固定为 manifest.json
系统不直接注册:
stack_work/mintpy_work/timeseries.h5- 任意临时中间目录
系统只注册:
publish/.../manifest.json
原因:
- 这是当前实验里最稳定的对外契约
- 它天然适合作为 catalog rebuild 和产品详情入口
- 它把运行时目录与发布目录分开了
2.4 Phase 1 优先“隔离集成”,不优先“统一重构”
当前 result_catalog_service 明显偏 D-InSAR。
因此 Phase 1 不建议直接大改现有 D-InSAR catalog 服务为完全泛化版本。
更稳妥的做法是:
- 新增
psinsar_catalog_service.py - 接口风格与
result_catalog_service.py保持一致 - 底层继续复用
result_products/result_assets/result_issues
等 SBAS 生产链跑稳后,再提炼公共基类。
3. 目标架构
推荐分成五层。
3.1 规划层
复用现有:
POST /find-ps-timeseriesPOST /task-batches/ps
职责:
- 根据 AOI 和筛选条件找到时间序列候选栈
- 生成一个可复用的
ps_task_batch
3.2 生产控制层
新增:
ps_timeseries_runstimeseries_production.pytimeseries_service.py
职责:
- 从一个
ps_task_batch派生一次正式运行 - 固化参数、环境、输入路径、输出路径、DEM、轨道、水体掩膜策略
- 对接
system_tasks/system_jobs/workflow_runs
3.3 执行编排层
复用现有:
system_taskssystem_jobsworkflow_runsworkflow_stepsworkflow_artifacts
新增:
timeseries_workflow_factory.pymintpy_service.pyisce2_stack_service.py
职责:
- 把一次 SBAS 运行拆成多个受控步骤
- 每一步进入统一 worker
- 失败可定位到 step,而不是只看到“整条链失败”
3.4 发布与编目层
新增:
psinsar_catalog_service.pyps_products.py
复用:
result_productsresult_assetsresult_issuesresult_catalog_states
职责:
- 扫描和注册
psinsar.publish.v1 - 管理产品详情、预览、健康检查、重建
3.5 展示层
新增页面:
ps_productionps_productspsinsar_results
职责:
- 运行提交与监控
- 产品浏览与筛选
- 结果详情、预览和下载
4. 核心数据模型
4.1 新增业务表:ps_timeseries_runs
建议字段:
run_idbatch_idrun_namecatalog_namemodesbas
engine_codeisce2
processor_codeisce2_stack_mintpy
env_name- 例如
isce2_mintpy_v1
- 例如
wsl_distro- 例如
Ubuntu-24.04
- 例如
statusPENDING/RUNNING/FAILED/COMPLETED/PUBLISHED
workflow_run_idtask_iddirectionstack_sizereference_datewater_mask_modelocal/synthetic_fallback
dem_path_windowsdem_path_wslorbit_pool_windowsorbit_pool_wslwork_root_windowswork_root_wslpublish_dir_windowspublish_dir_wslmanifest_path_windowsmanifest_path_wslparams_jsonsummary_jsoninput_snapshot_jsonorbit_summary_jsonquality_summary_jsonerror_messagecreated_bycreated_atupdated_atstarted_atended_at
4.2 不新增产品主表
继续使用:
result_productsresult_assetsresult_issues
但对 psinsar 约定如下:
catalog_name = psinsarproduct_type = psinsar_bundleengine_code = isce2task_alias存运行展示名run_key直接绑定ps_timeseries_runs.run_id
原因:
- 当前系统的产品层本来就是“一个产品行 + 多资产”
- SBAS publish bundle 天然适合这种结构
4.3 result_assets.asset_role 约定
建议统一定义以下资产角色:
timeseries_cubevelocity_h5velocity_geotifftemporal_coherence_h5temporal_coherence_geotiffquality_mask_h5quality_mask_geotiffpreview_pngdiagnostic_pngconfigquality_summaryinput_manifest
4.4 精轨 provenance 建议
最小建议不是新表,而是先把运行级 summary 做扎实。
在 ps_timeseries_runs.orbit_summary_json 中记录:
- 每景影像日期
- 轨道 stem
- 轨道 XML 路径
- 来源
existing_xml/generated_from_txt
- checksum
- 是否来自 ISCE2 pool
Phase 2 再考虑单独抽 orbit_assets。
5. 路径与目录设计
5.1 总原则
- 原始影像目录不复制
- 工作目录和发布目录必须分离
- 发布目录一旦注册,尽量不再原地改写
5.2 推荐目录结构
Windows 侧:
<TIMESERIES_WORK_ROOT>\{run_id}\
input\
stack\
mintpy\
logs\
publish\
WSL 侧:
/mnt/.../timeseries_work/{run_id}/
input/
stack/
mintpy/
logs/
publish/
正式发布根目录:
<PSINSAR_PRODUCT_DIR>\{year}\{run_id}\
manifest.json
assets/
preview/
metadata/
5.3 路径服务
不要在 job handler、router、script wrapper 里反复手拼 /mnt/z。
新增:
timeseries_paths.py
统一负责:
- Windows -> WSL 路径转换
- 运行目录分配
- 发布目录分配
- 产物入口路径解析
6. 工作流设计
推荐 workflow name:
isce2_sbas_mintpy_v1
推荐步骤如下。
Step 1 prepare_stack_input
输入:
batch_id- 运行参数
动作:
- 读取
ps_task_items - 校验栈大小、方向一致性、日期连续性
- 固化
input_snapshot_json - 解析 DEM、轨道池、输出路径
- 生成 stack manifest
产物:
stack_input_manifest.jsonsource stack snapshot
Step 2 materialize_stack_scenes
动作:
- 复用现有实验脚本逻辑
- 为每景影像生成
SLC/<date>/ - 显式写入
sensor.orbitFile
产物:
- 物化后的 SLC
materialization_summary.json
Step 3 run_isce2_stack
动作:
- 运行 stripmapStack 预处理链
- 生成几何、配准、干涉网络基础产物
产物:
- stack work 目录
- run files
- log files
Step 4 run_mintpy_sbas
动作:
- 运行
smallbaselineApp - 生成
timeseries.h5、velocity.h5、temporalCoherence.h5 - 记录 MintPy 版本、参数模板、参考点信息
产物:
- MintPy work 目录
- inversion quality summary
Step 5 export_publish_bundle
动作:
- 地理编码
- 导出 GeoTIFF
- 生成 preview
- 写出
manifest.json
产物:
publish/.../manifest.jsonassets/preview/metadata/
Step 6 register_psinsar_product
动作:
- 调用
psinsar_catalog_service - 把 bundle 注册进
result_products - 回填
ps_timeseries_runs.manifest_path_*
产物:
result_products一条记录result_assets多条记录
Step 7 post_check
动作:
- 校验关键资产是否存在
- 校验
velocity.tif/geo_timeseries.h5/temporalCoherence.tif - 生成最终健康状态
7. 调度与任务设计
7.1 一个用户可见主任务
建议每次 SBAS 运行只创建一个主 system_task:
task_type = RUN_PSINSAR_PRODUCTION
用户在 UI 上主要看这条任务。
7.2 一个工作流运行
创建:
workflow_run
每个步骤单独入 workflow_steps。
worker 现有能力已经支持:
- job 完成后自动
mark_step_completed - job 失败后自动
mark_step_failed
因此不需要再发明新的 step 状态机制。
7.3 建议 job types
TIMESERIES_PREP_STACKTIMESERIES_MATERIALIZE_STACKTIMESERIES_RUN_ISCE2_STACKTIMESERIES_RUN_MINTPY_SBASTIMESERIES_EXPORT_PRODUCTSTIMESERIES_REGISTER_PRODUCTSTIMESERIES_POST_CHECK
8. 环境设计
8.1 运行环境原则
不修改现有 D-InSAR 使用的 isce2 环境。
SBAS 生产使用独立统一环境:
- WSL distro:
Ubuntu-24.04 - conda env:建议
isce2_mintpy_v1
这是当前实验已验证成功的路线。
8.2 配置隔离
不要直接复用所有 ISCE2_* 配置项来承载 SBAS。
建议新增:
TIMESERIES_ENABLEDTIMESERIES_WSL_DISTROTIMESERIES_PYTHONTIMESERIES_ENV_NAMETIMESERIES_WORK_ROOTTIMESERIES_PUBLISH_ROOTTIMESERIES_DEM_PATHTIMESERIES_ORBIT_POOL_ISCE2TIMESERIES_WATER_MASK_ROOTTIMESERIES_ALLOW_SYNTHETIC_WATER_MASKTIMESERIES_SMALLBASELINE_TEMPLATE
其中可允许默认回退:
TIMESERIES_WSL_DISTRO -> ISCE2_WSL_DISTROTIMESERIES_DEM_PATH -> ISCE2_DEM_PATHTIMESERIES_ORBIT_POOL_ISCE2 -> ORBIT_POOL_ISCE2
9. 精轨、DEM、水体掩膜策略
9.1 精轨
直接复用现有:
- source orbit scan
- ENVI / ISCE2 orbit pool sync
- LT-1 orbit XML 解析/生成 helper
生产要求:
- 每景影像在运行前就解析到明确 orbit XML
- 运行记录中保存 orbit provenance
9.2 DEM
生产态不依赖在线下载。
要求:
- 本地 DEM 路径必须可读
- 运行记录中固定写入 DEM 路径与版本描述
9.3 水体掩膜
这里要区分实验和生产。
实验态:
- 允许
synthetic waterMask fallback
生产态建议:
- 优先本地水体数据源
- 若只能 synthetic fallback,则产品可生成,但
health_status = WARN - UI 上必须显式标注“使用了 synthetic water mask”
10. psinsar 产品注册策略
10.1 产品行设计
result_products 一条记录代表一个 SBAS bundle,而不是单个文件。
推荐约定:
product_id = psinsar_<run_id>catalog_name = psinsarproduct_type = psinsar_bundledisplay_name = SBAS_<direction>_<reference_date>_<run_id short>source_primary_path = assets/geo_timeseries.h5primary_asset_path = assets/velocity.tifpreview_path = preview/velocity_preview.png
10.2 产品详情展示
产品详情页重点展示:
- 栈日期列表
- 参考日期
- 方向
- DEM
- 轨道来源
- 速度图预览
- 时间序列 cube 下载
- 质量图层下载
- 运行日志入口
11. API 设计
11.1 生产接口
POST /timeseries-production/runs- 基于
batch_id提交一次 SBAS 运行
- 基于
GET /timeseries-production/runs- 列表
GET /timeseries-production/runs/{run_id}- 详情
POST /timeseries-production/runs/{run_id}/retry-step- 重试单步
POST /timeseries-production/wsl-check- 环境检查
11.2 产品接口
GET /ps-products/catalog-statusPOST /ps-products/rebuildGET /ps-productsGET /ps-products/{product_id}GET /ps-products/{product_id}/preview
12. 前端页面设计
12.1 ps_production
页面模块:
- 选择已有
ps_task_batch - 设定运行参数
- 提交运行
- 查看步骤进度
- 查看失败原因和重试按钮
12.2 ps_products
页面模块:
- 产品列表
- AOI / 时间 / 方向 / 状态筛选
- preview 缩略图
- 一键跳转到产品详情
12.3 psinsar_results
页面模块:
- 地图展示
velocity.tif - 质量图层切换
- 时间序列主资产下载
- 后续再扩展点时序查询
13. 推荐实施顺序
Phase A:最小生产主链
- 新增
ps_timeseries_runs - 新增
timeseries_production.py - 新增 workflow factory
- 先直接复用实验脚本作为受控 worker wrapper
目标:
- 系统能发起一次 SBAS 运行
- 能看到步骤状态
- 能落到 publish bundle
Phase B:产品注册
- 新增
psinsar_catalog_service.py - 新增
ps_products.py - 注册
psinsar.publish.v1
目标:
- 发布 bundle 能在系统里被浏览和重建
Phase C:稳定性与治理
- 增加 orbit provenance
- 增加 DEM / water mask 质量标记
- 增加 post-check 和 health-check
- 完善路径服务
Phase D:UI 完善
- 补生产页
- 补产品页
- 补结果页
14. 最终建议
结合当前审计结果,最稳妥的路线不是“直接把 SBAS 纳入现有 D-InSAR 产品通道”,而是:
- 继续复用
ps_task_batches作为输入栈定义 - 新增
ps_timeseries_runs作为生产主记录 - 复用现有任务、作业、工作流骨架
- 以 publish bundle 为产品注册边界
- 先独立实现
psinsar_catalog_service,避免影响现有 D-InSAR 生产
这样可以做到:
- 技术上最贴合现有系统
- 风险上最小
- 后续也最容易把实验链稳稳升级成正式生产链