1

我有以下问题,请。我需要递归读取光栅图像,将它们堆叠并存储在具有不同名称的文件中(例如 name1.tiff,name2.tiff,...)

我尝试了以下方法:

 for (i in 10) {
   fn <- system.file ("external / test.grd", package = "raster")
   fn <-stack (fn) # not sure if this idea can work.
   fnSTACK[,, i] <-fn
 }

这里期望形式的结果:

暗淡(fnSTACK)

[1] 115 80 10

或类似的东西

但它没有用。

实际上,我有大约 300 张图像需要以不同的名称存储。目的是提取时间序列信息(如果您知道其他方法或建议,我将不胜感激)

欢迎任何建议。提前感谢您的宝贵时间。

4

4 回答 4

2

What I would first do is put all your *.tiff in a single folder. Then read all their names into a list. Stack them and then write a multi-layered raster. I'm assuming all the images have the same extent and projection.

    ### Load necessary packages
library(tiff)
library(raster)
library(sp)
library(rgdal)   #I cant recall what packages you might need so this is probably 
library(grid)    # overkill
library(car)

############ function extracts the last n characters from a string  
############ without counting the last m
subs <- function(x, n=1,m=0){
  substr(x, nchar(x)-n-m+1, nchar(x)-m)
  }



setwd("your working directory path") # you set your wd to were all your images are
filez <- list.files() # creates a list with all the files in the wd
no <- length(filez) # amount of files found
imagestack <- stack() # you initialize your raster stack

for (i in 1:no){

  if (subs(filez[i],4)=="tiff"){

  image <- raster(filez[i]) # fill up raster stack with only the tiffs

  imagestack <- addLayer(imagestack,image)
   }
}

writeRaster(imagestack,filename="output path",options="INTERLEAVE=BAND",overwrite=TRUE)
# write stack

I did not try this, but it should work.

于 2013-05-10T21:05:25.633 回答
1

另一种堆叠方法

 library(raster)       
 list<-list.files("/PATH/of/DATA/",pattern="NDVI",
            recursive=T,full.names=T)
 data_stack<-stack(list)
于 2015-02-27T03:33:01.647 回答
1

感谢“ JEquihua ”的建议,只需在 addLayer 之前添加初始变量即:

对于(我在 1:否){

if (subs(filez[i],4)=="tiff"){

image <- raster(filez[i]) # 只用 tiff 填充光栅栈

     imagestack <- addLayer(imagestack,image)

}

}

对不起,“ RobertH ”,我是关于 R 的新手。下次我会被问到,更确定或更准确。

此外,关于从堆叠的 MODIS 图像时间序列中提取数据的任何建议。或库示例:“rts()”、“ndvits()”或“bfast()”

向整个社区致以问候。

于 2013-05-24T01:29:10.370 回答
1

您的问题相当模糊,如果您提供了一个完整的示例脚本以便更容易理解它会有所帮助。您说您需要读取几个(可能不是递归的?)光栅图像(大概是文件)并创建一个堆栈。然后您需要将它们存储在具有不同名称的文件中。这听起来像是将文件复制到具有不同名称的新文件中,并且为此提供了 R 函数,但这可能不是您要问的。

如果您有一堆文件(具有完整路径名或在工作目录中),例如来自 list.files()

 f <- system.file ("external/test.grd", package = "raster")
 ff <- rep(f, 10)

你可以做

 library(raster)
 s <- stack(ff)

我假设您只需要这个堆栈来进行 R 中的操作(它是一个对象,但不是一个文件)。您可以通过多种方式提取值(请参阅光栅包的帮助文件和插图)。如果你想要一个三维数组,你可以做

 a <- as.array(s)
 dim(a)
 [1] 115  80  10
于 2013-05-11T18:04:03.227 回答