Commit Graph

308 Commits

Author SHA1 Message Date
a03798418f fix: 增强 PROJ/GDAL 环境检测 — 多级回退搜索策略
问题: sys.prefix 指向 test_env,该环境不含 GDAL/PROJ 数据文件,
导致 _find_and_set_gdal_env() 找不到 proj.db。

修复: 按优先级扩展搜索路径:
  1. CONDA_PREFIX 环境变量(当前激活的 Conda 环境)
  2. sys.prefix(Python 安装前缀)
  3. CONDA_ROOT / MAMBA_ROOT_PREFIX
  4. 从 PATH 推断 conda 安装根目录
  5. 硬编码回退(WQ_GUI 路径 + 常见目录 ProgramData)
每个前缀尝试 Windows (Library/share/...) 和 Linux (share/...) 子目录。
找不到时打印已搜索前缀数量供用户诊断。
2026-07-07 10:38:16 +08:00
2b5c77131e fix: BIP 格式兼容 — 鲁棒 HDR 查找 + find_band_number GDAL 回退
问题: 用户导入 3ref.bip 文件,step2 报 FileNotFoundError: 3ref.hdr 不存在。

根本原因: get_hdr_file_path() 只用 os.path.splitext()[0]+.hdr,
对于 3ref.bip 只查找 3ref.hdr,不兼容 3ref.bip.hdr 等其他命名规范。

修复内容:

**util.py (核心):**
- get_hdr_file_path(): 改为多候选路径查找(按优先级):
  3ref.hdr → 3ref.bip.hdr → 3ref.HDR → 3ref.bip.HDR
- find_band_number(): 三级回退 —
  1) ENVI .hdr 文件 → spectral 解析
  2) GDAL 元数据域 (ENVI/wavelength, WAVELENGTH_1..N)
  3) 线性估算 (假设 400-1000nm 或 400-2500nm)
- 新增 _read_wavelengths_from_gdal() 辅助函数

**同模式修复 (4 处):**
- get_spectral.py: get_hdr_file_path() 多候选
- get_spectral-test.py: 同上
- waterindex_inversion/__init__.py: 两处 hdr 构造均改为多候选
- sampling.py: 波长读取的 hdr 查找改为多候选
2026-07-07 10:32:02 +08:00
1f6c81158b fix: 动态查找 PROJ/GDAL 路径 + Warp 1 像素浮点舍入容错
**water_quality_gui_v2.py:**
- 废弃硬编码 conda_env 路径
- 新增 _find_and_set_gdal_env(): 基于 sys.prefix 自动推断
  Library/share/proj 和 Library/share/gdal,验证 proj.db 存在后
  强设 PROJ_LIB 和 GDAL_DATA 环境变量
- 兼容 Windows (Library/share/...) 和 Linux/Mac (share/...) 路径

**preview_generator.py _warp_mask_to_image():**
- 尺寸验证从严格相等改为 ±2 像素容差
- 新增 _snap_array_to_shape(): warp 输出与 target_shape
  相差 ≤2px 时自动 slice(截断)或 pad(填充),不再回退到盲读模式
- 解决坐标系转换浮点舍入导致的 1048x522 vs 1047x521 问题
2026-07-07 10:01:31 +08:00
78818bbc50 fix: 在 water_quality_gui_v2.py 顶部强制绑定 Conda 环境的 GDAL/PROJ 路径,防止系统环境变量干扰 2026-07-07 09:55:53 +08:00
826f110894 fix: 防御性编程重构 — 栅格空间对齐 + NoData 处理 + 高危代码加固
**核心修复 (preview_generator.py):**
- 废弃 _align_mask_to_image() (numpy crop/pad 在地理空间上错误)
- 新增 _warp_mask_to_image(): 使用 gdal.Warp 将掩膜重采样到与底图
  完全一致的像素网格,处理旋转/偏移/投影差异
