如何将terra包的SpatRaster完整保存到R工作空间(RData)文件?
Terra包中保存/加载SpatRaster对象时保留完整信息的解决方案
使用terra包加载本地栅格文件后,将工作空间保存为RData文件,后续加载该工作空间时,SpatRaster对象会丢失关联数据并报错。目前的临时方案是加载工作空间后重新导入相关文件,有没有其他更高效的解决方案?
复现代码
library(terra) f <- system.file("ex/elev.tif", package="terra") r <- rast(f) # 正常输出SpatRaster信息 r # class : SpatRaster # dimensions : 90, 95, 1 (nrow, ncol, nlyr) # resolution : 0.008333333, 0.008333333 (x, y) # extent : 5.741667, 6.533333, 49.44167, 50.19167 (xmin, xmax, ymin, ymax) # coord. ref. : lon/lat WGS 84 (EPSG:4326) # source : elev.tif # name : elevation # min value : 141 # max value : 547 sources(r) # 正常返回文件路径 save.image("delete_if_found.RData") rm(list = ls()) load("delete_if_found.RData") r # 报错: # class : SpatRaster # Error in .External(list(name = "CppMethod__invoke_notvoid", address = <pointer: (nil)>, : # NULL value passed as symbol address
解决方案
方案1:单独保存栅格文件,加载时直接读取
避免将SpatRaster对象存入RData,而是用writeRaster将栅格保存为独立的栅格文件(如GeoTIFF),后续需要时直接用rast读取。这种方式能完整保留栅格的所有元数据和数据内容。# 保存栅格 writeRaster(r, "my_raster.tif", overwrite=TRUE) # 加载栅格 r <- rast("my_raster.tif")方案2:转为内存对象后保存到RData
默认情况下,用rast读取的栅格是磁盘关联的(数据存在硬盘文件中,对象只存引用)。可以用mem()函数将栅格数据加载到内存中,再保存到RData,这样加载时就能完整恢复对象。# 转为内存对象 r_mem <- mem(r) # 保存工作空间 save.image("workspace_with_mem_raster.RData") # 加载后正常使用 load("workspace_with_mem_raster.RData") r_mem # 可正常输出信息注意:如果栅格数据量很大,转为内存对象会占用大量RAM,需根据实际情况选择。
方案3:用
saveRDS单独保存SpatRaster对象
相比save.image保存整个工作空间,saveRDS可以单独保存单个SpatRaster对象,且能更好地保留对象的完整性。加载时用readRDS读取。# 单独保存SpatRaster saveRDS(r, "my_spatraster.rds") # 加载对象 r <- readRDS("my_spatraster.rds")
内容的提问来源于stack exchange,提问作者Aniruddha Marathe
相关产品推荐
相关产品推荐

