我已经从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]))
}
答案 0 :(得分:0)
为什么要使用R,当你可以使用GDAL utilities从shell开始,使用多线程和更快的两行?
如果我正确理解您的问题和代码,您想要从大概MOD13Q1,HDF5容器中提取NDVI子数据集,重新投影到lat / lon,将文件类型更改为GeoTiff并将覆盖非洲的所有颗粒拼接成一个大的马赛克。
gdalbuildvrt -sd 1 NDVI.vrt MOD13Q1.*.hdf
请注意使用-sd 1
只使用每个HDF容器中的第一个子数据集。
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
参数,它也允许多线程,因此可以加快计算速度。
希望这很有用。