使用terra与raster包读取同一份TIF文件结果差异原因咨询
问题:terra与raster包读取同一栅格文件显示数值差异的原因
我同时使用terra包和raster包读取一份栅格文件,代码如下:
library(raster) library(terra) fl_terra <- terra::rast('my_raster.tif') fl_raster <- raster::raster('my_raster.tif') fl_terra # 输出: # class : SpatRaster # dimensions : 157450, 327979, 1 (nrow, ncol, nlyr) # resolution : 0.0002777778, 0.0002777778 (x, y) # extent : -142.4107, -51.30541, 41.12569, 84.86181 (xmin, xmax, ymin, ymax) # coord. ref. : lon/lat WGS 84 (EPSG:4326) # source : xxxx.tif # categories : DepthBand # name : DepthBand # min value : 0.0m <= x <= 0.3m # max value : x > 9.0m fl_raster # 输出: # class : RasterLayer # dimensions : 157450, 327979, 51640293550 (nrow, ncol, ncell) # resolution : 0.0002777778, 0.0002777778 (x, y) # extent : -142.4107, -51.30541, 41.12569, 84.86181 (xmin, xmax, ymin, ymax) # crs : +proj=longlat +datum=WGS84 +no_defs # source : xxxx.tif # names : DepthBand # values : 1, 6 (min, max)
使用两个包读取同一文件却显示不同数值:terra包输出深度区间分类,raster包输出1-6的数值,且QGIS中显示的结果与raster包一致,请问该差异产生的原因是什么?
答案
差异的核心原因是两个包对分类栅格的默认处理逻辑不同:
- 你的栅格是分类栅格:底层存储的是1-6的整数编码,同时附带了属性表,把每个编码映射到对应的深度区间文本(比如1对应
0.0m <= x <= 0.3m,6对应x > 9.0m)。 - terra包默认会自动识别并加载分类属性表,在打印对象时直接展示对应的分类文本,让结果更直观;但实际上底层存储的数值还是1-6,只是展示时做了映射转换。
- raster包默认只读取栅格的底层数值(也就是1-6的整数编码),不会自动解析并展示分类属性表的内容。你可以通过
levels(fl_raster)命令手动查看对应的分类映射关系。 - QGIS显示和raster一致,是因为默认渲染模式下它直接展示栅格的底层数值,如果想要显示深度区间,需要在图层属性里设置“使用分类属性表渲染”。
验证方法
执行以下代码可以确认两者的映射关系是一致的:
# 查看raster包的分类属性表 levels(fl_raster) # 查看terra包的分类属性表 terra::cats(fl_terra)
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

