基于sf包将10×10网格聚合为30×30大分辨率网格的方法
用sf包将10×10网格聚合为30×30大网格的方案
问题背景
已通过st_make_grid()创建10×10的初始网格grid1,需要生成每个由9个相邻小网格组成的30×30大网格,此前尝试st_buffer()仅生成单元格缓冲区,无法完成分组聚合。
解决方案
核心思路是给每个小网格分配所属大网格的分组ID,再按ID聚合合并小网格:
- 初始化并转换网格为sf对象
library(sf) # 创建10×10初始网格(默认单位范围,每个小格边长0.1) grid1 <- st_make_grid(n = c(10, 10)) %>% st_sf() # 转为sf数据框,便于添加属性和操作
- 给小网格分配分组ID
通过小网格的中心坐标,计算其所属大网格的行列位置,生成唯一分组ID:
# 获取每个小网格的中心坐标 grid_centers <- st_centroid(grid1) %>% st_coordinates() %>% as.data.frame() # 计算大网格的行列号(大网格边长为小网格的3倍,即0.3) grid1$group_row <- floor((grid_centers$Y - min(grid_centers$Y)) / 0.3) grid1$group_col <- floor((grid_centers$X - min(grid_centers$X)) / 0.3) # 生成唯一分组ID grid1$group_id <- paste(grid1$group_row, grid1$group_col, sep = "-")
- 按分组聚合生成大网格
使用st_union()将同一分组的小网格合并为单个大网格:
# 聚合分组,生成30×30的大网格 grid_large <- grid1 %>% group_by(group_id) %>% summarize(geometry = st_union(geometry)) %>% ungroup()
- 可视化验证
# 绘制小网格(灰色),叠加大网格边框(红色粗线) plot(grid1$geometry, border = "gray") plot(grid_large$geometry, border = "red", lwd = 2, add = TRUE)
说明
- 若初始网格的范围或边长不是默认值,需调整代码中
0.3这个大网格边长参数(即小网格边长×3) - 使用
st_centroid()取中心坐标,能更准确判断小网格所属的大网格分组,避免边界判断误差
内容的提问来源于stack exchange,提问作者Maël
相关产品推荐
相关产品推荐

