合并/保存分区栅格时发生错误

时间:2018-07-17 16:31:24

标签: r gis raster

我正在尝试使用ecoclim软件包创建19个生物气候变量,该软件包包含一个函数biovariables,该函数类似于dismo软件包中的函数,但有一些细微的差异。我运行的代码如下:

s <- stack(prcp, tmax, tmin) # prcp, tmax, and tmin are climate rasters
# cluster setup
cpus <- 2
cl <- makeCluster(cpus)
registerDoParallel(cl)

# compute biovars
nchunks <- cpus
r <- foreach(i=1:nchunks,
             .packages=c("raster", "ecoclim")) %dopar% {
             rasterOptions(tmpdir="D:\\latjam\\RTempDir")
             tile <- partitionRaster(s, nchunks, i, subextent=ext)
             calc(tile, fun=function(x)biovariables(x))
             }
stopCluster(cl)
save(r, file=paste0(ouptput.path, "\\biovars.RData")

# combine tiles and save
r <- do.call("merge", r)
names(r) <- c("bio1", "bio2", "bio3", "bio4", "bio5", "bio6", "bio7", "bio8", "bio9", "bio10", "bio11", "bio12", "bio13", "bio14", "bio15", "bio16", "bio17", "bio18", "bio19")
writeRaster(r, filename=paste0(output.path), format="GTiff", bylayer=TRUE, suffix=names(r), overwrite=TRUE)

这花了大约6天的时间(不是在我的笔记本电脑上运行的,该笔记本电脑不是为执行此类繁重的计算任务而设计的),而在那段时间的最后,生物变量的创建似乎奏效了,但没有合并。

这是我得到的错误:

Error in dim(res) <- c(ncols, raster@data@nlayers * nrows) : 
  dims [product 4926168] do not match the length of object [0]
In addition: There were 50 or more warnings (use warnings() to see the    first 50)

所有警告均与此类似:

Warning messages:
1: In writeBin(as.vector(v[start:end, ]), x@file@con, size = x@file@dsize) : 
  problem writing to connection
2: In writeBin(as.vector(v[start:end, ]), x@file@con, size = x@file@dsize) : 
  problem writing to connection
3: In writeBin(as.vector(v[start:end, ]), x@file@con, size = x@file@dsize) : 
  problem writing to connection

这与here中讨论的有关此过程的dismo软件包版本的问题非常相似,事实证明这是一个错误(正如dismo的作者之一Robert Hijmans指出的)。不过,我不确定是否/如何与我当前的问题相关,因为1)该帖子是几年前的,而2)它是指不同的程序包(尽管错误完全相同)。

