使用 s3read_using 函数获取的 s3 存储桶中的临时栅格

Working with Temp raster from s3 bucket acquired using s3read_using function

我正在使用 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 是必须的,因为它最终会被整合到一个闪亮的应用程序中。

谢谢。

看到的是 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"。您应该只能限制对您的域的访问。此外,terra 包可能会比 raster.

提供更好的性能