如何用terra包将列表格式网格转换为SpatRaster?
如何用terra包将x/y/z列表格式的网格转换为SpatRaster
问题重现
之前用raster包可以直接将包含x(栅格中心x坐标)、y(栅格中心y坐标)、z(值矩阵)的列表转成RasterLayer:
# 构建示例网格 grd <- list(x = (1:10), y = (1:10), z = matrix(1:100, 10, 10)) # raster包转换 library(raster) r <- raster(grd)
但切换到terra包时,直接用rast(grd)会报错:
Error: [rast,list] none of the elements of x are a SpatRaster
解决方案
由于terra的rast()不兼容raster包的这种列表格式,提供两种适配方法:
方法1:原生Terra构建(不依赖raster包)
手动定义栅格的范围、分辨率和值,完全用terra包实现:
library(terra) # 从列表提取核心数据 x <- grd$x y <- grd$y z <- grd$z # 计算分辨率(假设x/y为等间隔坐标) res_x <- diff(x)[1] res_y <- diff(y)[1] # 计算栅格范围(中心坐标转实际边界) extent <- ext( min(x) - res_x/2, max(x) + res_x/2, min(y) - res_y/2, max(y) + res_y/2 ) # 创建空SpatRaster并赋值 r2 <- rast( ext = extent, ncol = length(x), nrow = length(y), crs = "EPSG:4326" # 对应原raster包的默认WGS84 ) # 注意:矩阵转向量时需转置,因为terra按行优先读取值,而matrix默认列优先 values(r2) <- as.vector(t(z))
验证输出与原raster结果一致:
r2 # class : SpatRaster # dimensions : 10, 10, 100 (nrow, ncol, ncell) # resolution : 1, 1 (x, y) # extent : 0.5, 10.5, 0.5, 10.5 (xmin, xmax, ymin, ymax) # crs : EPSG:4326 # source : memory # names : layer # values : 1, 100 (min, max)
方法2:临时依赖raster包过渡
如果暂时不想修改太多代码,可以先转成RasterLayer再转SpatRaster:
library(raster) library(terra) r <- raster(grd) r2 <- rast(r)
关键说明
terra的rast()函数不支持raster包那种x/y/z结构的列表输入,需要明确定义栅格的空间参数。- 若实际数据中
x/y不是等间隔,需调整分辨率的计算逻辑(比如用diff的均值或自定义分辨率)。
内容的提问来源于stack exchange,提问作者Ignacio Marzan
相关产品推荐
相关产品推荐

