我正在使用aws.s3 R包从s3存储桶中提取一个.tif
test_tif <- s3read_using(FUN = raster, object = "test_tif.tif", bucket = "bucketname")这是将栅格放置在我的全局环境中: test_tif
当我执行任何类型的基于栅格的操作时,我得到一个重复的错误
Error in .local(.Object, ...) : 没有更多错误代码或警告
查看栅格的结构,与从本地目录读取的相同.tif相比,没有什么不同。
唯一的区别是其中一个是另存为临时文件。
任何关于如何解决这个问题的想法。
使用s3read_using是必须的,因为这最终将被整合到一个闪亮的应用程序中。
谢谢。
发布于 2020-12-10 08:55:41
可以看到的是,s3read_using下载该文件(使用save_object,以该文件为参数应用函数,然后删除该文件。如果该函数将数据读取到内存中,则可以执行此操作。但是raster方法只从文件中读取元数据;稍后根据需要读取实际值。
所以如果我这么做了
r <- s3read_using(FUN = raster, object = "test.tif", bucket = "bucketname")
f <- filename(r)
#"C:\\temp\\RtmpcbsI2z\\file9b846977650.tif"
file.exists(f)
#[1] FALSE文件已丢失,您无法使用RasterLayer r执行任何操作。
一种变通办法是立即读取所有值。如果这是不可能的,你也可以将这些值乘以1。这将具有类似的效果,除非文件非常大,在这种情况下,它将创建一个(更)永久的临时文件。
rr <- s3read_using(FUN = function(f) readAll(raster(f)), object = "test.tif", bucket = "bucketname")
# or
rr <- s3read_using(FUN = function(f) raster(f) * 1, object = "test.tif", bucket = "bucketname")但在这种情况下,您也可以使用save_object函数-这是您想要避免的。
也许您可以改为使用Cloud Optimized GeoTiff,并像这样的"vsicurl/https://mybucket/test.tif"访问它们。您应该能够限制对您的域的访问。而且,与raster相比,terra包可能提供更好的性能。
https://stackoverflow.com/questions/65202064
复制相似问题