202 lines
6.7 KiB
Markdown
202 lines
6.7 KiB
Markdown
# IDL/ENVI 集成状态文档
|
||
|
||
> 最后更新: 2026-02-21
|
||
|
||
## 1. 架构概述
|
||
|
||
系统的 D-InSAR 生产完全依赖 ENVI 5.6 + IDL 8.8 + SARscape 5.6+。
|
||
当前采用 **envipyengine** 作为唯一执行引擎,通过 Python subprocess 调用 `taskengine.exe`。
|
||
|
||
### 执行链路
|
||
|
||
```
|
||
前端 (IDLAutomationPanel.jsx)
|
||
→ POST /api/idl/jobs/import 或 /api/idl/jobs/dinsar
|
||
→ job_handlers.py: subprocess 启动 envi_runner_cli.py
|
||
→ envi_service.py: 调用 envipyengine → taskengine.exe
|
||
→ ENVI Task 执行 (SARsImportLuTan1 / SARsMetataskInSARDisplacementGeneration)
|
||
```
|
||
|
||
### 核心文件
|
||
|
||
| 文件 | 职责 |
|
||
|------|------|
|
||
| `backend/app/services/envi_service.py` | 核心服务:工作流、预检查、状态、历史 |
|
||
| `backend/app/services/envi_runner_cli.py` | CLI 入口,subprocess 中执行工作流 |
|
||
| `backend/app/services/job_handlers.py` | 任务分发,启动 envi_runner_cli 子进程 |
|
||
| `backend/app/routers/idl.py` | API 端点 |
|
||
| `frontend/src/IDLAutomationPanel.jsx` | 前端面板 (Step 1/2 布局) |
|
||
| `frontend/src/api/idl.js` | 前端 API 客户端 |
|
||
|
||
## 2. 环境配置
|
||
|
||
### ENVI 安装路径
|
||
|
||
```
|
||
C:\Program Files\Harris\ENVI56\
|
||
├── IDL88\bin\bin.x86_64\idl.exe
|
||
├── IDL88\bin\bin.x86_64\idlde.exe
|
||
└── IDL88\bin\bin.x86_64\taskengine.exe
|
||
```
|
||
|
||
### .env 关键配置
|
||
|
||
```ini
|
||
IDL_EXECUTABLE=C:\Program Files\Harris\ENVI56\IDL88\bin\bin.x86_64\idl.exe
|
||
IDL_WORKBENCH_PATH=C:\Program Files\Harris\ENVI56\IDL88\bin\bin.x86_64\idlde.exe
|
||
IDL_WORKER_RUNTIME_DIR=...\backend\runtime\idl_worker
|
||
IDL_WORKER_DEFAULT_TIMEOUT_SECONDS=14400
|
||
IDL_WORKER_MAX_TIMEOUT_SECONDS=43200
|
||
IDL_DINSAR_DEM_BASE_FILE=D:\SRTM30m\SRTMDEM_RSP_SARscape
|
||
```
|
||
|
||
### envipyengine 配置
|
||
|
||
```python
|
||
# 已通过 envipyengine.config.set() 配置:
|
||
engine = r'C:\Program Files\Harris\ENVI56\IDL88\bin\bin.x86_64\taskengine.exe'
|
||
```
|
||
|
||
Python 环境: `C:\Users\16216\.conda\envs\InSAR\python.exe` (envipyengine v1.0.9)
|
||
|
||
## 3. 根因分析:历史集成失败
|
||
|
||
### 3.1 症状回顾
|
||
|
||
之前尝试了三种引擎均不稳定:
|
||
- `idl.exe -e` 直连:进程挂起、管道错误、idl_opserver 崩溃 (0x0000000000000001)
|
||
- `taskengine.exe` 直调:内存访问违规 (0xC0000005 / exit code 3221225477)
|
||
- `envipyengine`:单独测试通过,集成到项目后崩溃
|
||
|
||
### 3.2 根因定位
|
||
|
||
**`.env` 中 `IDL_PATH` 变量名与 IDL 内置环境变量冲突。**
|
||
|
||
- `IDL_PATH` 是 IDL 的保留环境变量,用于指定 `.pro` 文件搜索路径
|
||
- 项目 `.env` 曾使用 `IDL_PATH` 存储 `idl.exe` 的可执行文件路径
|
||
- `load_dotenv()` 将其注入 `os.environ`,子进程继承后 IDL 读到无效的搜索路径
|
||
- `taskengine.exe` 因此崩溃,退出码 `0xC0000005`
|
||
|
||
### 3.3 验证过程
|
||
|
||
三态测试确认因果关系:
|
||
|
||
| 状态 | IDL_PATH 值 | 结果 |
|
||
|------|-------------|------|
|
||
| 干净环境 | 未设置 | ✅ 成功 |
|
||
| 设置错误值 | `C:\...\idl.exe` | ❌ 崩溃 (0xC0000005) |
|
||
| 移除后恢复 | 未设置 | ✅ 成功 |
|
||
|
||
### 3.4 修复
|
||
|
||
将 `.env` 中 `IDL_PATH` 重命名为 `IDL_EXECUTABLE`,同步更新所有引用。
|
||
|
||
## 4. 当前架构设计
|
||
|
||
### 4.1 设计决策
|
||
|
||
1. **envipyengine 为唯一执行引擎** — 删除了 idl 直连和 taskengine 直调的全部代码
|
||
2. **Import → D-InSAR 固定流水线** — D-InSAR 自动检测未导入数据,先 Import 再处理(智能串联)
|
||
3. **D-InSAR 使用 metatask** — 精细参数 (filter_method 等) metatask 不支持,已移除
|
||
4. **DEM 路径为系统级配置** — 存储在 .env,不暴露到前端
|
||
5. **subprocess 执行模式** — envipyengine 在独立子进程中运行,隔离 FastAPI 主进程
|
||
|
||
### 4.2 ENVI Tasks
|
||
|
||
| Task | 用途 | 关键参数 |
|
||
|------|------|----------|
|
||
| `SARsImportLuTan1` | 导入 LuTan-1 原始数据 | `INPUT_FILE_LIST`, `ROOT_URI_FOR_OUTPUT` |
|
||
| `SARsMetataskInSARDisplacementGeneration` | D-InSAR 位移生成 | `REFERENCE_SARSCAPEDATA`, `SECONDARY_SARSCAPEDATA`, `DEM_SARSCAPEDATA`, `OUTPUT_FOLDER` |
|
||
|
||
### 4.3 智能串联逻辑 (D-InSAR 工作流)
|
||
|
||
```
|
||
对每个 Task_* 文件夹:
|
||
1. 检查 master/slave 是否有 .sml
|
||
2. 没有 → 查找 .meta.xml → 自动执行 Import
|
||
3. Import 完成后验证 .sml 生成
|
||
4. 执行 D-InSAR metatask
|
||
```
|
||
|
||
### 4.4 API 端点
|
||
|
||
```
|
||
GET /api/idl/status — 系统状态 (含 DEM 路径和可用性)
|
||
POST /api/idl/launch-workbench — 启动 IDL Workbench
|
||
POST /api/idl/inspect/import — Import 预检查
|
||
POST /api/idl/inspect/dinsar — D-InSAR 预检查 (含 Import 状态检测)
|
||
POST /api/idl/jobs/import — 提交 Import 任务
|
||
POST /api/idl/jobs/dinsar — 提交 D-InSAR 任务
|
||
GET /api/idl/jobs/recent — 最近运行记录
|
||
```
|
||
|
||
### 4.5 目录结构要求
|
||
|
||
Import 支持两种布局:
|
||
```
|
||
# Task_* 结构 (推荐)
|
||
root_dir/
|
||
├── Task_001/
|
||
│ ├── master/ → *.meta.xml
|
||
│ └── slave/ → *.meta.xml
|
||
└── Task_002/
|
||
├── master/
|
||
└── slave/
|
||
|
||
# 平铺结构
|
||
root_dir/
|
||
├── scene_001/ → *.meta.xml
|
||
└── scene_002/ → *.meta.xml
|
||
```
|
||
|
||
D-InSAR 仅支持 Task_* 结构。
|
||
|
||
## 5. 测试记录
|
||
|
||
### 5.1 envipyengine 验证 (2026-02-20)
|
||
|
||
修复 IDL_PATH 冲突后,envipyengine Import 连续测试:
|
||
|
||
| 次数 | 耗时 | 结果 |
|
||
|------|------|------|
|
||
| 1 | 100.5s | ✅ 成功 |
|
||
| 2 | 75.8s | ✅ 成功 |
|
||
| 3 | 71.8s | ✅ 成功 |
|
||
| 4 | 73.6s | ✅ 成功 |
|
||
| 5 | 81.7s | ✅ 成功 |
|
||
|
||
测试数据: `Z:\Test_data\Test_IDL_1`
|
||
|
||
### 5.2 集成测试 — Step 1: Import (2026-02-21)
|
||
|
||
重构后通过前端 → 后端 → envipyengine 完整链路测试。
|
||
|
||
- 状态: ✅ 通过
|
||
- 链路: 前端提交 → job_handlers subprocess → envi_runner_cli → envi_service → envipyengine
|
||
|
||
### 5.3 集成测试 — Step 2: D-InSAR (待测试)
|
||
|
||
- 状态: ⏳ 待测试
|
||
- 前置条件: DEM 文件 `D:\SRTM30m\SRTMDEM_RSP_SARscape` 需存在于测试机
|
||
- 智能串联 (自动 Import) 待验证
|
||
|
||
## 6. 已删除的遗留代码
|
||
|
||
重构中删除的文件 (2026-02-21):
|
||
|
||
| 文件 | 行数 | 说明 |
|
||
|------|------|------|
|
||
| `backend/app/services/idl_worker_service.py` | 2249 | 三引擎架构的巨型服务 |
|
||
| `backend/app/services/idl_runner_cli.py` | 58 | 旧 CLI runner |
|
||
| `backend/app/services/envipyengine_runner.py` | 47 | 调试用独立 runner |
|
||
|
||
清理的 .env 配置:所有 `IDL_TASKENGINE_*`、`IDL_WORKER_ENGINE`、`IDL_JOB_RUNNER_MODE`、
|
||
`IDL_IDL_*`、`IDL_WORKER_PREFLIGHT_*`、D-InSAR 精细参数 (filter_method 等)。
|
||
|
||
## 7. 已知限制
|
||
|
||
1. **D-InSAR 精细参数不可调** — metatask 不支持 filter_method、unwrapping_coh_threshold 等参数
|
||
2. **DEM 路径固定** — 从 .env 读取,不支持前端动态指定
|
||
3. **单进程串行** — envipyengine 调用 taskengine.exe 是同步阻塞的,同一时间只能执行一个 ENVI Task
|
||
4. **仅支持 LuTan-1** — Import task 为 `SARsImportLuTan1`,其他卫星数据需要不同的 Task
|