Commit Graph

33 Commits

Author SHA1 Message Date
237fcba647 perf: 自适应分块 + 40% 重叠缓冲 + n_closest=50 优化局部克里金
用户需求: 500m 固定分块(50块)容易碎片化, 稀疏区域易受异常值污染

修复 (3项):

1. 自适应块大小: 根据 extent 自动切分为 ~4×4 块(16块),
   纵横比极端时自动在长边增加 1 块。
   每块面积足够大, 囊括更多采样点特征。

2. 40% 重叠缓冲区: 采样点搜索范围为块长宽的 1.4×,
   相邻块交界处使用极度重叠的采样点 → 消除拼缝断层。
   网格点(grid_x/y)仍使用严格不重叠块范围 → 无冗余计算。

3. n_closest_points=50: 50 个近邻稀释极端异常值影响,
   比之前 15 个更稳健, 且协方差矩阵 50×50 仍远小于全局 8242×8242。
2026-07-08 14:00:59 +08:00
7fbc613ded fix: 局部 Kriging 网格范围使用缓冲区导致 10x 冗余计算卡死
问题: sub_grid_x/y 使用了缓冲区范围 (block+500m) 而非块范围,
  导致每个 500m 块的网格点从 ~457x460 膨胀到 ~1500x1500 (9x),
  50 个块合计需计算 1.12 亿次 kriging, 任务构建阶段就卡死。

修复: sub_grid_x/y 改为仅使用块自身范围,
  缓冲区仅用于筛选局部采样点。
  每个网格点只计算一次, 总计算量 = 实际网格点数 (10.5M)。
2026-07-08 13:14:40 +08:00
bdac7873f4 fix: 修复 ContentMapper 类体被模块级函数截断的严重 bug
问题: 批量生成专题图时报 'ContentMapper' object has no attribute 'process_data'

根因: _local_krige_block_worker (0空格缩进,模块级) 被错误地插入在
  ContentMapper 类体中间 (line 819), 导致类定义在此处终止。
  之后 19 个方法 (_idw_interpolation, read_csv_data, create_content_map,
  visualize_raster, prepare_shared_context, process_data, process_batch...)
  全部脱离类变成模块级函数。
  AST 验证: ContentMapper 仅剩 9 个方法。

修复: 将 _local_krige_block_worker 移至文件末尾 (模块级正确位置),
  ContentMapper 恢复为 28 个方法的完整类。
2026-07-08 13:02:03 +08:00
8f03dcb10b perf: Local Kriging 500m spatial window + multiprocessing
Local Kriging: grid split into 500m blocks, each block uses only
sample points within block+buffer zone. Covariance matrix shrinks
from 8242x8242 to local nxn. 10M+ grid cells now finish in minutes.

Complexity:
  Global: O(G * P * logP * K^3) = hours for large grids
  Local:  O(sum(block*grid * block*points * 15^3)) = minutes
2026-07-08 12:03:46 +08:00
e0b9257b56 perf: Kriging 多进程分块 + C 后端自动检测 — 1m 分辨率千层级网格加速
问题: 用户需要 1m 分辨率 (2285×4600 = 1051万网格点),
  单进程 loop 后端需要数小时。

修复 (三层加速):

1. C 后端自动检测 (_detect_kriging_backend):
   - 检测 pykrige 是否有编译的 C 扩展 (conda-forge 默认有)
   - 可用时 C 后端比 loop 快 50-100×
   - 不可用时回退 loop + 多进程补偿

2. 多进程分块 (_krige_chunked):
   - 网格 >100 万点时自动启用
   - 沿 Y 轴将网格拆分为 N 个 stripe (N=CPU核数,上限8)
   - 每个 worker 独立运行 OrdinaryKriging.execute()
   - 结果沿 Y 轴 vstack 拼接

3. 进度可见:
   - 每个 worker 启动时打印 '[Krige Worker] 分块 X/N'
   - 完成后立即打印完成消息
   - 主进程打印拼接结果维度

预期性能 (8核, C后端, 1051万网格点):
  单进程 loop: ~3-5 小时
  8进程 + C: ~1-3 分钟 (loop后端 ~15-30 分钟)
2026-07-08 11:34:14 +08:00
212772caf4 fix: Kriging 大网格自动拦截 — 防止百万级网格点导致无限卡死
问题: 用户将 step11 分辨率设为 1m,生成 2285×4600 = 1051万
  网格点。pykrige OrdinaryKriging.execute() 在此规模上需要数小时,
  且期间无任何进度输出,看起来像程序卡死。

根因: 原代码对网格规模无上限约束。

修复 (create_interpolation_grid):
  - 推荐上限: 500K 网格点 (~30-120s)
  - 绝对上限: 2000K 网格点 (超出直接抛错,建议提升分辨率)
  - 超推荐上限时自动按比例提升分辨率: 2285×4600 → ~505×1016
  - 打印明确的网格点数统计和 ETA 提示
  - 网格自动缩减后日志: '调整后网格: N×M = X 个网格点'
