【问题标题】:How to write a loop in R for HDF files?如何在 R 中为 HDF 文件编写循环?
【发布时间】:2017-03-12 12:18:32
【问题描述】:

我的文件夹中有 1,000 多张 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) 

由于文件夹中有1000多个HDF文件1年,我应该如何编写一个循环以对所有HDF文件使用该功能,并为每个日期制作一个马赛克文件?

如果有人可以帮助我,我将非常感激。

谢谢。

【问题讨论】:

  • 由于它不在您显示的代码中,我只想确保您知道您的第一步应该类似于all_hdf &lt;- list.files(path = "M:/join/", pattern = "*.hdf")

标签: r mosaic hdf


【解决方案1】:

使用 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)
}

这应该保存每个组的所有马赛克文件,文件名作为组 ID。

【讨论】:

  • 感谢您的回答。我做了你的步骤,但显示此错误: .local(hdfNames, filename, MRTpath, ...) 中的错误:无法为 ONE 图像调用马赛克!
  • @Canada2015 这可能是因为您的组只有一个文件。有这种可能吗?
  • 不,此时,我只运行您的脚本 2 天。因此,我的文件夹中有 12 个 HDF 文件,第 1 天有 6 个文件,第 2 天有 6 个。
  • 我们可以用strsplit函数做一个列表吗?因为在这种情况下,R 将能够识别特定日期的 HDF 文件。我只是猜测,不确定。
【解决方案2】:
    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)
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 2014-09-23
    • 2020-05-02
    • 2021-04-17
    • 2017-01-09
    • 2016-10-17
    • 2021-11-15
    • 2020-07-28
    相关资源
    最近更新 更多