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 个网格点'
This commit is contained in:
duxin
2026-07-08 11:28:25 +08:00
parent 29a5aaa9ab
commit 212772caf4

View File

@ -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},无法进行插值。")