biovariables函数似乎起作用了,因为当我打印变量“ r”时,它表明它是一个包含两个栅格砖的列表,每个栅格砖有19层(请注意,我分别更改了每个栅格砖的层名称(即,names(r [[{2]] <-c(“ bio1”,...),因为上面的脚本在到达该行之前失败了:

> r 
[[1]] 
class       : RasterBrick  
dimensions  : 46812, 28808, 1348560096, 19  (nrow, ncol, ncell, nlayers) 
resolution  : 0.0002777778, 0.0002777778  (x, y) 
extent      : -108.0017, -99.99944, 24.99833, 38.00167  (xmin, xmax, ymin, ymax) 
coord. ref. : +proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0  
data source : E:\latjam\RTempDir\r_tmp_2018-07-10_074433_1460_37587.grd  
names       :       bio1,       bio2,       bio3,       bio4,       bio5,       bio6,       bio7,       bio8,       bio9,      bio10,      bio11,      bio12,      bio13,      bio14,      bio15, ...  
min values  : 355.49428,  -30.54803,  -38.78388,   29.11857,  570.40875, 
143.34456,   78.76477,  483.32777,  231.66794,  483.32777,  231.66794,  374.92570,  116.42382,  -63.54390,   34.71124, ...  
max values  : 754.37680,  368.53211,   50.35605,  180.41047, 1058.88306,  528.83374,  786.51141,  879.90896,  703.44998,  885.57367,  619.41184, 4850.45081,  702.15985,  166.85643,  217.05643, ... 


[[2]] 
class       : RasterBrick  
dimensions  : 46812, 28808, 1348560096, 19  (nrow, ncol, ncell, nlayers) 
resolution  : 0.0002777778, 0.0002777778  (x, y) 
extent      : -100.0006, -91.99833, 24.99833, 38.00167  (xmin, xmax, ymin, ymax) 
coord. ref. : +proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0  
data source : E:\latjam\RTempDir\r_tmp_2018-07-10_073256_2256_72283.grd  
names       :       bio1,       bio2,       bio3,       bio4,       bio5,       bio6,       bio7,       bio8,       bio9,      bio10,      bio11,      bio12,      bio13,      bio14,      bio15, ...  
min values  : 546.52371,   65.88422,   27.78071,   52.07848,  740.37781, 
171.56345,  210.77826,  488.27865,  324.20001,  681.26182,  324.20001, 1761.78778,  248.91402,   50.35446,   10.85425, ...  
max values  : 767.22937,  287.67553,   45.61213,  182.14504, 1006.36127,  555.46893,  770.77739,  866.80438,  831.02033,  879.99723,  646.40201, 6514.58429,  717.35217,  449.91504,   62.39409, ...

因此,我尝试了几种方法来逐层保存图层。首先,我的计划是保存每个积木的每一层,然后在事实之后合并相关的图层(例如,保存r [[{1]中的bio1和r [[{2]中的bio1)然后合并它们,依此类推),但出现错误:

> for(i in 1:19){
+   writeRaster(r[[1]][[i]], filename=paste0(output.path, "\\bio", i,    "a.tif"))
+ }
Error in result[, i] <- readBin(raster@file@con, what = dtype, n = ncols,  : replacement has length zero
In addition: Warning message:
In pmatch(origin, c("start", "current", "end")) : closing unused connection 3 (E:\latjam\RTempDir\r_tmp_2018-07-10_074433_1460_37587.gri)

基于阅读writeRaster上的R文档,我想也许我需要将积木另存为多波段栅格,因此我尝试了此操作(但又出现了另一个错误):

writeRaster(r[[1]],filename="bio_a.tif", bandorder="BIL", overwrite=TRUE)
Error in rgdal::putRasterData(x@file@transient, vv, band = i, offset = off) : 
  Failure during raster IO

然后,我想也许我可以将每个生物变量的两个部分一一合并,然后分别保存,所以我尝试了一下(并得到一个错误):

m.1 <- merge(r[[1]][[1]], r[[2]][[1]], filename=paste0(output.path, "\\bio1.tif"))
Error in rgdal::putRasterData(x@file@transient, v, band = 1, offset = off) : 
Failure during raster IO
In addition: Warning messages:
1: closing unused connection 3 (E:\latjam\RTempDir\r_tmp_2018-07-10_074433_1460_37587.gri) 
2: closing unused connection 4 (C:/Users/ldugan/Documents/R/bio_a.gri) enter code here

最后,基于我看到的herehere的类似代码,我尝试了一下,但又出现了错误:

outfile <- writeRaster(r[[1]], filename="bio_a.tif", format="GTiff", overwrite=TRUE, options=c("INTERLEAVE=BAND", "COMPRESS=LZW"))
Error in dim(res) <- c(ncols, raster@data@nlayers * nrows) :
  dims [product 9852336] do not match the length of object [0]

我感觉到问题的根源可能与像几年前的dismo包一样与潜在的错误有关,或者与磁盘空间有关。即使我设置了光栅选项以将临时文件存储在指定的文件夹中,也有一些文件也存储在我的C驱动器中,并且几乎填满了它。不过,对于什么地方和哪些事情很重要,我有些困惑。第一张图片是我的C驱动器上的temp文件夹,其中R正在存储与此过程相关的文件:

tmpdir()
[1] "C:\\Users\\Me\\AppData\\Local\\Temp\\RtmpU9CJlB"

请注意,“ raster”文件夹中是一个128 GB的文件,其日期会随着我尝试各种操作而不断更新为当前日期(并且其命名约定类似于下图中的那些文件)。 C_drive_temp_folder_tree

这张照片是我在外接驱动器的栅格选项中设置的临时文件夹的。我不确定是否可以删除较早日期的文件(即,仅最后一个文件重要,其余的可以删除以创建空间吗?)我尝试操作时(例如文件),最新文件的日期也会更改在C驱动器上的文件夹中): temp_folder_as_set_in_rasterOptions

因为花费了很长时间,所以我真的想弄清楚如何在不更改.REnviro的tmpdir的情况下从砖中保存图层,因为这需要关闭和打开一个新的会话,我担心将会失去我访问和保存内容的能力(无需再次运行脚本)。我已经将“ r”(包含两个光栅块的列表)另存为.RData文件,并且仍然创建了所有临时文件,因此这可能是非问题并关闭,更改.REnviro文件和重新打开R是解决办法?我觉得我很亲近。数据就在那里。我似乎无法合并和/或保存它们。

0 个答案:

没有答案