R栅格乘法 - 为什么栅格大小会大幅增加

时间:2018-06-15 19:59:15

标签: r raster

我正在使用R(光栅包)中的MODIS光栅数据,我想知道为什么在将两个光栅文件相乘时光栅的大小会变大7000倍。在我的例子中,一个栅格是一个简单的MODIS栅格(0到255之间的值(整数)),另一个是模板(0和1(整数))。所以我不明白为什么光栅应该这么大?当尝试使用writeRaster保存栅格时,这是一个很大的问题,因为我的R会话一直在崩溃。

我的代码如下所示:

a <- list.files('All_MODIS_files_of_one_year.tif')
for (day in 1:length(a)){
ra <- raster(a[day])
ra_reduce <- ra * s

ra的对象大小为12064字节,对象大小为s为11984字节。对象大小ra_reduce为93777512字节。当我最终堆叠整整一年时,文件变得差不多40 GB。 :(

我尝试了round函数,尝试将@file@datanotation设置为整数,但没有任何帮助。 有谁知道如何解决这个问题?!

2 个答案:

答案 0 :(得分:1)

ra(也可能是s)的对象大小非常小,因为它在内存中没有单元格值。如果您show(ra),您将看到数据在磁盘上(在文件中)。乘法后,值将在内存中。您可以使用calcoverlay等方法将结果写入文件,或使用writeRaster来避免这种情况。那就是:

x <- overlay(ra, s, fun=function(x,y){x*y}, filename='file.tif')

ra_reduce <- ra * s
ra_reduce <- writeRaster(ra_reduce, filename='ra_reduce.tif')

要减小文件大小,您可以(可能)使用datatype参数。

答案 1 :(得分:0)

栅格的大小取决于您保存它们的格式。使用写栅格功能时,必须指定输出的数据类型。如果我没记错的话,默认情况下会将其保存为浮点数,这意味着巨大的栅格大小。例如,如果数字显示为“ 0.000000”,则可以检查栅格是否为浮点型。

因此,要纠正此问题,您应该执行以下操作:

 a <- list.files('All_MODIS_files_of_one_year.tif')
 for (day in a){           #some optimization here, hope you don't mind
   ra <- raster(day)       #if you don't use length, the position of 'day' will be the name of the raster.
   ra_reduce <- ra * s
   writeRaster(ra_reduce, paste0("prefix_", day,".tif"), format = "GTiff", datatype = "INT1U", overwrite = TRUE)  
{

基本上,要纠正此问题,您只需指定要将栅格保存到的数据类型即可。这是writeRaster函数的参数之一。我指定的是该功能已知的最小数据类型。值将是整数,范围从0到256。您可以查看其他数据类型的文档。