2026-07-08 11:28:25 +08:00
796d36c093 fix: 修复 TIF 缺失 CRS 时 fallback 到 WGS84 导致掩膜擦除全部像元的 bug
问题: step11 日志反复出现:
  '栅格 TIF 缺失坐标系,默认按 WGS84 渲染'
  '擦除后有效像元: 0/15300'

根因: step10 生成的 GeoTIFF 缺少 CRS (可能是 PROJ 异常时生成的)。
  visualize_raster 中当 crs_obj 为 None 时无条件回退到 EPSG:4326 (WGS84),
  但 transform 实际是 UTM 米坐标 (e.g. x≈470000, y≈2200000)。
  UTM 度坐标的掩膜被 reproject 到 WGS84 后,
  与仍在 UTM 米坐标的 transform 彻底错位 → geometry_mask 全部为 False
  → 0 个有效像元。

修复: 当 crs_obj 为 None 且 boundary 有投影 CRS 时,
  检查 transform 的 X 坐标量级: 若 >180 则必定是投影坐标 (UTM 等),
  直接使用 boundary 的 CRS 而非 WGS84 回退。
  仅当坐标量级 <180 时才回退到 WGS84 (真经纬度)。
2026-07-07 16:51:33 +08:00
c46f78e69d fix: 补齐缺失的 handler 文件 + IDW 插值退化检测 + V1 代码归档 2026-07-06 15:57:29 +08:00
385e5915af 格式统一 2026-07-01 17:33:52 +08:00
8de73db80e 格式统一 2026-07-01 11:32:32 +08:00
a3c20d3e49 格式统一 2026-07-01 09:57:27 +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
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
DXC
5a5109b1a6 fix(viz_reports): plot_scatter_true_vs_pred NaN 容错 + subplots_adjust 替换 tight_layout 2026-06-22 17:48:03 +08:00
DXC
e8820a73c1 fix(viz_reports): plot_spectrum_by_parameter legend 移出画布防止遮挡 2026-06-22 17:16:10 +08:00
DXC
561c59fbd4 fix(scatter_legend): 基础版散点图 legend 移出画布防止遮挡
src/postprocessing/visualization_reports.py plot_scatter_true_vs_pred:

ax.legend 加 bbox_to_anchor=(1.02, 1) + borderaxespad=0,将图例移到画布右侧外部。

已有 plt.tight_layout() 与 plt.savefig(..., bbox_inches='tight') 自动处理裁剪。

Why: loc='upper left' 时图例位于散点区左上角,训练/测试点集中时易被遮挡。

仅改基础版(plot_scatter_true_vs_pred),增强版 sctter_batch.py 是 gridspec 4x4

子图布局,硬套 bbox_to_anchor 会破坏右侧 ax_hist_y 子图,保留原样。
2026-06-22 16:37:11 +08:00
DXC
027981e9a6 ContentMapper 边界读取支持栅格水掩膜(.dat/.bsq/.tif/.tiff/.img) 2026-06-16 15:15:10 +08:00
DXC
82e0b92af6 Mega-1.1 全链路路径归一化收尾(18 文件) 2026-06-15 15:20:50 +08:00
DXC
184f5fe9f4 fix(step14): 批量渲染文件名唯一性 + Colorbar 样式 + 2σ拉伸 2026-06-11 10:29:32 +08:00
DXC
0493ba7916 fix(map): GeoTIFF 可视化全链路修复 2026-06-10 17:13:51 +08:00
DXC
fa9c940074 feat(visualization+report): 接入 Step9 浓度反演数据至可视化面板与报告生成器 2026-06-10 09:41:39 +08:00
DXC
e57fdb4f75 feat(report): 支持 Minimax AI 后端 + 统一 AI 配置对话框,修复 figure_counter 返回值断链 Bug 2026-06-08 14:58:16 +08:00
DXC
2a4a7ec7be refactor(packaging): PyInstaller资源路径统一适配get_resource_path 2026-05-10 18:02:59 +08:00
DXC
95d30d8d81 修复训练摘要报告无法识别 .joblib 模型的 Bug 2026-05-10 15:45:56 +08:00
DXC
375fea77b9 修复后处理模块导包路径断层 2026-05-10 15:24:50 +08:00
9b7bcfadd1 fix: 修复工作目录与步骤名不对应、回归预测虚数报错、模型加载及预处理名称转换问题,重构可视化并修正勾选联动 2026-04-14 17:41:38 +08:00
b0a94ba1e7 更新工作目录子文件夹的序号 2026-04-14 09:24:18 +08:00
8025869b76 调整缩放、多核运行、图标显示 2026-04-09 17:25:52 +08:00
91e36407ae Initial commit of WQ_GUI 2026-04-08 15:25:08 +08:00