Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:将光栅图层作为一个对象读取,以便在每个ENVI文件中应用一个函数_R_Spatial_Raster_R Raster - Fatal编程技术网

R:将光栅图层作为一个对象读取,以便在每个ENVI文件中应用一个函数

R:将光栅图层作为一个对象读取,以便在每个ENVI文件中应用一个函数,r,spatial,raster,r-raster,R,Spatial,Raster,R Raster,我有一个ENVI文件(82_83_test.ENVI),它包含1982年到1983年每两周一次的光栅图层。每年24层,总共48层。我想创建一个for循环,应用一个函数每年执行时间序列分析,即R将在一个像素中运行24层,并使用函数“fun”计算该年所有像素的5个参数。最终,我希望每年有5个地块(5个参数),因此两年总共有10个地块 我尝试使用1个包含2年数据的ENVI文件和2个包含1年数据的ENVI文件。我使用library spatial.tools中的brickstack_to_raster_

我有一个ENVI文件(82_83_test.ENVI),它包含1982年到1983年每两周一次的光栅图层。每年24层,总共48层。我想创建一个for循环,应用一个函数每年执行时间序列分析,即R将在一个像素中运行24层,并使用函数“fun”计算该年所有像素的5个参数。最终,我希望每年有5个地块(5个参数),因此两年总共有10个地块

我尝试使用1个包含2年数据的ENVI文件和2个包含1年数据的ENVI文件。我使用library spatial.tools中的brickstack_to_raster_list()读取文件,得到了48层。但是,我想得到2个区块(1982年和1983年),每个区块由24层组成,这样我就可以运行这个等式

也许像brickstack_to_raster_list()这样的东西,然后将第一层到第24层合并为一层,然后将第25层到第48层合并为一层

new <- stack("82_83_test.envi")
new1<- brickstack_to_raster_list(new)
另一种方法是将多个年度ENVI文件连接到一个列表中

new <- stack("1982_test.envi")
new1<- stack(new,new)
new2<- brickstack_to_raster_list(new1)

new在堆栈中读取后:

library(raster)    
new <- stack("82_83_test.envi")
库(光栅)

新更新:我能够循环该函数,但我猜测,在将其与真值进行比较后,计算是在所有光栅层上完成的。但是,由于两个文件具有相同的摘要,因此会生成两个具有不同文件名的相同内容的文件

new <- stack("82_83_test.envi")
new[new<=-1000]<-0
Data_value<-new/10000
nlayers <- nlayers(new)
nyears <- nlayers(new)/24
DOY<-((1:nlayers(new))/nyears)*15
dummy<- FALSE

for (i in 1:nyears) {
  for (j in (1+24*(i-1)):(24*i)) { 
    fun<-function (x)
    equation<-calc(Data_value,fun,forceapply=TRUE)
    date<- 1981+i
    writeRaster(equation,filename=paste("Output",date,".envi",sep=""),
    format="ENVI",overwrite=T)
    if (j == nlayers){
    dummy<-TRUE
    break
    if (dummy) {break}      
}
}

新的索引听起来是一个很好的方法。做一个嵌套的for循环怎么样?或者还有其他更有效的方法吗?嗨@maRtin,我尝试了索引,但我不能让writeRaster在不同的年份为我写两个不同的文件。year1@Candice抱歉,但很难复制和理解问题所在。一个最小的可复制示例:将非常有用。也许您可以删除有效的代码,并构建一个不起作用的部分的简短示例,以及输出应该是什么样子。我相信,如果您遵循这些指导原则,您的问题将吸引更多的答案。示例应包括以下内容:-)复制错误所需的最小数据集-)复制错误所需的最小可运行代码,可在给定数据集上运行。
library(raster)    
new <- stack("82_83_test.envi")
year1 <- new[[1:24]]
year2 <- new[[25:48]]
new <- stack("82_83_test.envi")
new[new<=-1000]<-0
Data_value<-new/10000
nlayers <- nlayers(new)
nyears <- nlayers(new)/24
DOY<-((1:nlayers(new))/nyears)*15
dummy<- FALSE

for (i in 1:nyears) {
  for (j in (1+24*(i-1)):(24*i)) { 
    fun<-function (x)
    equation<-calc(Data_value,fun,forceapply=TRUE)
    date<- 1981+i
    writeRaster(equation,filename=paste("Output",date,".envi",sep=""),
    format="ENVI",overwrite=T)
    if (j == nlayers){
    dummy<-TRUE
    break
    if (dummy) {break}      
}
}