Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.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中为HDF文件编写循环?_R_Mosaic_Hdf - Fatal编程技术网

如何在R中为HDF文件编写循环?

如何在R中为HDF文件编写循环?,r,mosaic,hdf,R,Mosaic,Hdf,我在一个文件夹中有1000多个MODIS HDF图像: M:\join 它们的名字告诉我们哪些HDF文件属于某个日期,并且必须拼接在一起 例如,在下图中,2009090表示这三幅图像属于同一日期,必须拼接在一起: MOD05_L2.A2009090.0420.051.2010336084010 MOD05_L2.A2009090.0555.051.2010336100338 MOD05_L2.A2009090.0600.051.2010336100514 或者这两个日期相同,2009091:

我在一个文件夹中有1000多个MODIS HDF图像:

M:\join
它们的名字告诉我们哪些HDF文件属于某个日期,并且必须拼接在一起

例如,在下图中,2009090表示这三幅图像属于同一日期,必须拼接在一起:

MOD05_L2.A2009090.0420.051.2010336084010
MOD05_L2.A2009090.0555.051.2010336100338
MOD05_L2.A2009090.0600.051.2010336100514
或者这两个日期相同,2009091

MOD05_L2.A2009091.0555.051.2010336162871
MOD05_L2.A2009091.0600.051.2010336842395
现在,我能够成功地使用mosaicHDF()将它们拼接到一个日期,如下所示:

hdfs <- c('MOD05_L2.A2009090.0420.051.2010336084010.hdf',
          'MOD05_L2.A2009090.0555.051.2010336100338.hdf',
          'MOD05_L2.A2009090.0600.051.2010336100514.hdf')

mosaicHDF(hdfNames=hdfs, filename='newhdf.hdf', MRTpath='C:/MRT/bin',bands_subset="1 0 0 0", delete=FALSE) 

hdfs使用
grep
按文件ID对文件进行分组,然后使用for循环为每个组创建马赛克:

fnames <- c("MOD05_L2.A2009090.0420.051.2010336084010", "MOD05_L2.A2009090.0555.051.2010336100338", "MOD05_L2.A2009090.0600.051.2010336100514", "MOD05_L2.A2009091.0555.051.2010336162871", "MOD05_L2.A2009091.0600.051.2010336842395")
#or
fnames <- list.files(path = "M:/join/", pattern = "*.hdf") #Credits do @Gregor for noticing this

ids <- unique(substr(fnames, 10, 17))

groups <- sapply(ids, grep, fnames, value=TRUE)

for (gr in seq_along(groups)) {
  mosaicHDF(hdfNames=groups[[gr]], filename=paste0(names(groups)[gr], '.hdf'), 
            MRTpath='C:/MRT/bin',bands_subset="1 0 0 0", delete=FALSE)
}

fnames
fnames因为它不在你展示的代码中,我只想确保你知道你的第一步应该是
all\hdf感谢你的回答。我执行了您的步骤,但显示了此错误:error in.local(hdfNames,filename,MRTpath,…):不能为一个图像调用马赛克@Canada2015这可能是因为您的组只有一个文件。有可能吗?没有,现在我只运行你的脚本两天。所以,我在文件夹中有12个HDF文件,第1天有6个文件,第2天有6个文件。我们可以用strsplit函数列出一个列表吗?因为在这种情况下,R将能够识别特定日期的HDF文件。我只是猜测,不确定。
    fnames <- c("MOD05_L2.A2009090.0420.051.2010336084010", "MOD05_L2.A2009090.0555.051.2010336100338", "MOD05_L2.A2009090.0600.051.2010336100514", "MOD05_L2.A2009091.0555.051.2010336162871", "MOD05_L2.A2009091.0600.051.2010336842395")
    #or
    fnames <- list.files(path = "M:/join/", pattern = "*.hdf") #Credits do @Gregor for noticing this

    ids <- unique(substr(fnames, 10, 17))

    groups <- lapply(ids, grep, fnames, value=TRUE)  # This line should be lapply instead of sapply
    ref.num = substr(groups[[j]][1], 10, 17) #Give output different names


for (gr in seq_along(groups)) {
ref.num = substr(groups[[gr]][1], 10, 17) 
      mosaicHDF(hdfNames=groups[[gr]], filename=paste0("MOD05_",ref.num, ".hdf"), 
                MRTpath='C:/MRT/bin',bands_subset="1 0 0 0", delete=FALSE)
    }