无法使用加载工作区文件完全还原某些R栅格对象

时间:2017-09-26 04:52:33

标签: r r-raster

我正在使用R(不是RStudio)3.3.3在Mac0S10.10.5的R光栅包中处理地理参考图像。使用GUI将工作区保存到xxx.RData文件后,我关闭会话重启R(在启动时不读取历史文件),然后使用GUI再次加载工作区。当我输入ls()时,会出现所有对象(包括我加载的原始全局栅格以及使用crop()创建的子集)。但是,当我绘制栅格时,只绘制原始的非裁剪图像。裁剪的子集没有绘制,而是我得到以下错误:

>Error in file(fn, "rb") : cannot open the connection
    >In addition: Warning message:
    >In file(fn, "rb") :
    cannot open file          '/private/var/folders/8y/6924gdvx3jg6k2rz5yrzwz100000gr/T/Rtmpc0b3TY/raster/r_tm   p_2017-09-25_180525_90510_17665.gri': No such file or directory

尝试隔离此问题,我制作了一个2x2栅格数据集,然后制作了1x1的子集。这两个栅格对象都可以恢复,并且可以使用plot()查看。所以,我无法使用这些简单的数据集重现问题。所以问题似乎与原始的大文件有关,而且我已经裁剪了它。 此外,如果我重新创建裁剪(" newfile< - crop(oldfile,extentObject)"),我可以创建一个可查看的栅格数据集。但是,再次,如果我尝试保存此工作区并在以后恢复它,我又回到无法绘制它。如果我执行writeRaster(),我可以成功写入文件,退出R,然后重新导入该文件。因此,问题似乎仅限于将整个工作空间保存为" xxx.RData"文件。

library(raster)
    library(sp)
    library(rgdal)
    fullraster <- raster("raster.tif")
    cropraster <- crop(fullraster,extentobject)
    toyraster <- raster(as.matrix(cbind(c(1,2),c(3,4))))
    toyrastersub <- crop(toyraster, extent(c(0,.5,0,.5)))
    plot (fullraster) # works
    plot (cropraster) # works
    plot (toyraster) # works
    plot (toyrastersub) #works
    writeRaster(cropraster,"croprasterout")
    # Perform Save workspace as... 
    # Exit R
    #open R without reading history file
    # Load Workspace File...
    library(raster)
    library(sp)
    library(rgdal)
    reloadedraster <- raster("croprasterout")
    croprasteragain <- crop(fullraster,extentobject)
    plot (fullraster) #works
    plot (reloadedraster) #works
    plot (toyraster) # works
    plot (toyrastersub) #works
    plot (croprasteragain) # works
    plot (cropraster) # produces error in block quotes above.

我尝试使用默认工作区文件保存重新安装R,重新加载对象,但这些措施都没有解决问题。我也无法在Stackoverflow或Internet上的其他地方找到解决方案。

一个有希望的线索是,当我打印出来&#34; str(cropraster)&#34;从Load Workspace恢复但不可绘制,它与重新创建的工作区域略有不同&#34; str(croprasteragain)&#34;我粘贴了以下不同的输出:

str(cropraster)
    > .. .. ..@ name        : chr        >"/private/var/folders/8y/6924gdvx3jg6k2rz5yrzwz100000gr/T/Rtmpc0b3TY/raster/r_t  mp_2017-09-25_180525_90510_17665.grd"

    >  .. .. ..@ datanotation: chr "INT2S"

    >  .. .. ..@ byteorder   : Named chr "little"

    >  .. .. .. ..- attr(*, "names")= chr "value"

    >  .. .. ..@ nodatavalue : num -32768


    str(croprasteragain)
    >   .. .. ..@ name        : chr "/QGISWork/Chelsa1.2/IntegerBioclim/crapdir/junk.rasterout.grd"

    > .. .. ..@ datanotation: chr "FLT8S"

    > .. .. ..@ byteorder   : Named chr "little"

    >  .. .. .. ..- attr(*, "names")= chr "value"

    >  .. .. ..@ nodatavalue : num -1.7e+308

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

使用library(raster)创建栅格时,栅格中包含的数据很可能会保存在临时文件夹中(如果足够小,则保存在RAM中)。但是数据不会保存在R会话中。保存在R会话中的唯一信息是元数据以及RAM或磁盘上的数据位置 因此,在保存和恢复会话时,获取栅格数据的唯一方法是确保栅格与关闭会话之前的位置相同。如果您没有将光栅及其数据保存在已知位置,则会在下一个会话中丢失它 这就是你第二次测试的原因:

  • plot(fullraster)#works:它在&#34; raster.tif&#34;
  • 中读取原始数据
  • plot(reloadedraster)#works:它读取磁盘上的数据&#34; croprasterout&#34;
  • plot(croprasteragain)#works:crop在会话中完成,但数据保存在临时文件中。
  • plot(cropraster)#在上面的块引号中产生错误:它尝试读取上一个会话的临时文件中的数据,该数据在会话关闭时已被删除。

因此,如果您希望能够重复使用以前的栅格对象,则需要使用writeRaster并阅读它,就像使用reloadedraster一样。保存栅格时尝试使用文件扩展名:.grdlibrary(raster)的默认值。

答案 1 :(得分:0)

我已经找到了对另一个问题(Issue using saveRDS() with raster objects)的回复,这帮助我找到了一个解决我的问题的方法,这些问题看起来是我所知道的最实用的问题。 @RobertH对该问题的回答表明,添加readAll(栅格)将确保将值保存到.RData内存中。这似乎非常令人满意:

    fullraster <- raster("raster.tif")
    cropraster.readall <- readAll(crop(fullraster,cropbox2))
    #save and close R session.
    #delete raster.tif file in OS.
    Reopen and restore R session
    plot(fullraster) #doesn’t work, presumably b/c raster.tif deleted.
    plot(cropraster.readall) #WORKS!  

使用writeRaster单独保存文件也可以工作(正如@StatnMap友好建议和解释)。出于我的目的,我发现该解决方案不太受欢迎,因为在R会话中似乎需要特别注意以单独保存每个必需的光栅文件。