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:
@ -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},无法进行插值。")
|
||||
|
||||
Reference in New Issue
Block a user