|
|
314d947d34
|
fix: 推理端三项修复 — 光谱断崖 + 全零拦截 + MNF 加载诊断
【修复 1】np.interp 边缘断崖 (3 处)
- _preprocess_dual_stream + preprocess_spectra 主/兼容重采样路径
- left/right 从 np.nan 改为 y_vals[0]/y_vals[-1] 恒定外推
- 彻底杜绝 NaN→0.0 造成的光谱曲线两端零值断崖
【修复 2】全零光谱像素 NaN 拦截
- 新增 _mask_zero_spectra_pixels() 静态方法
- 检测 NDWI 掩膜外的全零陆地像素,强制预测值为 NaN
- 覆盖 inference_pipeline / batch_inference / batch_inference_multi_data
- Kriging/IDW 插值天然忽略 NaN,制图时陆地直接留白
【新增】MNF 诊断信息在模型加载时自动输出
- _print_mnf_info_if_available() 递归查找 Pipeline 中的 MNFTransformer
- load_best_model / load_specific_model 加载后自动打印精简 3 行诊断
|
2026-07-30 12:43:29 +08:00 |
|
|
|
5410bf74ae
|
fix: 修复 sampling 垃圾列 Bug — dir() 遍历方法名泄露为 CSV 列
- 旧代码用 dir(calc) 遍历 WaterQualityIndexCalculator 的所有属性和方法名,
导致 DEFAULT_CSV/calculate_many/calculate_one/get_formula_info/list_available
等 5 个非公式名被错误写入 sampling_spectra.csv 列头,值为全 NaN。
- 改为 calc.list_available() 获取真实公式列表 + calc.calculate_many() 批量计算。
- 消除了下游推理端 load_sampling_data 面临的 5 个垃圾空列隐患。
|
2026-07-30 12:43:08 +08:00 |
|
|
|
37d3dcfd39
|
feat: NDWI 水域掩膜新增 SieveFilter 去小碎斑
- ndwi() 新增 sieve_threshold 参数(默认20像素)
- 输出后自动调用 gdal.SieveFilter 消除孤立小斑块
- sieve_threshold=0 可关闭此功能
|
2026-07-29 18:05:06 +08:00 |
|
|
|
27acf3cfe0
|
refactor: PhysicalFeature 精炼至 15 个指数 — 砍冗余比值 + 补 BGA 公式
- 删除 6 个无明确物理意义的波段比值(R700_R670 等)
- 新增 PC_ND: (R650-R620)/(R650+R620) 藻蓝归一化差值
- 最终 15 个: 通用4 + Chl5 + BGA3 + Turb3
|
2026-07-29 17:43:15 +08:00 |
|
|
|
88dd1ae1d8
|
revert: 回退 StandardScaler — 跨传感器场景下双重归一化导致推理坍缩
- 删除 Pipeline 中 scaler(StandardScaler) 步骤
- 删除 save_model 中 scaler_mean/scaler_scale 导出
- 删除 StandardScaler import
- 恢复: imputer → FeatureUnion → cleaner → SVR
- MNF 白化本身就是尺度对齐,无需额外标准化
|
2026-07-29 15:54:05 +08:00 |
|
|
|
67900c7aa6
|
fix: 补充 StandardScaler 导入
|
2026-07-29 15:46:14 +08:00 |
|
|
|
3edb73b652
|
fix: DualStream Pipeline 三项修复 — StandardScaler + 部署导出 + 推理拆弹
任务1: Pipeline 插入 StandardScaler
imputer → FeatureUnion → cleaner → scaler(StandardScaler) → SVR
MNF(≈1e4量级)与物理指数(≈1e0量级)统一尺度后入SVR
任务2: .npz 导出 scaler_mean / scaler_scale
C++端可复现 (X - mean) / scale
任务3: 推理端 train_wavelengths 缺失时直接抛异常
不再静默裸退308列导致 SimpleImputer 维度不匹配崩溃
|
2026-07-29 15:41:25 +08:00 |
|
|
|
7ecdf6a2a0
|
fix: PhysicalFeatureExtractor 除零 → 设零而非人为放大
- 之前 np.sign(x)*1e-12 在 x=0 时得 0,a/0=inf
- 固定 1e-12 兜底又会制造极端比值(14080/1e-12=1.4e16)
- 改为: 分母<1e-10 时直接设 ratio=0,不做人为放大
- 物理意义: 波段为零的像素,光谱比值无意义
|
2026-07-29 14:36:35 +08:00 |
|
|
|
60403b7a3f
|
fix: PhysicalFeatureExtractor 除零保护 — np.sign(0)=0 导致 inf
- 分母保护 np.sign(x)*1e-12 在 x=0 时变为 0,a/0 → inf
- 改为固定 1e-12 兜底 + nan_to_num + clip 安全阀
- 同时修复 ratio 型和 ratio_single 型两处
|
2026-07-29 14:35:05 +08:00 |
|
|
|
6849ff6877
|
feat: 新增 Physical_Only 预处理分支 — 纯物理特征+标准化,与 MNF A/B 对比
spectral_Preprocessing.py:
- 新增 Physical_Only 分支: Pipeline[PhysicalFeatureExtractor + StandardScaler]
- 纯物理特征流: 20个指数 → StandardScaler → SVR
- DualStream_MNF 逻辑完全不变
modeling_batch.py:
- preprocessing_methods 新增 Physical_Only
- 训练时 Physical_Only 也只取纯光谱50列
- 波长列表传递覆盖 Physical_Only
GUI:
- 两个面板同步新增「纯物理特征 (指数+标准化)」选项
|
2026-07-29 14:32:59 +08:00 |
|
|
|
f3150f7807
|
refactor: 抽取 _preprocess_dual_stream 独立方法
- preprocess_spectra 中 DualStream_MNF 分支从 25 行内联代码
变为 1 行方法调用: self._preprocess_dual_stream(spectra, metadata)
- 新方法含完整文档、fallback 路径、重采样逻辑
- 与旧 WQI 补齐/linspace 路径完全解耦
|
2026-07-29 13:23:13 +08:00 |
|
|
|
f4a927386b
|
refactor: DualStream 纯光谱输入 — 消除 WQI 冗余双向断层
训练端:
- DualStream_MNF 时只取纯光谱列(50列)传给 Pipeline
- PhysicalFeatureExtractor + MNFTransformer 都只收纯光谱
- 不再从 CSV 预读 WQI 列混入输入
推理端:
- 只做 308→50 光谱重采样,不补 WQI
- pipeline.predict() 自动完成 Physical 指数计算 + MNF 降维
- 删除 30+ 行 WQI 补齐代码
训练/推理完全对称: 纯光谱入 → FeatureUnion → SVR 出
|
2026-07-29 13:15:10 +08:00 |
|
|
|
6f1f222baa
|
style: 专题图 colormap 替换 — 高对比度 diverging → 柔和 sequential
- coolwarm/Spectral/turbo/RdYlBu 等在小差值下色阶刺眼
- 全部换为 sequential: Greens/Blues/BuPu/cividis/viridis/YlOrBr
- 保留 inferno(TDS) 和 YlOrBr(Turbidity)
|
2026-07-29 12:03:03 +08:00 |
|
|
|
3414f0207a
|
fix: DualStream_MNF 推理重建113列后交给 Pipeline.predict() 完整处理
- 之前手动调 imputer/preproc.transform 后返回, predict() 又套一层
Pipeline → SimpleImputer 收到44列不匹配113列
- 改为重建113列训练特征集,返回后让 model.predict() 完整走
Pipeline: imputer→preproc→cleaner→SVR,与训练完全一致
|
2026-07-29 10:58:26 +08:00 |
|
|
|
c9374a489b
|
fix: DualStream_MNF 推理先重采样308→训练网格再进Pipeline
- 推理数据 308 波段 vs 训练时 113 列(50光谱+63WQI)维度不同
- SimpleImputer fit在113列上不接受308列输入
- 修复: 先 np.interp 重采样到训练波长网格, 再 WQI 补齐,
然后喂入 Pipeline 的 imputer+preproc+cleaner 最终进 SVR
|
2026-07-29 10:53:58 +08:00 |
|
|
|
8b3955fd7a
|
fix: 推理端 DualStream_MNF 直通 Pipeline — 不再走旧重采样+WQI路径
- 训练时 Pipeline 保存了完整 MNFTransformer(mean_/W_mnf_)
和 PhysicalFeatureExtractor(wavelengths/_feat_cols_)
- 推理端新增快速通道:检测到 DualStream_MNF 时,直接调用
Pipeline 的 imputer.transform + preproc.transform,复用训练时
fit 好的变换矩阵,无需手动光谱重采样和 WQI 补齐
- 旧模型(非 DualStream_MNF)保持原有逻辑不变
|
2026-07-29 10:51:01 +08:00 |
|
|
|
40f12b569e
|
fix: 部署导出 _feat_cols_ 解包适配新4元组(name,ftype,ia,ib)
|
2026-07-29 10:42:17 +08:00 |
|
|
|
3fe05a0edb
|
fix: PhysicalFeature 改为精选20指数 — 保留NDVI/NDWI + 覆盖Chl/BGA/Turb
- 63个公式方案丢掉了NDVI/NDWI/FAI/EVI等通用指数
- 改为精选20个比值/指数,直接根据波长匹配最近波段:
通用: NDVI, NDWI, MNDWI, EVI (4个)
Chl: NDCI, CIgreen, CIrededge, MCI, SABI (5个)
BGA: PC_ratio1, PC_ratio2 (2个)
Turb: Turb_RedNIR, Turb_GreenRed, Turb_NIRGreen (3个)
单波段比值: R700/R670, R550/R670, R800/R550 等 (6个)
- 不再依赖 WaterQualityIndexCalculator,Pipeline 内计算更快
|
2026-07-29 10:39:32 +08:00 |
|
|
|
58bad4081e
|
feat: PhysicalFeature 扩展到全部63个水色指数 + MNF成分数自动确定
PhysicalFeatureExtractor:
- 废弃硬编码3指数(NDVI/NDWI/AlgaeRatio),改为调用
WaterQualityIndexCalculator.calculate_many() 计算全部63个公式
- 涵盖 BGA(25)/Chl(16)/Turb(10)/TSM(3) 等完整指数集
MNFTransformer:
- n_components 支持 float(0~1): 根据累积方差比自动确定成分数
n_components=0.95 → 保留95%方差的成分
- fit 后保存 n_components_ (实际成分数) 供部署导出使用
- Wp 显式按特征值降序排列
|
2026-07-29 10:37:09 +08:00 |
|
|
|
495857913d
|
refactor: RandomizedSearchCV → GridSearchCV — SVR 超参全量穷举
- SVR 参数网格仅 216 种组合(4×6×3×3),全量搜索 ~2s 完成
- 之前 n_iter=10 只抽样 4.6%,靠运气撞最优参数
- 删除 n_iter 和 random_state 参数(GridSearchCV 不需要)
- 保留 RandomizedSearchCV import 供其他模型(参数空间大的)使用
|
2026-07-29 10:28:17 +08:00 |
|
|
|
6aaaea5abd
|
fix: inf→NaN 清洗兼容 ndarray(spxy/ks 返回 ndarray 无 .replace)
|
2026-07-29 10:22:47 +08:00 |
|
|
|
80189a9f44
|
fix: 补充 BaseEstimator/TransformerMixin 导入
|
2026-07-29 10:20:57 +08:00 |
|
|
|
12866f12b0
|
fix: Pipeline 安全网 — preproc 与 model 间插入 _SafeFiniteTransformer
- 新增 _SafeFiniteTransformer: np.nan_to_num + clip(±1e15)
- 放在 Pipeline preproc→model 之间,无论 MNF 数值溢出还是
PhysicalFeatureExtractor 除零,SVR 收不到 inf/NaN
- X_train/X_test 入口先 replace(inf→NaN),SimpleImputer 接力填充
|
2026-07-29 10:20:00 +08:00 |
|
|
|
f3af45ccff
|
fix: MNFTransformer 数值稳定性 — 防 inf/NaN 导致 SVR 拒绝输入
- fit: 正则化按协方差总迹的1%自适应 + 截断噪声主导特征值
- fit: 输入先做 nan_to_num 清洗
- transform: 输出 clip 到 float32 安全范围,防止极端值
- 噪声协方差正则化从固定 1e-9 改为 trace*0.01,对 113 维特征更稳健
|
2026-07-29 10:16:56 +08:00 |
|
|
|
09f8d89b56
|
fix: PhysicalFeatureExtractor 修复 ndarray 输入时波长丢失问题
- SimpleImputer 把 DataFrame → ndarray,PhysicalFeatureExtractor.fit()
收不到列名导致 ValueError: 必须在 __init__ 中提供 wavelengths
- get_preprocessing_transformer 新增 wavelengths 可选参数
- train_single_model 在 DualStream_MNF 时提取 X_raw 波长列表传入工厂
- PhysicalFeatureExtractor 已有 ndarray + wavelengths 参数的处理分支
|
2026-07-29 10:11:01 +08:00 |
|
|
|
ef9187fc7b
|
fix: GUI 训练面板补全 WVAE + DualStream_MNF 预处理选项
- 旧 GUI 硬编码列表缺少 WVAE 和 DualStream_MNF,与 modeling_batch 不同步
- 两个 GUI 面板同步补全,中文名分别为「小波去噪」和「双流MNF」
|
2026-07-29 10:06:46 +08:00 |
|
|
|
4347988ab2
|
feat: 训练框架适配 DualStream_MNF + 部署矩阵 .npz 导出
modeling_batch.py:
- preprocessing_methods 新增 DualStream_MNF
- save_model 新增 C++/Rust 部署导出逻辑:
自动检测 Pipeline 中的 MNFTransformer + SVR,
提取 mean_/W_mnf_/dual_coef_/support_vectors_/
intercept_/gamma/kernel 等纯量矩阵,
保存为 *_deploy.npz 文件
- 新增 _find_mnf_in_pipeline / _find_svr_in_pipeline /
_find_physical_extractor_in_pipeline 辅助方法,
支持 FeatureUnion 嵌套递归查找
|
2026-07-29 10:02:37 +08:00 |
|
|
|
7d8d848e58
|
feat: 新增 MNFTransformer + PhysicalFeatureExtractor + DualStream_MNF
spectral_Preprocessing.py:
- MNFTransformer: 纯 numpy/scipy 实现的 MNF 降维
fit: 噪声协方差→白化→PCA 旋转,导出 self.mean_/self.W_mnf_
transform: (X - mean) @ W_mnf_[:, :n_components]
- PhysicalFeatureExtractor: 从原始波段提取 NDVI/NDWI/蓝藻比值
支持 DataFrame(列名波长) 和 ndarray(wavelengths参数) 输入
- get_preprocessing_transformer: DualStream_MNF 返回 FeatureUnion
并行连接 PhysicalFeatureExtractor(3维) + MNFTransformer(10维)
|
2026-07-29 10:02:31 +08:00 |
|
|
|
c4c70b2ff6
|
fix: 耀斑检测默认关闭大面积连通域过滤
- max_area 默认值 50 → 0(不过滤),大范围耀斑区域不再被误删
- 原逻辑: Otsu → 移除 >50px 连通域 → 扔掉浅水/岸边大亮斑
- 现逻辑: Otsu → 跳过面积过滤 → 保留所有亮斑区域
- 用户可手动调大 max_area 重新启用过滤
|
2026-07-28 17:42:12 +08:00 |
|
|
|
80e46c8476
|
fix: 单步模式下自动发现耀斑掩膜文件
- 单步运行时 PipelineContext 不保留 step2 的 glint_mask_path,
导致采样时无法剔除耀斑区域
- 新增自动发现:兜底扫描 2_Glint_Detection/severe_glint_area.dat
- 补充缺失的 import os
|
2026-07-28 17:25:41 +08:00 |
|
|
|
241b138bb5
|
fix: 异常值裁剪 P1/P99 → P2/P98,避免边界垃圾值污染
- P1-P99 对 pH/DO 等参数不够保守:边界像素模型预测 pH=-22
导致 P1=-2.38,裁剪后仍保留物理上不可能的值
- 改为 P2-P98(4% 裁剪),IQR 8.3-8.5 的主体数据完全不受影响
- 两处同步:预测端 _clip_outliers + 插值端 _perform_interpolation
|
2026-07-28 17:09:42 +08:00 |
|
|
|
3f2eef4536
|
fix: 克里金采样点上限解除 — 修正可用内存检测 + 提高硬上限
- psutil 在 Windows 下 available 因进程占用而偏低(4GB vs 实际 11-12GB),
改为 max(available, free) 获取更真实的内存余量
- 安全余量系数 0.5→0.6,兜底值 4GB→8GB
- 硬上限 20000→50000,32GB 实测可安全容纳更多采样点
- 之前 45958 点 → 强制抽稀到 16384,损失了大量空间细节
|
2026-07-28 16:55:03 +08:00 |
|
|
|
1efe10adb6
|
revert: 回退克里金多线程并发,恢复串行处理
并发实测无提速(32GB 内存下单个克里金已用 5-6GB,两个并发
竞争内存带宽导致实际耗时相同),回退为简单串行循环。
|
2026-07-28 16:53:15 +08:00 |
|
|
|
aa5d9d9392
|
feat: GUI 面板专题图生成支持多线程并发克里金
- step11_map_panel.run() 串行 for 循环改为 ThreadPoolExecutor 并发
- 默认 2 线程并行,通过过滤已存在文件跳过重复生成
- 支持取消信号:_done Event 通知 worker 线程提前退出
- 线程安全:_lock 保护共享计数器,Qt 信号从 QThread 安全 emit
- 修复 Tuple 类型导入缺失
|
2026-07-28 16:45:46 +08:00 |
|
|
|
e8a81008fa
|
feat: 专题图克里金插值支持多线程并发
- ThreadPoolExecutor 替代串行 for 循环,默认 2 线程并发
- 克里金内部 numpy/scipy 运算释放 GIL,线程并行有效
- 通过 kriging_workers 配置项控制并发数(默认 2,设为 1 回退串行)
- 主线程预先设置 matplotlib Agg 后端,避免多线程竞争
- 保留串行路径作为 fallback(单 CSV 或 workers=1 时)
|
2026-07-28 16:41:41 +08:00 |
|
|
|
3c7e735342
|
feat: 预测结果百分位裁剪 — 消除极端异常值拉爆专题图色阶
- 新增 _clip_outliers(P1-P99) 方法,预测完成后自动裁剪
- 水体边界零值区域导致模型外推极端值(-86~7026),
裁剪后克里金插值色阶不再被拉爆,正常空间细节可见
- 无异常值时不触发裁剪(零开销)
|
2026-07-28 16:38:07 +08:00 |
|
|
|
b6fa07925a
|
fix: 新模型路径推理时缺失 WQI 特征导致 Pipeline 维度不匹配
- 新模型路径(有 train_wavelengths)重采样后仅产出 50 列光谱,
未计算模型训练时包含的 WQI 指数特征(期望 113 列)
- 旧模型路径(else 分支)有此逻辑但被隔离,新路径无法受益
- 将 WQI 特征补全逻辑提至 if/else 之后统一执行,
通过 n_features_in_ 属性自动检测特征缺口并补齐
|
2026-07-28 15:31:49 +08:00 |
|
|
|
b59371f441
|
fix: 专题图 CRS 探测增强 + 地理坐标系 UTM 临时投影
map.py:
- CRS 探测从 Proj4 字符串兜底解析 EPSG(+init=epsg:XXXX / +zone=)
- rasterio 支持 .dat/.bsq/.bil/.bip/.img 等 ENVI 格式
- 新增 _is_geographic_crs() / _get_utm_epsg() 方法
- 地理坐标系自动临时投影到 UTM 米制空间进行插值,避免经纬度数值
过小导致 Kriging/IDW 矩阵崩溃、std 退化为 0(纯色图)
- 防御:CRS 标记为地理系但坐标值超出经纬度范围时判定为探测错误,
跳过投影直接使用米制坐标
water_quality_gui_v2.py: 格式清理
|
2026-07-28 14:59:16 +08:00 |
|
|
|
89b67fbd34
|
fix: ML Pipeline 缺失值填充 + 推理端外部模型 dict 兼容
- modeling_batch: Pipeline 首步新增 SimpleImputer(median) 填充 NaN
- inference_batch: 外部模型支持完整 dict(含 metadata/train_wavelengths),
兼容旧版裸 Pipeline 对象
- step9_ml_predict_panel: 模型加载保留完整 dict 而非仅 model 对象,
确保推理端可从 train_wavelengths 做光谱重采样
|
2026-07-28 14:59:11 +08:00 |
|
|
|
02592cc181
|
fix: 光谱提取 NaN/Inf 防护 + 边界掩膜支持
- 逐波段读取路径:防止 GDAL ReadAsArray 返回 NaN/Inf 污染光谱
- 批量读取路径:astype(float64) 后统一过滤非法值
- 两路径均支持 boundary_mask:水体之外光谱置零
|
2026-07-28 14:59:07 +08:00 |
|
|
|
46c5e51772
|
fix: BIP→BSQ 转换数据丢失修复 + 只读文件处理
- 延迟删除原始文件:先验证临时 BSQ 文件存在且非空,再删原始数据
- 异常处理不再删除临时 BSQ:保留完好副本供手动恢复
- 新增 _make_writable() 移除只读属性,避免 Windows PermissionError
- 清理孤儿 .aux.xml 临时文件
- 路径变量提前声明,保证异常处理块可访问
|
2026-07-28 14:59:03 +08:00 |
|
|
|
c16cddf384
|
feat: 推理端自动波长回填+linspace子采样(旧模型兼容)
|
2026-07-27 18:08:37 +08:00 |
|
|
|
de9d6f0835
|
fix: Kriging 整体拟合+变异函数容错+自适应分层抽样+高斯平滑+掩膜修复
|
2026-07-27 18:08:37 +08:00 |
|
|
|
c8ab4e029e
|
fix: 采样+水掩膜+专题图十项修复
采样 (sampling.py):
- min_interval 50→10, base_interval 改用 min_interval
- np.all(sample_area)→water_ratio_threshold=0.35, 窄水体采样率大幅提升
- 自适应采样参数改用 P5-最近邻距离, 免疫外扩点污染
水掩膜 (extract_water_area.py):
- 移除 imgdata_in==0 误杀逻辑, 380nm水体反射率为0不再被跳过
专题图 (map.py):
- 坐标列检测修复: 删除 ('longitude','longitude') 短路bug
- 栅格掩膜重采样改用 GDAL ReprojectImage + 掩膜内 NaN 全量填充
- binary_closing iterations 2→1, 窄河道不丢
- visualize_raster 检测 nodata_value 避免矢量掩膜二次擦除
- IDW 自适应参数: 基于最近邻距离的连续映射
- Kriging 重构为整体拟合+变异函数多模型容错+高斯平滑
- 克里金无500K一刀切, 局部克里金失败自动回退IDW
|
2026-07-27 14:52:40 +08:00 |
|
|
|
92e8c90370
|
feat: ML模型波长记忆 + 跨传感器光谱重采样 + 数据加载规范化
训练端 (modeling_batch.py):
- _extract_train_wavelengths() 从列名提取训练波长写入 metadata
- load_data_batch/load_data_single 改为基于列名语义智能提取特征
- 废除 feature_start_column 硬编码位置索引
推理端 (inference_batch.py):
- preprocess_spectra() 分支A: train_wavelengths存在→np.interp精确重采样
- preprocess_spectra() 分支B: 无波长元数据→解析列名→np.interp到400-800nm标准网格
- 废除暴力截断和零值填充
|
2026-07-27 14:52:30 +08:00 |
|
|
|
99aeab3076
|
refactor: 中间层消除硬编码波段号+CRS动态探测
- GlintRemovalStep/handler/service 全部改为传递波长参数而非波段索引
- ContentMapper 移除 EPSG:32651 硬编码, 新增 _ensure_crs() + _probe_crs_from_file()
- _prepare_shared_context 在 read_csv_data 前先探测边界文件 CRS
- GUI QSpinBox→QDoubleSpinBox,默认值改为波长(nm),placeholder 提示自动探测
- 消除 38/36/49/47/25/37/65/91 等所有魔法数字
|
2026-07-27 14:52:23 +08:00 |
|
|
|
f6d61693e3
|
refactor: 耀斑去除算法从波段索引驱动改造为波长驱动
- Kutser/Hedley/Goodman 的 __init__ 参数从硬编码波段号改为目标波长(nm)
- 内部通过 find_band_number() 从 HDR 元数据动态解析波段索引
- Goodman 消除 P0 不一致: 25/37 vs 65/91 统一为 641.93/751.49nm
- 彻底解除传感器耦合,任何传感器均可自动适配
|
2026-07-27 14:52:15 +08:00 |
|
|
|
b609a64811
|
fix: 多项稳定性修复与打包优化
- PyInstaller: runtime hook 预加载 osgeo DLL 避免 Qt5 符号冲突;
spec 纳入 osgeo .py 文件 + 运行时 DLL 依赖 (ffi/lzma/bz2/expat/sqlite3);
移除 DLL 双副本防止 segfault
- GDAL 环境: 新增 _MEIPASS/osgeo/data/gdal 路径搜索,改善打包后 GDAL_DATA 检测
- 预览生成器: 掩膜与底图同分辨率时跳过 Warp 加速读取
- 专题图: ConvexHull 坐标中心化修复 UTM 大坐标精度退化;
边界采样兜底防止外扩点为空;
TIFF 已含 NaN 掩膜时跳过矢量擦除;
形态学闭运算填充掩膜小孔洞
- NDWI: int16→float32 防止减法溢出
- 面板注册表: 步骤模块分组重构 (模块一/二/三/四重划分)
|
2026-07-26 20:35:50 +08:00 |
|
|
|
0bd54d5fdd
|
feat(step3): auto BIP→BSQ conversion with metadata preservation
- _ensure_bsq(): 检测 BIP 格式并自动调用 gdal.Translate 转换为 BSQ
- 临时文件原地替换原名,所有下游步骤零感知
- 保留原始波长/波段名称等元数据到新 HDR
- 空间不足时跳过转换,回退 BIP-chunked 模式运行
|
2026-07-24 14:37:00 +08:00 |
|
|
|
2c637596eb
|
perf(step3): Kutser BIP-chunked mode + auto interleave detection
- 新增 run_fast(): 自动检测 BIP/BSQ 格式,BIP 按行块读立方体(文件只读一遍)
- BSQ 模式逐波段顺序读取,均比原版块外波段内随机 IO 快 10-100 倍
- get_corrected_bands() 默认走 run_fast(),原版 run() 保留为低内存兼容
- 每 10 波段打印进度 + 预计剩余时间
|
2026-07-24 14:36:56 +08:00 |
|