使用 terra 和 raster 包读取 tif 文件给出不同的结果

89_*_*ple 2 r raster terra

我正在使用 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)
Run Code Online (Sandbox Code Playgroud)

为什么使用两个包读取相同的文件显示不同的值?fl_raster如果我在 QGIS 中打开相同的文件,图例将显示使用该包的 ie中存在的值raster

Rob*_*ans 5

该文件具有分类值。fl_terra告诉你:

categories  : DepthBand 
Run Code Online (Sandbox Code Playgroud)

它还正确显示了类别的(按字母顺序)范围(并且在使用绘图时还在图例中使用它们,并在提取单元格值时返回它们)。

name        :         DepthBand 
min value   : 0.0m <= x <= 0.3m 
max value   :          x > 9.0m 
Run Code Online (Sandbox Code Playgroud)

如果您不关心类别,可以使用以下命令删除它们

levels(fl_terra) <- NULL
Run Code Online (Sandbox Code Playgroud)

相反,fl_raster显示用于表示类别的数字代码(因为栅格文件只能存储数字像元值)。

values     : 1, 6  (min, max)
Run Code Online (Sandbox Code Playgroud)

这使得你看起来像是有数值。但事实并非如此。

这种情况类似于 R 中有一个因子

f <- as.factor(c("red", "blue", "green"))
Run Code Online (Sandbox Code Playgroud)

“terra”将显示类别标签

f
#[1] red   blue  green
#Levels: blue green red
Run Code Online (Sandbox Code Playgroud)

而“光栅”将显示相当于

as.integer(f)
#[1] 3 1 2
Run Code Online (Sandbox Code Playgroud)