fix: 克里金矩阵鲁棒性 — 去重重叠点 + nugget 防奇异化

问题: 4326 点仍崩溃回退 IDW,原因两个:
  1. 采样点中存在空间完全重叠点 → 协方差矩阵行列式为 0
  2. 坐标范围出现负数 (X=-793275) → 经/纬度传反,空间距离扭曲

修复:
  1. read_csv_data: drop_duplicates(subset=['proj_x','proj_y'])
     坐标 <0.01m 的重叠点只保留首个,防止矩阵奇异化
  2. OrdinaryKriging (2处): nugget=1e-6
     微小固有方差强制打破矩阵奇异性,病态矩阵仍可求逆
This commit is contained in:
duxin
2026-07-08 16:29:33 +08:00
parent 7921e21750
commit f996353b37

View File

@ -813,6 +813,7 @@ class ContentMapper:
ok = OrdinaryKriging( ok = OrdinaryKriging(
local_pts[:, 0], local_pts[:, 1], local_vals, local_pts[:, 0], local_pts[:, 1], local_vals,
variogram_model='spherical', variogram_model='spherical',
nugget=1e-6, # 微小 nugget 打破矩阵奇异性,防止协方差矩阵求逆崩溃
verbose=False, verbose=False,
enable_plotting=False, enable_plotting=False,
) )
@ -921,7 +922,15 @@ class ContentMapper:
print(f"已加载不确定性数据列: {uncertainty_col}") print(f"已加载不确定性数据列: {uncertainty_col}")
print(f"不确定性值范围: {gdf['uncertainty'].min():.4f} - {gdf['uncertainty'].max():.4f}") print(f"不确定性值范围: {gdf['uncertainty'].min():.4f} - {gdf['uncertainty'].max():.4f}")
print(f"成功读取 {len(gdf)} 个数据点") # 防御性去重:空间重叠点 (X,Y < 0.01m) 只保留首个,防止克里金矩阵奇异化
initial_count = len(gdf)
gdf = gdf.drop_duplicates(subset=['proj_x', 'proj_y'], keep='first')
final_count = len(gdf)
if final_count < initial_count:
print(f" [数学防御] 成功检测并剔除了 {initial_count - final_count} 个空间完全重叠点,"
f"防止克里金矩阵奇异化!")
print(f"成功读取 {final_count} 个数据点")
return gdf return gdf
def read_boundary_shapefile(self, shp_file): def read_boundary_shapefile(self, shp_file):