使用terra包保存并重新打开栅格时出现单位属性丢失问题
问题根因
栅格单位属性的持久化存储依赖输出文件格式的规范支持,以及GDAL对应驱动的实现逻辑,你的推测完全正确:
- 常用的GeoTIFF格式没有预定义的栅格单位存储字段,GDAL的GTiff驱动默认不会将terra设置的
units属性写入文件元数据,因此重新读取时无法恢复该属性 - 自带单位字段的格式(如NetCDF、GRIB等)可以原生支持单位存储,可直接换用这类格式解决问题
解决方案
方案1:换用支持原生单位存储的格式
以NetCDF格式为例,可直接保留单位属性:
library(terra) A <- rast( nrows=10, ncols=10, xmin=0, xmax=10 ) values(A) <- 1:100 units(A) <- "Percent" # 存为NetCDF格式 writeRaster(x=A, filename="test.nc", overwrite=TRUE) # 读取验证 C <- rast("test.nc") units(C) # 正常返回 "Percent"
方案2:GeoTIFF格式下手动写入元数据兼容
如果必须使用GeoTIFF格式,可以把单位手动写入TIFF的自定义标签,读取时再提取恢复:
# 写入时将单位加入TIFF标签 writeRaster(x=A, filename="test.tif", overwrite=TRUE, options=c("TIFFTAG_IMAGEDESCRIPTION=units=Percent")) # 读取时提取标签恢复单位 B <- rast("test.tif") tag_val <- meta(B)$file[meta(B)$file$name == "TIFFTAG_IMAGEDESCRIPTION", "value"] units(B) <- sub("units=", "", tag_val) units(B) # 正常返回 "Percent"
注意:如果使用自定义TIFF标签存储单位,需要自行约定标签内容的格式,避免和其他写入该标签的元数据冲突。
方案3:R环境内复用的最简方案
如果文件仅在R环境内使用,可直接序列化保存SpatRaster对象,所有属性均可完整保留:
# 序列化保存 saveRDS(A, "test_spatraster.rds") # 读取验证 D <- readRDS("test_spatraster.rds") units(D) # 完整保留设置的单位
内容的提问来源于stack exchange,提问作者Jim Worrall
相关产品推荐
相关产品推荐

