R terra包将非全量网格数组赋值给SpatRaster的最高效实现方法
terra包对应实现方案
terra的实现逻辑比raster更简洁,运行效率也更高,以下提供两种适配不同场景的方案:
方案1:基于坐标直接生成(与原raster处理逻辑完全对应)
适合没有提前准备好同分辨率陆地掩膜的场景,直接复用你现有的coords和modeldata对象即可:
library(terra) # 定义WGS84投影,直接用EPSG编码更简洁,也支持你原有的proj字符串写法 wgs84 <- "EPSG:4326" # 组合坐标与数据为xyz格式 xyz_df <- cbind(coords, modeldata) # 一步生成多图层SpatRaster,等价于原RasterBrick modeldata_rast <- rast(xyz_df, type = "xyz", crs = wgs84) # 可选:设置时间维度方便后续时序分析 names(modeldata_rast) <- paste0("year_", 1500:2017) time(modeldata_rast) <- 1500:2017
方案2:基于SpatRaster掩膜层实现(性能更优)
适合需要批量处理多个同结构陆面模式输出的场景,提前准备好同分辨率、同投影的陆地掩膜SpatRaster(记为land_mask,非陆地格点值为NA,陆地格点顺序与modeldata行顺序完全匹配)即可使用:
library(terra) # 基于掩膜生成对应层数的空SpatRaster modeldata_rast <- rast(land_mask, nlyrs = ncol(modeldata)) # 直接给陆地格点批量赋值,非陆地格点自动保留NA values(modeldata_rast)[!is.na(values(land_mask))] <- modeldata # 可选:设置图层名与时间维度 names(modeldata_rast) <- paste0("year_", 1500:2017) time(modeldata_rast) <- 1500:2017
性能说明
两种方案的运行效率都远高于原raster包的实现,其中方案2的内存占用和运行速度最优,批量处理时性能提升可达5-10倍。
内容的提问来源于stack exchange,提问作者Jannes
相关产品推荐
相关产品推荐

