我正在使用 ClimateNA 网站 (https://adaptwest.databasin.org/pages/adaptwest-climatena/) 的 tif 文件栅格,每个文件约为 18 到 40MB。所以我无法在这里上传文件,下载整套文件会花费大量时间(所以还没有要求您这样做!)。所以不知道如何使我的问题更具可重现性。但我会尽力解释。
使用来自
rast()
的函数 terra
加载栅格文件(每个栅格仅包含 1 层)时,我得到以下信息:
class : SpatRaster
dimensions : 7617, 7688, 1 (nrow, ncol, nlyr)
resolution : 1000, 1000 (x, y)
extent : -4352000, 3336000, -3341000, 4276000 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
source : Normal_1991_2020_bFFP.tif
name : bigfile[, varname]
min value : 0
max value : 292
注意源是正确的,但名称已更改为“bigfile[, varname]”。对于其他较小尺寸的栅格,这种情况不会发生。我可以用
terra::name()
重命名图层。我并没有真正尝试使用 name =
参数在函数内手动分配名称。但这仅适用于 1 个文件。我需要以自动化的方式与几个人一起工作。
所以,我的主要问题是我实际上使用栅格列表并在
rast()
中读取它们,如下所示:
# produces a list of name from the previously defined folder containing all the raster tif files
Normrast<- list.files(path = clim.folder, pattern='.tif$', all.files=TRUE, full.names=TRUE)
# Get and stack Climate rasters from folder above
NormStack<-terra::rast(Normrast)`
这会产生以下对象:
> NormStack
class : SpatRaster
dimensions : 7617, 7688, 12 (nrow, ncol, nlyr)
resolution : 1000, 1000 (x, y)
extent : -4352000, 3336000, -3341000, 4276000 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
sources : Normal_1991_2020_CMD.tif
Normal_1991_2020_EMT.tif
Normal_1991_2020_FFP.tif
... and 9 more source(s)
names : bigfi~name], bigfi~name], bigfi~name], bigfi~name], bigfi~name], bigfi~name], ...
min values : 0, -67.9, 0, -27.3, -45.1, -14.7, ...
max values : 2185, 29.2, 365, 30.4, 28.4, 38.8, ...
如果我尝试使用 terra::names() 更改名称,它似乎可以通过使用 list.files() 从所有文件所在的文件夹中分配名称 vecto 来工作,但我想知道为什么会发生这种行为。我还担心确保使用 terra::names() 的分配工作正常,更多的文件使交叉检查比使用大约 10 个光栅文件时更加复杂。也许有时不尊重文件的顺序(到目前为止,似乎是这样)。
我已经广泛搜索了为什么会发生这种情况,但没有结果。我发现在光栅包中发生类似的事情的参考 https://gis.stackexchange.com/questions/317591/why-raster-layer-name-change-to-default-when-using-rastercalc-function 但没有关于这个特定问题的任何内容。提出一个 github 问题来询问这种行为值得吗?现在,栅格包似乎也发生了同样的行为(我实际上正在将一些代码从栅格迁移到 terra)。
感谢您的任何建议!干杯!
您有一个文件名向量(不是“列表”)并创建一个 SpatRaster。
ff <- list.files(pattern='.tif$', full.names=TRUE)
x <- terra::rast(ff)
如果您不喜欢
x
的图层名称,您可以更改它们。比如这样
names(x) <- gsub(".tif$", basename(ff))
这样,您就可以确定名称与图层正确匹配。
您将得到
bigfile[, varname]
,因为这是您正在使用的文件中指定的内容。如果你想修复这个问题,你需要询问文件的创建者。这显然是他们处理中的一个错误。