我正在使用 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。
该文件具有分类值。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)