空间分箱:Thiessen多边形空值与MemoryError问题求助
问题解决方案
问题1:移除空降雨站点后仍存在空Thiessen多边形
- 验证有效站点数据完整性:执行
print(gdf_rainfall.shape)确认dropna(subset=['Rainfall (mm)'])后保留的站点数量符合预期,排查是否因df_stations.merge(df, on="id")的合并逻辑丢失有效站点。 - 裁剪泰森多边形至研究区:使用
geopandas的voronoi_diagram方法,指定clip参数为研究区边界(gdf_sg.geometry.unary_union),避免生成超出研究范围的空多边形。示例代码:voronoi = gdf_rainfall.voronoi_diagram(clip=gdf_sg.geometry.unary_union) - 改用最近邻空间连接:若泰森多边形匹配仍有空值,直接对网格和有效站点做最近邻空间连接,强制为每个网格分配最近站点的降雨数据。示例:
grid_gdf = gpd.sjoin_nearest( grid_gdf, gdf_rainfall[['geometry', 'Rainfall (mm)']], how='left', max_distance=10000 # 根据研究区范围调整最大距离阈值 )
问题2:200x200m网格生成时内存溢出
- 分块生成网格:将研究区域拆分为多个子区域(比如按10km×10km的块),逐个生成子网格并处理,完成后合并结果。示例逻辑:
bounds = gdf_sg.total_bounds # 按10km步长拆分研究区边界 x_blocks = np.arange(bounds[0], bounds[2], 10000) y_blocks = np.arange(bounds[1], bounds[3], 10000) grid_list = [] for x_min in x_blocks[:-1]: for y_min in y_blocks[:-1]: sub_bounds = [x_min, y_min, x_min+10000, y_min+10000] # 生成子区域200m网格 sub_grid = gpd.GeoDataFrame.from_features( generate_grid(sub_bounds, step=200), # 自定义网格生成函数 crs=gdf_sg.crs ) # 子网格与站点做空间连接 sub_grid = gpd.sjoin_nearest(sub_grid, gdf_rainfall, how='left') grid_list.append(sub_grid) # 合并所有子网格 final_grid = pd.concat(grid_list, ignore_index=True) - 降低数据类型:将网格坐标数据从
int64改为float32或int32(若精度允许),减少内存占用。示例:geometry=lambda d: gpd.points_from_xy( d["location.longitude"], d["location.latitude"], dtype=np.float32 ) - 用Dask-Geopandas并行处理:利用Dask的分块能力,避免全量数据加载到内存。示例:
import dask_geopandas as dg # 按CPU核心数设置分区数 dask_grid = dg.from_geopandas(grid_gdf, npartitions=8) # 并行执行最近邻连接 dask_grid = dask_grid.sjoin_nearest(gdf_rainfall, how='left') # 计算后导出结果 final_grid = dask_grid.compute() - 边生成边保存:处理完每个子网格后直接保存到GeoParquet等文件,不保留在内存中,完成后按需读取合并。
内容的提问来源于stack exchange,提问作者Saqif
相关产品推荐
相关产品推荐

