写入栅格输出文件的大小

7
我有一个函数,它将多波段图像作为raster brick对象读入,遍历各个波段进行各种计算,然后将raster写出为新的.tif文件。所有这些都很好,但新图像文件的文件大小大约是原始图像的四倍(我认为是因为原始图像有4个波段)。我想知道writeRaster()函数中是否有我不知道的参数,或者是否有其他方法可以确保输出图像基本上与输入相同的文件大小。
原始文件大小为134 MB;输出范围从471到530 MB左右,具体取决于格式。
简化代码:
library(rgdal)
library(raster)

path = "/Volumes/ENVI Standard Files/"
img = "qb_tile.img"

imageCorrection = function(path, img){
  raster = brick(paste0(path, img))   
  raster = reclassify(raster, cbind(0, NA))  

  for(i in 1:nlayers(raster)){   
    raster[[i]] = raster[[i]] - minValue(raster[[i]]) 
  }
  writeRaster(raster, paste0(path,img,"_process.tif"), format = "GTiff", overwrite=TRUE)
}

输入和输出的像素和波段数量完全相同?这意味着您的“.img”文件使用的压缩可能比您的“.tiff”文件更好,或者“.img”文件以较低的精度存储(如8位整数),而“.tiff”则存储为4字节浮点数……或两者都有可能。sp :: GDALinfo对您的文件有何说明? - Spacedman
是的,这似乎是问题所在。GDALinfo指示输出被写为FLT4S,而输入以INT2U形式输入。我尝试更改输出的数据类型,但除了FLT4S之外的任何内容都会创建一个空白图像(数据= 0-1)。 - Danple
https://stat.ethz.ch/pipermail/r-sig-geo/2015-January/022246.html - Danple
1个回答

11

您可以使用rasterOptions()设置写入栅格的默认数据类型,如下所示:

rasterOptions(datatype="INT2U")

或者直接在writeRaster调用中:

writeRaster(yourRas, "path/to/raster/", dataType="INT2U", options="COMPRESS=LZW")

同时注意选项参数,您可以在其中指定压缩。

通常我从R中导出整数栅格时,会确保我确实有整数而不是浮点数,因为这可能会导致空栅格。在导出之前,请尝试执行以下操作:

ras <- as.integer(ras)

请注意: 在你的栅格数据中也要检查负值。如果有小于零的数值,请尝试使用INT2S


4
我想补充说明的是,输出栅格格式的所有选项和属性都可以在这里找到。 - loki
https://search.r-project.org/CRAN/refmans/raster/html/writeRaster.html这里有更多rasterOptions()可以添加到选项参数中。我发现将其默认设置为无压缩非常实用,像这样:options="COMPRESS=NONE"。 - Santiago Sotelo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接