并行处理R中的MODIS图像

时间:2015-07-22 17:10:22

标签: r foreach parallel-processing gdal

我已经从MODIS下载了非洲的所有植被数据,现在我正在尝试从图像中创建马赛克并将其保存为地理位置。在尝试在MacPro 6核心,12个线程上并行运行之前,我没有遇到任何问题。代码运行但它只使用1%的内核可用性,并且永远需要完成这些过程。

我真的需要帮助,我需要将超过70GB的MODIS颗粒转换成马赛克,如果我不使用我在实验室中获得的所有计算机功能,这将永远需要帮助。

以下是并行处理的代码部分:

有两个部分并行运行,1。选择NDVI; 2.要创建马赛克,请将它们投影并保存为.tif。

# register the cluster with 10 cores 
registerDoParallel(cores=11)
miCluster<-makeCluster(11)
registerDoParallel(miCluster)
library(doMC)
registerDoMC(11)

# 1.
# select the NDVI for each Africa Granule and put it in SdsList
sdsList <- foreach(k = 1:length(dateGranules), .packages=c("raster", "gdalUtils","foreach"))%dopar%{
  for(j in 1:1:length(dateGranules)){
    return(sapply(X=dateGranules[[j]], FUN=function(x){get_subdatasets(x)[1]}))
  }
}

2.
# Generate the Mosaic for Africa with NDVI as aoutput
foreach(j = 1:length(sdsList), .packages=c("raster", "gdalUtils", "foreach"))%dopar%{
    gdalwarp(srcfile=sdsList[[j]], t_srs="+proj=longlat +datum=WGS84   +no_defs",
      dstfile=file.path(dest, names[j]))
}  

2 个答案:

答案 0 :(得分:0)

为什么要使用R,当你可以使用GDAL utilities从shell开始,使用多线程和更快的两行?

如果我正确理解您的问题和代码,您想要从大概MOD13Q1,HDF5容器中提取NDVI子数据集,重新投影到lat / lon,将文件类型更改为GeoTiff并将覆盖非洲的所有颗粒拼接成一个大的马赛克。

  1. 构建包含所有NDVI子数据集的Virtual Raster Table
  2. gdalbuildvrt -sd 1 NDVI.vrt MOD13Q1.*.hdf

    请注意使用-sd 1只使用每个HDF容器中的第一个子数据集。

    1. 重新投影和更改格式。
    2. gdalwarp gdalwarp -t_srs "+proj=longlat +datum=WGS84 +no_defs" -multi NDVI.vrt NDVI-mosaic.tif

      第一步几乎没有时间,因为它只创建一个元数据文件,其中包含有关HDF文件层次结构的信息,并且没有进行实际处理。如果颗粒是相邻的,例如h15v05,h15v04,h14v05,......,它们的地理位置将被正确拼接。

      第二步是实际的重投影和文件格式更改。我在我的core2duo(3GHz)上测试了这个,并且20个MODIS颗粒的重投影大约需要1.5分钟。所以,即使没有多线程,你也应该比在R中快得多。

答案 1 :(得分:0)

对这个问题稍作更新。

如果你仍然需要坚持使用R来处理你的图像,你可以使用gdalUtils包,它基本上是所有GDAL应用程序的包装器。

例如,您可以使用以下脚本在R中巧妙地使用@Kersten提出的命令:

library(gdalUtils)

gdalbuildvrt("MOD13Q1.*.hdf", "NDVI.vrt", sd=1)

gdalwarp("NDVI.vrt", "NDVI-mosaic.tif",
         t_srs="+proj=longlat +datum=WGS84 +no_defs", multi=TRUE)

这些函数基本上会调用系统的GDAL命令,但是通过R.

请注意multi参数,它也允许多线程,因此可以加快计算速度。

希望这很有用。