使用do.call在r中合并大量光栅

使用do.call在r中合并大量光栅,r,merge,r-raster,R,Merge,R Raster,我正在处理MODIS MOD15A2H数据集,希望将第一层的所有分片合并在一起。我使用gdal_translate()将.hdf层转换为.tif文件。并尝试使用do.call(merge,tiflist)进行合并()。我发现当列表长度超过5时,单元格的值会发生变化。(更新:我发现这与5无关。有时4个文件出错,而任意的3个文件运行良好。但是对于其他文件,没有这样的问题。)有人能帮忙吗?只是不知道为什么,在什么情况下do.call会有这样的问题 在我的案例中,我将乐趣从马赛克转换为合并,因为没有重叠

我正在处理MODIS MOD15A2H数据集,希望将第一层的所有分片合并在一起。我使用gdal_translate()将.hdf层转换为.tif文件。并尝试使用do.call(merge,tiflist)进行合并()。我发现当列表长度超过5时,单元格的值会发生变化。(更新:我发现这与5无关。有时4个文件出错,而任意的3个文件运行良好。但是对于其他文件,没有这样的问题。)有人能帮忙吗?只是不知道为什么,在什么情况下do.call会有这样的问题

在我的案例中,我将乐趣从马赛克转换为合并,因为没有重叠问题

#transform to tif
for (i in 1:length(hdffilenames)){
  gdal_translate(sdsnames[i,1], dst_dataset = paste("fpar_",substr(sdsnames[i,1],37,42),".tif",sep = ""))}
tifnames=paste("fpar_",substr(sdsnames[,1],37,42),".tif",sep = "")
h=as.integer(substr(sdsnames[,1],38,39))
subtifnames=list()
for (i in seq(1:36)){
  subtifnames[i]=tifnames[h=i]
}

#merge function
mergetifList <- function(tifList){
  
  #Internal function to make a list of raster objects from list of files.
  ListRasters <- function(list_names) {
    raster_list <- list() # initialise the list of rasters
    for (i in 1:(length(list_names))){ 
      tif_name <- list_names[i] # list_names contains all the names of the images in .tif format
      raster_file <- raster::raster(tif_name)
      raster_file[raster_file>1] <- NA
    }
    raster_list <- append(raster_list, raster_file) # update raster_list at each iteration
    return(raster_list)
    }
  
  #convert every raster path to a raster object and create list of the results
  raster.list <-sapply(tifList, FUN = ListRasters)
  
  # edit settings of the raster list for use in do.call and merge
  names(raster.list) <- NULL
  #####This function deals with overlapping areas
  #raster.list$fun <- max
  #run do call to implement mosaic over the list of raster objects.
  mergeRas <- do.call(raster::merge, raster.list)
  
  return(mergeRas)
}


非常感谢

您可能会看到此问题的变化:。尝试在调用
plot
时更改“maxpixels”值。顺便说一下,对于这种处理,您也可以考虑使用<代码> MODISSP 包:@ Louu谢谢您的友好回复!我不认为这是一个打印问题,因为当我检查合并光栅的值时,值确实会改变。现在我只是一个接一个地使用“合并”。非常感谢您为MODIStsp提供的信息。问题是我不确定它如何改变投影和分辨率。我找不到地方看它的源代码。我更喜欢自己做这件事。真奇怪。。。关于MODIStsp,分辨率投影的所有更改(如果需要)都基于对gdalwarp/gdaltranslate的标准调用。如果您感兴趣,可以在项目的github主页上找到源代码:再次感谢!我没有注意到那个网站上有源代码。我是这个领域的新手,我们正在努力创造一种新产品,因此我们希望确保每一步都按照我们的意愿进行。最好估计错误。您可能会看到此问题的变化:。尝试在调用
plot
时更改“maxpixels”值。顺便说一下,对于这种处理,您也可以考虑使用<代码> MODISSP 包:@ Louu谢谢您的友好回复!我不认为这是一个打印问题,因为当我检查合并光栅的值时,值确实会改变。现在我只是一个接一个地使用“合并”。非常感谢您为MODIStsp提供的信息。问题是我不确定它如何改变投影和分辨率。我找不到地方看它的源代码。我更喜欢自己做这件事。真奇怪。。。关于MODIStsp,分辨率投影的所有更改(如果需要)都基于对gdalwarp/gdaltranslate的标准调用。如果您感兴趣,可以在项目的github主页上找到源代码:再次感谢!我没有注意到那个网站上有源代码。我是这个领域的新手,我们正在努力创造一种新产品,因此我们希望确保每一步都按照我们的意愿进行。估计误差也更好。
 > tifname1=c("fpar_h29v09.tif", "fpar_h29v10.tif", "fpar_h29v11.tif", "fpar_h29v12.tif", "fpar_h29v13.tif")
    > m_1=mergetifList(tifname1)
    > plot(m_1)
> tifname2=c
("fpar_h29v08.tif", "fpar_h29v09.tif", "fpar_h29v10.tif", "fpar_h29v11.tif", "fpar_h29v12.tif")
> m_2=mergetifList(tifname2)
> plot(m_2)
> tifname3=c("fpar_h29v08.tif", "fpar_h29v09.tif", "fpar_h29v10.tif", "fpar_h29v11.tif", "fpar_h29v12.tif","fpar_h29v13.tif")
> m_3=mergetifList(tifname3)
> plot(m_3)