我正在使用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
感谢您的帮助!
答案 0 :(得分:1)
使用library(raster)
创建栅格时,栅格中包含的数据很可能会保存在临时文件夹中(如果足够小,则保存在RAM中)。但是数据不会保存在R会话中。保存在R会话中的唯一信息是元数据以及RAM或磁盘上的数据位置
因此,在保存和恢复会话时,获取栅格数据的唯一方法是确保栅格与关闭会话之前的位置相同。如果您没有将光栅及其数据保存在已知位置,则会在下一个会话中丢失它
这就是你第二次测试的原因:
因此,如果您希望能够重复使用以前的栅格对象,则需要使用writeRaster
并阅读它,就像使用reloadedraster
一样。保存栅格时尝试使用文件扩展名:.grd
是library(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会话中似乎需要特别注意以单独保存每个必需的光栅文件。