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