You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:50:23