You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于sf包将10×10网格聚合为30×30大分辨率网格的方法

用sf包将10×10网格聚合为30×30大网格的方案

问题背景

已通过st_make_grid()创建10×10的初始网格grid1,需要生成每个由9个相邻小网格组成的30×30大网格,此前尝试st_buffer()仅生成单元格缓冲区,无法完成分组聚合。

解决方案

核心思路是给每个小网格分配所属大网格的分组ID,再按ID聚合合并小网格:

  1. 初始化并转换网格为sf对象
library(sf)

# 创建10×10初始网格(默认单位范围,每个小格边长0.1)
grid1 <- st_make_grid(n = c(10, 10)) %>% 
  st_sf()  # 转为sf数据框,便于添加属性和操作
  1. 给小网格分配分组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 = "-")
  1. 按分组聚合生成大网格
    使用st_union()将同一分组的小网格合并为单个大网格:
# 聚合分组,生成30×30的大网格
grid_large <- grid1 %>% 
  group_by(group_id) %>% 
  summarize(geometry = st_union(geometry)) %>% 
  ungroup()
  1. 可视化验证
# 绘制小网格(灰色),叠加大网格边框(红色粗线)
plot(grid1$geometry, border = "gray")
plot(grid_large$geometry, border = "red", lwd = 2, add = TRUE)

说明

  • 若初始网格的范围或边长不是默认值,需调整代码中0.3这个大网格边长参数(即小网格边长×3)
  • 使用st_centroid()取中心坐标,能更准确判断小网格所属的大网格分组,避免边界判断误差

内容的提问来源于stack exchange,提问作者Maël

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:45:57