From 212772caf4632bbe27884d9db5452af1a4525db7 Mon Sep 17 00:00:00 2001 From: duxin Date: Wed, 8 Jul 2026 11:28:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Kriging=20=E5=A4=A7=E7=BD=91=E6=A0=BC?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=8B=A6=E6=88=AA=20=E2=80=94=20=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=E7=99=BE=E4=B8=87=E7=BA=A7=E7=BD=91=E6=A0=BC=E7=82=B9?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=97=A0=E9=99=90=E5=8D=A1=E6=AD=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: 用户将 step11 分辨率设为 1m,生成 2285×4600 = 1051万 网格点。pykrige OrdinaryKriging.execute() 在此规模上需要数小时, 且期间无任何进度输出,看起来像程序卡死。 根因: 原代码对网格规模无上限约束。 修复 (create_interpolation_grid): - 推荐上限: 500K 网格点 (~30-120s) - 绝对上限: 2000K 网格点 (超出直接抛错,建议提升分辨率) - 超推荐上限时自动按比例提升分辨率: 2285×4600 → ~505×1016 - 打印明确的网格点数统计和 ETA 提示 - 网格自动缩减后日志: '调整后网格: N×M = X 个网格点' --- src/postprocessing/map.py | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/postprocessing/map.py b/src/postprocessing/map.py index e7fffc5..b1ce13f 100644 --- a/src/postprocessing/map.py +++ b/src/postprocessing/map.py @@ -1172,7 +1172,33 @@ class ContentMapper: grid_y = np.linspace(miny, maxy, grid_points_y) grid_xx, grid_yy = np.meshgrid(grid_x, grid_y) - print(f"网格大小: {grid_xx.shape[1]} x {grid_xx.shape[0]} (宽 x 高)") + total_grid_cells = grid_xx.size + print(f"网格大小: {grid_xx.shape[1]} x {grid_xx.shape[0]} (宽 x 高) = {total_grid_cells:,} 个网格点") + + # ★ 大网格自动拦截:超过阈值时自动提升分辨率以保证可接受的计算时间 + _MAX_GRID = 500000 # Kriging 在此规模约需 30-120s + _URGENT_MAX_GRID = 2000000 # 绝对上限,超过直接拒绝 + if total_grid_cells > _URGENT_MAX_GRID: + raise ValueError( + f"网格点数 {total_grid_cells:,} 超过绝对上限 {_URGENT_MAX_GRID:,}。" + f"当前分辨率下 Kriging 预计需要数小时。" + f"请将「空间分布图」面板的「分辨率」增大到至少 " + f"{int(resolution * (total_grid_cells / _MAX_GRID) ** 0.5)}m 后重试。" + ) + elif total_grid_cells > _MAX_GRID: + # 自动降分辨率 + scale = (total_grid_cells / _MAX_GRID) ** 0.5 + new_res = int(resolution * scale) + new_nx = max(100, int(grid_points_x / scale)) + new_ny = max(100, int(grid_points_y / scale)) + print(f"⚠ 网格点数 {total_grid_cells:,} 超过推荐上限 {_MAX_GRID:,}," + f"自动将分辨率从 {resolution}m 提升到 ~{new_res}m " + f"(网格缩减到 ≈{new_nx}×{new_ny} = {new_nx*new_ny:,} 点)") + grid_x = np.linspace(minx, maxx, new_nx) + grid_y = np.linspace(miny, maxy, new_ny) + grid_xx, grid_yy = np.meshgrid(grid_x, grid_y) + total_grid_cells = grid_xx.size + print(f"调整后网格: {grid_xx.shape[1]} x {grid_xx.shape[0]} = {total_grid_cells:,} 个网格点") if grid_xx.shape[0] < 2 or grid_xx.shape[1] < 2: raise ValueError(f"网格尺寸太小 {grid_xx.shape},无法进行插值。")