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

555 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PyINT 输入资产适配设计
**日期**: 2026-04-19
**状态**: 总体设计
**范围**: `Task_*` 路径适配、PyINT DEM 管理、LT-1 精密轨道治理、Gamma 配对前置条件、运维自检与前端入口
## 1. 结论
本次设计的核心结论如下:
1. 用户侧继续沿用现有的 `Task_*` 输入模式,不要求手工准备原生 PyINT 项目目录,也不允许直接把任意外部路径当作长期运行依赖。
2. 需要在现有 `pyint_engine -> run_lt1_pyint_pipeline.py` 之间补一层“输入资产适配层”,把 `Task_*`、DEM、精密轨道统一解析为系统托管的运行输入。
3. DEM 可以在一期做到“系统托管且真实参与计算”,推荐优先走“本地 FABDEM/DEM 瓦片源 + PyINT 本地生成 DEM 产物”的方案,而不是直接复用 ISCE2 的 `.wgs84` 成品 DEM。
4. LT-1 精密轨道在当前 PyINT 原生 LT-1 导入链路里,还没有现成的“接入系统轨道池并直接参与计算”的钩子。一期先做“治理级校验 + 按任务解析 + 随跑记录 + 可选准入阻断”,二期再补“真正参与 PyINT/Gamma 计算”的桥接。
5. 一期不必改数据库结构,先把输入资产记录写入 `.dinsar_run.json``pyint_run_summary.json` 和结果 manifest 的扩展摘要。二期只有在需要按 DEM/轨道版本检索历史时才改库,并且必须走现有数据库自维护迁移机制。
6. 前端主入口应放在现有 D-InSAR 生产面板的 PyINT 引擎区域;运维自检面板只保留状态摘要,不再堆叠新的操作区。
## 2. 现状与缺口
### 2.1 已经具备的部分
- `PyINT` 代码已经收编到仓库内 `third_party/PyINT`,不再依赖仓库外绝对路径。
- 当前后端已经支持:
- `root_dir` 为单个任务目录,或为包含多个 `Task_*` 子目录的父目录
- 对每个任务递归发现 `master/``slave/` 下的 `LT1*.tar.gz`
- 自动生成 `ifgram_list.txt`
- 自动生成 PyINT template
-`backend/runtime/pyint_work` 下构造 PyINT 工作区并调用 `pyintApp.py`
- 当前系统已有成型的精轨治理链路:
- `MONITOR_ORBIT_DIR` 作为源目录
- `ORBIT_POOL_ENVI` 作为 LT-1 `.txt` 精轨池
- `ORBIT_POOL_ISCE2` 作为 ISCE2 `.xml` 精轨池
- `orbit_converter.py` 已支持同步、修复、隔离和一致性检查
- 当前系统已有成型的健康检查和目录治理链路:
- `health_service.py`
- `root_registry_service.py`
- 结果目录扫描和 manifest catalog
### 2.2 目前还没有解决的部分
- 当前 PyINT 集成只解决了“`Task_*` 到 PyINT 工作区”的映射,没有解决“系统托管 DEM / 系统托管精轨资产如何进入 PyINT”。
- 当前 `PYINT_DEM_ROOT` 只是 PyINT 的运行目录或缓存目录,不等价于“系统已经为本次任务解析好了 DEM 输入策略”。
- 当前 LT-1 PyINT 导入脚本并没有直接消费系统里的 `LT1*_GpsData_GAS_C_YYYYMMDD.txt` 精轨池。
- 当前前端也没有给 PyINT 提供“提交前资产预检/预览”的位置。
### 2.3 一个必须明确的现实约束
当前 vendored `PyINT` 的 LT-1 流程里:
- DEM 侧已有明确入口,`makedem_pyint.py` 可以走本地 `fabdem_dir` 或 OpenTopography。
- 精轨侧对 LT-1 没有现成的“使用系统 `.txt` 精轨池”的显式接口,现有 LT-1 导入脚本更接近“从压缩包和 XML 元数据生成 SLC 参数”。
因此本方案必须分两层描述精轨:
1. 治理层接入:系统知道本次任务应该使用哪份精轨,能阻断缺失任务,能把依赖记录下来。
2. 计算层接入:该精轨是否真的被 PyINT/Gamma 的 LT-1 导入过程消费。
一期只能承诺第一层,第二层需要专门桥接。
## 3. 总体方案
### 3.1 新增一层输入资产适配服务
建议在 `pyint_service.py` 旁边新增或内聚出一层输入资产适配职责,例如:
- `resolve_pyint_tasks(root_dir)`
- `resolve_pyint_dem_asset(task_context)`
- `resolve_pyint_orbit_assets(task_context)`
- `materialize_pyint_input_assets(run_context)`
- `build_pyint_input_preview(root_dir)`
其职责不是替代 PyINT,而是在系统生产语义和 PyINT 原生语义之间做转换。
### 3.2 总体执行链路
建议链路如下:
`前端生产面板 root_dir`
-> `validate_pyint_root_dir()`
-> `PyINT 输入资产适配层`
-> `每个 Task_* 解析任务身份、DEM、精轨`
-> `运行目录 materialize`
-> `run_lt1_pyint_pipeline.py`
-> `PyINT / Gamma`
-> `pyint_run_summary.json + .dinsar_run.json`
-> `结果发布 / catalog`
### 3.3 不再要求用户准备 PyINT 原生目录
用户仍然只需要提供:
- 单个 `Task_YYYYMMDD_YYYYMMDD`
- 或者一个包含多个 `Task_*` 的批次根目录
系统内部自行生成:
- `project_name`
- `template`
- `DOWNLOAD/`
- `ifgram_list.txt`
- `input_assets/`
- `native output`
这保证 PyINT 继续是“受控执行器”,不是“要求用户手工维护目录结构的第二套系统”。
## 4. 与现有 `Task_*` 路径的配合方式
### 4.1 用户输入模式
沿用当前模式,不新增新的路径输入方式:
- 模式 A:直接选一个 `Task_*`
- 模式 B:选一个包含多个 `Task_*` 的父目录
任务目录仍要求至少满足:
- `master/`
- `slave/`
- 目录下可递归发现 `LT1*.tar.gz`
可选但推荐继续保留:
- `.dinsar_pair.json`
### 4.2 任务解析规则
建议继续沿用当前逻辑,并把它明确固化为正式约束:
1. `Task_*` 是业务输入根,不是 PyINT 工作区。
2. `master/``slave/` 下面允许多层子目录,但最终必须能发现原始压缩包。
3. 任务身份优先从 `.dinsar_pair.json` 读取。
4. 缺失时再从任务目录名和压缩包文件名推导:
- `task_alias`
- `pair_key`
- `master_date`
- `slave_date`
### 4.3 运行期目录建议
建议把每次运行的托管结构固定为:
```text
backend/runtime/pyint_work/<pair_key>/<run_key>/
input_assets/
task_manifest.json
orbits/
dem/
<project_name>/
DOWNLOAD/
ifgram_list.txt
...
backend/runtime/pyint_templates/<pair_key>/<run_key>/
<project_name>.template
backend/runtime/pyint_output/<pair_key>/<run_key>/native/
pyint_run_summary.json
.dinsar_run.json
ifgrams/
...
```
原则:
- 原始 `Task_*` 只读,不回写。
- 每次运行独立目录,避免不同 run 相互污染。
- DEM、轨道、任务解析结果要在 `input_assets/` 下留痕。
## 5. DEM 方案
### 5.1 不建议直接把 ISCE2 DEM 方案硬套给 PyINT
当前系统已有 `ISCE2_DEM_PATH`,它对应的是 ISCE2 直接消费的成品 DEM。
但当前 PyINT 的 DEM 处理逻辑更接近:
- 先根据 master SLC 范围解析 DEM 覆盖区域
- 再通过 `makedem_pyint.py`
- 结合 `fabdem_dir` 或 OpenTopography
-`DEMDIR` 下生成 PyINT / Gamma 所需的 DEM 产物
因此一期不建议把 `PYINT_DEM_SOURCE` 简单绑定为 `ISCE2_DEM_PATH`
### 5.2 推荐的 DEM 分层
建议把 PyINT 的 DEM 分成三层:
1. DEM 源
- 本地 FABDEM/DEM 瓦片根目录
- 或 OpenTopography 在线源
2. DEM 运行缓存
- 即当前 `PYINT_DEM_ROOT`
3. 本次任务解析后的 DEM 产物
- 位于 `PYINT_DEM_ROOT/<project_name>/...`
-`generate_rdc_dem.py``geocode_gamma.py` 等步骤消费
### 5.3 推荐配置
建议新增或明确以下配置:
```ini
PYINT_DEM_MODE=local_fabdem|opentopo
PYINT_FABDEM_ROOT=
PYINT_OPENTOPO_DEM_TYPE=SRTMGL1
PYINT_DEM_ROOT=
PYINT_DEM_STRICT=true
```
说明:
- `PYINT_DEM_MODE=local_fabdem` 为推荐默认值。
- `PYINT_FABDEM_ROOT` 指向本机统一维护的 FABDEM/DEM 瓦片目录。
- `PYINT_DEM_ROOT` 继续作为 PyINT DEM 运行缓存根。
- 若后续确实验证可直接复用某个成品 DEM,再新增单独模式,不要和一期混在一起。
### 5.4 运行时行为
当用户提交 PyINT 任务时:
1. 适配层先解析 DEM 模式。
2. 若为 `local_fabdem`
-`fabdem_dir` 写入本次运行生成的 template
- `DEMDIR` 指向本次受控缓存根
3. 若为 `opentopo`
- 只在运行时注入 API key,不把敏感值写入仓库文档或 `.env.example`
4. 运行完成后记录:
- DEM 模式
- DEM 源根目录
- 生成产物目录
- 关键 DEM 文件是否生成成功
### 5.5 DEM 与前端的关系
不建议在前端让用户手工输入单次 DEM 路径。
推荐做法是:
- 前端只展示“当前 DEM 策略”
- 例如:
- `本地 FABDEM`
- `OpenTopography`
- `未配置`
- 如果 DEM 不可用,则在 PyINT 引擎区阻断提交
## 6. 精密轨道方案
### 6.1 一期目标不是“假装已经真正进计算”
当前 LT-1 PyINT 原生脚本没有明确消费系统精轨池的接口,因此一期要把目标定义准确:
- 系统必须能按任务解析 master/slave 对应的精轨文件
- 系统必须能知道精轨是否缺失
- 系统必须把这次运行实际匹配到的精轨记录下来
- 系统必须能根据策略决定“警告放行”还是“阻断提交”
但不能在未完成桥接前,对外宣称“精轨已经真实参与 LT-1 PyINT 计算”。
### 6.2 一期建议的精轨策略
建议精轨配置分为:
```ini
PYINT_ORBIT_POLICY=validate_only|require_txt|stage_txt
PYINT_ORBIT_POOL_TXT=
PYINT_RECORD_INPUT_ASSETS=true
```
默认建议:
- `PYINT_ORBIT_POOL_TXT` 为空时默认继承 `ORBIT_POOL_ENVI`
- `PYINT_ORBIT_POLICY=require_txt`
三种策略含义:
- `validate_only`
- 找得到则记录
- 找不到只警告
- `require_txt`
- 找不到直接阻断运行
- `stage_txt`
- 除了要求存在,还把匹配到的轨道文件复制或硬链接到本次运行目录
### 6.3 轨道解析规则
对每个 task,按如下顺序解析:
1.`.dinsar_pair.json`、原始压缩包文件名或元数据确定:
- 卫星 `LT1A/LT1B`
- `master_date`
- `slave_date`
2. 到系统轨道池中查找:
- `LT1A_GpsData_GAS_C_YYYYMMDD.txt`
- `LT1B_GpsData_GAS_C_YYYYMMDD.txt`
3. 分别解析 master/slave 结果
4. 形成本次运行的轨道摘要
### 6.4 与现有轨道治理链路的关系
PyINT 不应新建第二套精轨目录。
应直接复用现有治理链路:
- 源目录:`MONITOR_ORBIT_DIR`
- 运行池:`ORBIT_POOL_ENVI`
- 一致性修复:`orbit_converter.py`
- 健康检查:`health_service.py`
也就是说:
- PyINT 的精轨输入来源仍应是系统托管的轨道池
- 不是让用户每次在前端再手工填一条轨道路径
### 6.5 一期的落地方式
建议每次运行都在 `input_assets/orbits/` 下落盘一个轨道摘要,例如:
```json
{
"policy": "require_txt",
"pool_root": "D:\\orbit_pools\\envi",
"master": {
"date": "20250112",
"satellite": "LT1A",
"path": "D:\\orbit_pools\\envi\\LT1A\\LT1A_GpsData_GAS_C_20250112.txt",
"staged_path": "...\\input_assets\\orbits\\LT1A_GpsData_GAS_C_20250112.txt",
"resolved": true
},
"slave": {
"date": "20250309",
"satellite": "LT1A",
"path": "D:\\orbit_pools\\envi\\LT1A\\LT1A_GpsData_GAS_C_20250309.txt",
"staged_path": "...\\input_assets\\orbits\\LT1A_GpsData_GAS_C_20250309.txt",
"resolved": true
}
}
```
这一步先解决:
- 任务是否可跑
- 运行可追溯
- 后续桥接可复用
### 6.6 二期的“真正参与计算”桥接
如果要让系统精轨真实参与 LT-1 PyINT/Gamma 计算,建议单独做一个技术 Spike,候选方向有两个:
1. 修改或包装 PyINT 的 LT-1 导入步骤
-`down2slc_LT1.py` / `LT1_import_SLC_from_zipfiles1` 前后插入系统精轨桥接步骤
2. 在 PyINT 前增加一个 LT-1 预处理适配器
- 先把系统精轨和原始场景解析成更稳定的中间输入
- 再把中间输入交给 PyINT 后续流程
建议优先方向是第 1 种,因为它改动面更小。
但在明确 Gamma 对 LT-1 外部精轨的实际消费方式之前,不建议直接承诺实现周期。
## 7. Gamma 配对集成的关系
`select_pairs.py` / Gamma 精配对本身是可集成的,但它不应绕开输入资产治理。
建议关系如下:
1. 生产引擎侧先把 PyINT 的 DEM / 轨道输入治理打通。
2. Gamma 精配对继续作为“配对规划之后的精化步骤”存在。
3. 精配对任务默认继承同一套:
- WSL 环境
- PyINT vendored 代码
- 轨道治理配置
4. 前端入口仍放在 `PairPlanningPanel`,不放进运维自检。
换句话说:
- “生产引擎接入”是必要前置。
- “Gamma 配对接入”是可行的,但它应复用同一套输入资产治理,而不是另起一套路径和配置。
## 8. 运行元数据、结果治理与数据库策略
### 8.1 一期不改数据库主结构
一期建议不改库,原因是:
- 当前已有 `.dinsar_run.json`
- 当前已有 `pyint_run_summary.json`
- 当前已有结果 manifest / catalog
这些已经足够承载输入资产摘要。
### 8.2 一期建议记录的内容
建议把以下信息写入运行元数据:
- `input_assets.task_source`
- `root_dir`
- `task_dir`
- `archives.master[]`
- `archives.slave[]`
- `input_assets.dem`
- `mode`
- `source_root`
- `cache_root`
- `resolved_output_dir`
- `key_outputs`
- `input_assets.orbits`
- `policy`
- `pool_root`
- `master`
- `slave`
- `stage_mode`
### 8.3 二期改库触发条件
只有出现以下需求时再改库:
- 需要按 DEM 版本检索历史 PyINT 结果
- 需要按轨道版本检索历史 PyINT 结果
- 需要统计“某批结果使用了哪套轨道/DEM”
- 需要把 PyINT 输入资产做成后台长期查询对象
### 8.4 如果改库,必须走现有数据库自维护机制
如果进入二期改库,必须:
1.`backend/migrations/` 新增 SQL 迁移文件
2.`backend/app/db_maintenance.py` 的迁移列表中登记
3. 让现有数据库自维护机制自动执行
不允许手工改表绕过现有机制。
## 9. 健康检查、接口与前端位置
### 9.1 运维自检面板只做状态,不做主操作入口
当前健康页已经比较重,因此新增内容应控制在“状态摘要”层面:
- `PyINT enabled`
- `PyINT home`
- `PyINT WSL`
- `PyINT DEM strategy`
- `PyINT orbit policy`
- `PYINT_FABDEM_ROOT` 可读
- `PYINT_ORBIT_POOL_TXT` / `ORBIT_POOL_ENVI` 可读
不建议新增:
- 手工触发 PyINT 任务按钮
- 手工填 DEM 路径
- 手工填轨道路径
### 9.2 生产页的建议位置
`DinsarProductionPanel` 的 PyINT 引擎区域增加“输入资产预检摘要”,展示:
- 识别到的任务数
- 无效任务数
- DEM 策略
- 轨道策略
- 已解析轨道数量
- 缺失轨道数量
- 是否允许提交
### 9.3 建议新增一个轻量预检接口
建议新增:
- `POST /dinsar-production/engines/pyint/preview-input-assets`
返回:
- 任务解析结果
- DEM 配置状态
- 轨道解析状态
- 阻断原因
- 警告列表
这样前端可以在正式提交前给出明确反馈,而不是等任务进入队列后才失败。
### 9.4 PairPlanning 页的位置
Gamma 精配对仍建议放在 `PairPlanningPanel`
- 先显示已有粗配对网络
- 再提供 Gamma 精配对入口
- 不把它塞回健康检查页
## 10. 推荐实施顺序
### Phase 1:输入资产适配层
- 固化 `Task_*` 路径解析规则
- 新增输入资产预检模型
- 生成 `task_manifest.json`
- 生成 `input_assets/orbits/``input_assets/dem/` 目录
### Phase 2DEM 正式接入
- 增加 `PYINT_DEM_MODE`
- 增加 `PYINT_FABDEM_ROOT`
- 在 template 生成时注入 `fabdem_dir` / `opentopo_*`
- 把 DEM 解析摘要写入 run metadata
### Phase 3:精轨治理接入
- 增加 `PYINT_ORBIT_POLICY`
- 复用 `ORBIT_POOL_ENVI`
- 运行前做 master/slave 精轨解析
- 缺失时按策略阻断
- 把轨道文件 staging 到运行目录
### Phase 4:前端预检入口
- 生产面板显示资产预检摘要
- 健康页只增加状态项
### Phase 5:精轨计算桥接 Spike
- 研究 LT-1 PyINT/Gamma 当前导入链路如何真正消费外部精轨
- 决定是补包装步骤还是补脚本修改
### Phase 6Gamma 精配对集成
- 在配对规划页复用同一套 PyINT/Gamma 环境和资产治理策略
## 11. 最终建议
对于你提出的三个问题,建议明确回答如下:
1. `Task_*` 路径怎么配合
继续沿用现在的任务目录,不改用户输入方式;系统内部新增适配层把任务目录转换为 PyINT 工作区。
2. DEM 怎么处理
一期就做系统托管,推荐以本地 FABDEM/DEM 源目录为标准输入,由 PyINT 在受控 `DEMDIR` 下生成本次任务真正使用的 DEM 产物。
3. 精密轨道怎么处理
一期先接入系统精轨池做校验、阻断、记录和 staging;二期再补“真实参与 LT-1 PyINT/Gamma 计算”的桥接。当前实现还不能直接把这一步视为已经完成。
基于当前代码现状,最稳妥的方向不是“删掉 Task_* 模式重新发明一套 PyINT 路径”,而是“把 Task_* 保留为业务输入,把 DEM/精轨补成系统托管资产适配层”。
## 补充:现有 DEM 复用实现(2026-04-19
当前代码已补充 `PYINT_DEM_MODE=prepared_file`,用于复用系统现有 DEM 资产。
- `PYINT_PREPARED_DEM_PATH` 可显式指定现有 DEM 基础文件。
- 若该值为空,运行时会按顺序回退解析 `ISCE2_DEM_PATH``IDL_DINSAR_DEM_BASE_FILE`
- 如果目标文件同名存在 `.par`,则视为现成的 Gamma DEM,直接写入 PyINT 模板中的 `DEM=...`
- 如果目标文件没有 `.par`,但同名存在 `.xml``.hdr``.vrt`,则视为系统现有源 DEM。
- 对“系统现有源 DEM”,PyINT 在 `makedem_pyint.py` 中会根据 `master``SLC_par` 覆盖范围先裁剪局部窗口,再转换为本次任务使用的 Gamma DEM。
- 这样可以复用系统已经维护的中国区或全局 DEM,不必强制切回 FABDEM 或重新在线下载。
这个实现的约束也需要明确:
- 现有源 DEM 仍必须是可被 GDAL 打开的本地文件。
- 运行环境里仍需要 `gdal_translate` 可用,因为裁剪发生在 WSL/PyINT 侧。
- 该模式的本质不是“直接把 ISCE2 DEM 原样交给 Gamma”,而是“把系统现有 DEM 当作受控源,再为每次 PyINT 任务生成 Gamma 可消费的局部 DEM 产物”。