- 新增 _normalize_mask(nodata_value): 正确的掩膜值域自劢归一间 (0/1 vs 0/255)
- 修复 alpha = mask_data/255.0 → mask_data (掩膜是二值 0/1, 不是 0/255)
- 面积计算 valid_pixels 使用 warp 前数据排除 nodata 背景

**新增防御工具模块:**
- spatial_validator.py: SpatialAlignmentError 自定义异常 +
  validate_two_rasters() / validate_spatial_alignment() 强制空间一致性检查 +
  has_rotation() / get_pixel_resolution() 诊断工具
- nodata_handler.py: read_band_safe() / read_bands_safe() 自动 NoData→nan +
  read_band_masked() 返回 MaskedArray + create_valid_mask()

**P0 高危代码集成 (3处):**
- sampling.py: 耀斑掩膜与水体掩膜 bool 运算前验证 numpy shape 一致
- find_severe_glint_area.py: 栅格 mask 读取后验证 dims+GT+projection 对齐
- waterindex_inversion/__init__.py: mask 与 BSQ 维度验证, 不一致时优雅降级

**旋转影像兼容性修复:**
- extract_water_area.py: pixel_size = sqrt(gt[1]^2+gt[2]^2) 使用勾股定理
  正确计算旋转影像的像素分辨率
2026-07-07 09:10:40 +08:00
c46f78e69d fix: 补齐缺失的 handler 文件 + IDW 插值退化检测 + V1 代码归档 2026-07-06 15:57:29 +08:00
f3aca09df4 1.2.1 2026-07-06 10:01:55 +08:00
34ed062c77 1.2.1 2026-07-01 17:35:57 +08:00
385e5915af 格式统一 2026-07-01 17:33:52 +08:00
1824d62d10 格式统一 2026-07-01 15:12:25 +08:00
1611001a72 格式统一 2026-07-01 13:19:46 +08:00
8de73db80e 格式统一 2026-07-01 11:32:32 +08:00
a3c20d3e49 格式统一 2026-07-01 09:57:27 +08:00
c793ea2204 格式统一 2026-06-30 14:12:12 +08:00
9e433395f4 feat: 波长偏移修正 + 项目架构文档
- BandMathCalculator 支持 wavelength_offset 参数,公式波长统一加减偏移后匹配传感器波段
- WaterQualityIndexCalculator 全链传递偏移量 (band_math → calculate_one → calculate_many)
- WaterIndexCsvProcessor / Step7Handler / DataPreparationStep 传播偏移参数
- Step7/Step10 面板新增 QDoubleSpinBox 波长偏移控件 (±200nm, 默认0)
- 偏移控件去除单位后缀,避免编辑时需手动移动光标
- 新增 ARCHITECTURE.md 完整项目架构文档
2026-06-30 13:13:38 +08:00
8ff5b08190 imput导入修正,去除掉废弃内容 2026-06-30 11:32:40 +08:00
f05916bc3a 步骤四的采样点和对应的光谱图像展示修正 2026-06-30 10:45:20 +08:00
73cb019a4a refactor: 重构所有面板 update_from_config 为文件系统扫描模式
=== 核心变更 ===
- _step_path_resolver 新增 scan_work_dir_for_input() 统一文件扫描工具
- 基于 _SCAN_TABLE 映射表,按 output_type 自动扫描 work_dir 子目录
- 支持扩展名匹配(.dat/.tif/.bsq/.csv 等)和文件名关键词匹配
- 按 mtime 排序,返回最新匹配文件

=== 各面板重构 ===
- step2/3/4/6: 废弃 main_window.stepX_panel 跨面板读取
  统一改为 scan_work_dir_for_input(work_dir, 'water_mask/glint_mask/deglint_image')
- step6: 移除对 step1/2/3/5 panel 的4处跨面板依赖
- step8: 替换 _resolve_training_csv_from_workdir 为 scan_work_dir_for_input
  优先级:training_spectra_indices -> training_spectra
