如何高效地将多个栅格图像(.tif)文件导入R?

8

我是一个R语言初学者,特别是在空间数据方面。我正在尝试找到一种将多个(约600个)单波段栅格(.tif)文件高效导入到R中的方法,所有文件存储在同一个文件夹中。不确定是否有影响,但请注意,在我的Mac和Windows Parallel VM上查看文件夹时,每个.tif文件有以下五(5)种文件格式=.TIF; .tfw; .TIF.aux.xml; .TIF.ovr; .TIF.xml。无论如何,以下代码(以及我尝试过的其他类似变体)似乎都无法正常工作:

library(sp)
library(rgdal)
library(raster)

#path to where all .tif files are located
setwd("/path/to/workingdirectory")

#my attempt to create a list of my .tif files for lapply
temp = list.files(pattern="*.tif")
temp #returns 'character(0)'

#trying to use the raster function to read all .tif files
myfiles = lapply(temp, raster)
myfiles #returns 'list()'

有没有一种有效的方法可以使用某种形式的循环来高效地导入所有光栅文件?

1
你说的 tif = .TIF 是什么意思?R 是大小写敏感的,所以要与扩展名对齐。尝试使用 pattern="*.TIF" - Parfait
4个回答

12

我找到了答案并将发布完整的代码,以帮助其他初学者R用户解决此问题。要调用列表元素,请使用双方括号[[]],就像这样:

#first import all files in a single folder as a list 
rastlist <- list.files(path = "/path/to/wd", pattern='.TIF$', 
all.files=TRUE, full.names=FALSE)

#import all raster files in folder using lapply
allrasters <- lapply(rastlist, raster)

#to check the index numbers of all imported raster list elements
allrasters

#call single raster element
allrasters[[1]]

#to run a function on an individual raster e.g., plot 
plot(allrasters[[1]])

太棒了。感谢 Parfait 的帮助。


7
如果这些栅格数据具有相同的范围,您可以将它们简单地加载到堆栈中。
#first import all files in a single folder as a list 
rastlist <- list.files(path = "/path/to/wd", pattern='.TIF$', all.files=TRUE, full.names=FALSE)

library(raster)
allrasters <- stack(rastlist)

2
尝试使用terra::包,速度快约三倍,以下是一些基准测试结果:

library(terra)
library(raster)
#first import all files in a single folder as a list 
rastlist <- list.files(path = "/path/to/wd", pattern='.tif$', all.files= T, full.names= T)

library(microbenchmark)
mb <- microbenchmark(
  stk1 <- terra::rast(rastlist),
  stk2 <- raster::stack(rastlist),
  unit = "s",
  times= 3
)
mb

加载130个文件,尺寸为2017, 2074(行数,列数),我得到了以下结果:

Unit: seconds
                            expr       min        lq      mean    median
   stk1 <- terra::rast(rastlist) 0.6909961 0.7543023 0.7797057 0.8176084
 stk2 <- raster::stack(rastlist) 2.2608693 2.3052319 2.3328234 2.3495944
        uq       max neval cld
 0.8240604 0.8305125     3  a 
 2.3688005 2.3880065     3   b

对于新手来说,从基准测试中仅获取代码即可:

library(terra)
rastlist <- list.files(path = "/path/to/wd", pattern='.tif$', all.files= T, full.names= T)
stk1 <- terra::rast(rastlist)

这个测试加载了130个光栅图像,其中每个图像有2017行和2074列。 - Yuri Gelsleichter

0

好的,我认为以下代码可以工作:

rastlist <- list.files(path = "/path/to/wd", pattern='.TIF$', all.files=TRUE, 
full.names=FALSE)
lapply(rastlist, raster)

但现在我如何访问单个栅格文件以进行进一步分析呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接