递归堆叠的光栅图像

时间:2013-05-09 21:59:29

标签: r time-series

请问我有以下问题。 我需要读取递归光栅图像,堆叠并将它们存储在具有不同名称的文件中(例如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 个答案:

答案 0 :(得分:2)

我首先要做的是将所有* .tiff放在一个文件夹中。然后将所有名称读入列表。堆叠它们然后写一个多层栅格。我假设所有图像具有相同的范围和投影。

    ### 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

我没试过,但它应该有用。

答案 1 :(得分: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

答案 2 :(得分:1)

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

  

for(i in 1:no){

     

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

     

image&lt; - raster(filez [i])#只用tiff填充光栅堆栈

     imagestack <- addLayer(imagestack,image)
     

}

     

}

抱歉“ RobertH ”,我是关于R的新手。下次我会问,更确定或确切。

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

向整个社区致以问候。

答案 3 :(得分:1)

另一种堆叠方法

 library(raster)       
 list<-list.files("/PATH/of/DATA/",pattern="NDVI",
            recursive=T,full.names=T)
 data_stack<-stack(list)