- step9: 替换 _resolve_latest_wqi_test_csv 为 scan_work_dir_for_input
  废弃 factory.get_panel('step4_sampling') 和 get_panel('step8_ml_train')
- step10: 替换3层回退链为 scan_work_dir_for_input('sampling_points')
- step11: 替换 factory.get_panel('step9')/('step1') 为文件扫描

=== 删除的冗余方法 ===
- step8._resolve_training_csv_from_workdir (~55行)
- step9._resolve_latest_wqi_test_csv (~56行)

=== 数据流原则 ===
1. pipeline context 为第一顺位(执行时内存状态)
2. 文件系统扫描为回退(仅信任硬盘上真实存在的文件)
3. 彻底禁止面板间 UI 控件互相读取
2026-06-30 09:53:23 +08:00
1bdd623fe7 style: Step4 图表中文排版升级,对齐Step12风格
- 添加 matplotlib rcParams 中文字体配置(Microsoft YaHei / SimHei)
- 散点图标题→'采样点空间分布',坐标轴→'经度/X'、'纬度/Y'
- 光谱图标题→'采样点 ID: X 光谱曲线',坐标轴→'波长/特征'、'反射率'
- 悬停提示框中文化:ID + 经度 + 纬度
- 标题字号统一为 fontsize=14 fontweight='bold' pad=12
- 轴标签字号统一为 fontsize=11
2026-06-30 09:45:50 +08:00
48d17ef0ca fix: 全局UX修复与Step4交互可视化重构
=== 自动填入过于激进(幽灵路径级联)===
- 所有面板 update_from_config 移除 os.makedirs(),目录创建留给 pipeline 执行
- 输出路径仅 widget 为空时填入默认值,不覆盖用户已选
- 输入路径从上游读取后添加 os.path.exists() 检查,阻断幽灵路径级联
- panel_factory._replay_live_panel_inputs 广播前校验文件确实存在
- step10 update_from_config 添加 os.path.isfile() 存在性检查
- 清理 step8/9/11 中冗余局部 import os(修复 UnboundLocalError)

=== 输出目录缺失 ===
- step7 新增 output_file FileSelectWidget,默认路径 7_Water_Quality_Indices/
- step9 output_file 从文件模式改为目录模式 (Directories)

=== 空目录自动创建 ===
- step12 _setup_prediction_output_dirs 移除 mkdir() 调用,改为只读日志

=== 过期依赖与缺失 import ===
- panel_registry Step10 依赖 bsq_file→sampling_csv_file(匹配 CSV 模式重构)
- step7 添加缺失的 import pandas as pd(修复 NameError)

=== 导航与 UI 一致性 ===
- water_quality_gui_v2 新增 _select_first_nav_item(),启动时默认选中第一项
- step1 输出卡片对齐 step8 风格
- step8 补充缺失的样式表和统一边距

