如何从等间距坐标的sf点对象创建SpatRaster?是否有更优方法?
从sf规则点生成SpatRaster的最优方式
你的现有方法是可行的,但针对等间距规则格网点的场景,有更简洁高效的实现方式,不用额外转成data.frame。
方法1:直接利用规则格网参数构建栅格
因为你的点坐标是等间距的(x=1:10,y=1:10),可以直接定义栅格的范围、分辨率,再将z值按格网顺序赋值:
library(sf) library(terra) tmp <- expand.grid(x=1:10,y=1:10) tmp$z <- runif(100) foo_sf <- st_as_sf(tmp, coords=c("x","y")) # 按y轴(行)、x轴(列)的顺序将z值转为矩阵 z_mat <- matrix(foo_sf$z, nrow=10, ncol=10, byrow=FALSE) # 创建匹配范围的空栅格 foo_rast <- rast( nrows = 10, ncols = 10, xmin = min(tmp$x), xmax = max(tmp$x), ymin = min(tmp$y), ymax = max(tmp$y) ) # 为栅格赋值 values(foo_rast) <- z_mat
方法2:简化坐标+值的绑定(无需转data.frame)
如果不想手动定义栅格参数,也可以直接将sf的坐标和z值绑定后传入rast(),省去转data.frame的步骤:
foo_rast <- rast(cbind(st_coordinates(foo_sf), z = foo_sf$z))
为什么现有方法不是最优?
你的方法需要先把sf转成data.frame,多了一次数据结构转换的开销;而上面两种方法要么直接利用规则格网的已知参数跳过坐标解析,要么简化了数据绑定步骤,在数据量较大时优势更明显。
验证结果一致性
不管用哪种方法,生成的SpatRaster结果完全一致,可以用all.equal()验证:
# 原方法生成的栅格 foo_df <- data.frame(st_coordinates(foo_sf), z=foo_sf$z) foo_rast_original <- rast(foo_df) # 验证一致性 all.equal(foo_rast, foo_rast_original) # 返回TRUE
内容的提问来源于stack exchange,提问作者user111024
相关产品推荐
相关产品推荐