=== Step4 交互式光谱探针重构 ===
- 左右分栏 QSplitter 布局:左侧控制区 + 右侧 Matplotlib 视图
- 1x2 子图:ax1 散点图 + ax2 光谱曲线
- Hover 悬停 Annotation 显示坐标,Click 点击高亮+绘制光谱
- NavigationToolbar2QT 工具栏(保存/缩放/平移)
- 自动检测坐标列和波段列,完善异常处理
2026-06-30 09:38:27 +08:00
DXC
e337f01312 全局修正 2026-06-29 16:16:55 +08:00
DXC
2788fb3fe1 全局弹窗修正 2026-06-29 15:21:30 +08:00
DXC
61e06dd789 步骤十三页面修改 2026-06-29 15:15:09 +08:00
DXC
e121b02e34 Step8/9 UX: feature_start 改 QComboBox + 多源 CSV 优先回退 2026-06-29 14:40:39 +08:00
DXC
b82efc1e52 步骤十二页面修改 2026-06-29 14:31:31 +08:00
DXC
c6c0b8fdf5 步骤十一页面修改 2026-06-29 11:11:32 +08:00
DXC
ef24398df9 步骤十页面修改 2026-06-29 10:16:12 +08:00
DXC
14ea72a4e7 步骤九页面修改 2026-06-26 17:13:14 +08:00
DXC
23f391eedf 步骤八页面修改 2026-06-26 16:59:24 +08:00
DXC
9ab916a61c 步骤七页面修改 2026-06-26 16:43:28 +08:00
DXC
abbe218608 步骤六页面修改 2026-06-26 13:56:57 +08:00
DXC
5fb2db4a07 步骤五页面修改 2026-06-26 13:54:09 +08:00
DXC
7293ddd5ee 步骤四页面修改 2026-06-26 13:51:10 +08:00
DXC
6e4f0f5527 步骤二页面修改 2026-06-26 13:24:56 +08:00
DXC
e54c2b8fe6 步骤一页面修改 2026-06-26 13:07:22 +08:00
DXC
f63e6bce05 整体框架修改 2026-06-26 09:47:52 +08:00
DXC
ea5d80041d 整体框架修改 2026-06-26 09:45:11 +08:00
DXC
bcd1ce371e 页面4样式修改 2026-06-26 09:45:00 +08:00
DXC
429ed3c1c1 测试修改 2026-06-25 18:11:50 +08:00
DXC
d327c6c267 fix(report_word): Minimax v2 接口兼容 + 缓存防毒化自愈 2026-06-25 16:45:50 +08:00
DXC
43f50ec07b 测试修改 2026-06-25 15:50:02 +08:00
DXC
67aaaaa6b2 refactor(step10): 拆分 WaterIndexCsvProcessor 到独立子模块 + smoke test 2026-06-24 12:52:56 +08:00
DXC
6a1014afcc refactor(step10_new_arch): 同步新架构 view + service 到散点 CSV 模式 2026-06-24 12:44:01 +08:00
DXC
08a9a0337d refactor(step10_panel): 切换到散点 CSV 模式 UI + Worker 2026-06-24 11:43:44 +08:00
DXC
b0ace0bde8 feat(step10): 新增 WaterIndexCsvProcessor 散点处理入口 2026-06-24 11:39:52 +08:00
DXC
c5a82ec342 refactor(gui/sidebar): 重组导航为四模块 + 扁平无框蓝色高亮主题 + 中括号移除
数据层(panel_registry.py):13 个 step 从「阶段一/二/三/四」重组为四个模块

  模块一 影像预处理(step 1-3)

  模块二 特征工程与数据(step 4-7)

  模块三 模型训练与反演(step 8-10)

  模块四 制图与成果汇编(step 11-13)

step_id 顺序、tab_index、面板绑定、Tab 路由全部保持零变化

文本层(water_quality_gui.py / v2):移除 └─ 字符前缀

样式层(styles.py:get_sidebar_stylesheet):扁平无框 + 蓝色高亮主题

  - 容器 QListWidget 无框化(border: none / outline: none / 透明背景)

  - 步骤项 padding 8px 6px + margin 2px 8px + border-radius 4px

  - hover 极浅蓝灰 #F0F4F8;selected 饱和蓝 #0078D4 + 白字 #FFFFFF

  - 分类头(stage_header):!enabled 选择器锁定 → 蓝色 #0078D4 + 加粗 + 上下间距

Python 代码侧:stage_item.setForeground 硬编码 #0078D4、stage_font.setBold(True)

作为 QSS 失效兜底 + 代码意图自解释

末尾迭代:四个模块名移除 [ ] 中括号(极简风)
2026-06-23 16:50:30 +08:00
DXC
948d1d8acd 测试修改 2026-06-23 16:12:58 +08:00
DXC
e907e73810 测试修改 2026-06-23 15:26:55 +08:00
DXC
b8d263e494 测试修改 2026-06-23 14:39:54 +08:00
DXC
c4aa246c95 fix(viz_reports): plot_scatter_true_vs_pred 指标文本框移到图例下方 2026-06-23 08:41:40 +08:00