使用R中的writeRaster在磁盘上写入光栅堆栈会更改每个图层的值范围

时间:2017-08-31 17:13:22

标签: r gis r-raster

我正在处理R中的Landsat 8场景以计算NDVI并运行土地覆盖分类算法。 我在光栅包中遇到了writeRaster函数的问题,特别是在磁盘上写一个光栅堆时。

我开始加载landsat 8场景的12个波段,然后将它们叠加在光栅堆栈中。由于它们是作为16位图像传送的,因此所有图层的值范围从0到65535不等。在光盘上写入光栅堆栈后,当我从R环境中的磁盘重新加载新创建的文件时,值范围对于所有图层都不同于原始值。我无法弄清楚为什么,我在互联网上找不到任何解决方案。

这是代码:

library(raster)
#  Load the individual bands of the Landsat scene.
b01 <- raster(list.files(dirname, pattern = "B1.TIF", full.names = TRUE))
b02 <- raster(list.files(dirname, pattern = "B2.TIF", full.names = TRUE))
b03 <- raster(list.files(dirname, pattern = "B3.TIF", full.names = TRUE))
b04 <- raster(list.files(dirname, pattern = "B4.TIF", full.names = TRUE))
b05 <- raster(list.files(dirname, pattern = "B5.TIF", full.names = TRUE))
b06 <- raster(list.files(dirname, pattern = "B6.TIF", full.names = TRUE))
b07 <- raster(list.files(dirname, pattern = "B7.TIF", full.names = TRUE))
b08 <- raster(list.files(dirname, pattern = "B8.TIF", full.names = TRUE))
b09 <- raster(list.files(dirname, pattern = "B9.TIF", full.names = TRUE))
b10 <- raster(list.files(dirname, pattern = "B10.TIF", full.names = TRUE))
b11 <- raster(list.files(dirname, pattern = "B11.TIF", full.names = TRUE))
b12 <- raster(list.files(dirname, pattern = "BQA.TIF", full.names = TRUE))

#  Since the band 8 has a 15m resolution, compared to 30m of all other bands, I 
#  need to resample it to match the other bands.
b08 <- resample(b08, b01) 

allbands <- c(b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12)
rast.stack <- stack(allbands)

当我检查rast.stack对象的特征时,我可以看到所有band的值的范围是0 - &gt; 65535 接下来,我在磁盘上写下光栅堆栈:

writeRaster(rast.stack, filename = "LT820103720161114.tif", overwrite = TRUE)

当我在R环境中加载这个新文件时,

rast.stack <- stack("LT820103720161114.tif")

波段的值范围低于原始光栅堆栈中的值范围。 我尝试将文件保存为.tif和原始栅格.grd格式,但这没有任何区别。我还尝试指定数据类型 使用datatype参数如下:

writeRaster(rast.stack, filename = "LT820103720161114.tif", datatype = "INT2U",  overwrite = TRUE)

我还尝试使用writeValues函数以块的形式在磁盘上写入栅格。这些都没有解决问题。有谁知道什么是错的,以及如何解决这个问题?如果您想运行此代码,我将使用2016年11月14日记录的路径201,第037行的场景,可在EarthExplorer上免费下载。 感谢

1 个答案:

答案 0 :(得分:0)

我尝试运行类似

的内容

cellStats(rast.stack, mean)    cellStats(rast.stack, min)    cellStats(rast.stack, max)

在原始和重新加载的堆栈上。

这是因为我怀疑你报告的差异不是真实的&#34;。特别值得一提的是,在原始光栅中,所有波段都覆盖了整个0到65535范围:这很难发生(这意味着所有波段的完整&#34;饱和度&#34;带)。

我认为这里发生的是&#34;范围&#34;你的原作&#34;堆栈只显示&#34;可能&#34;给定数据类型的最小 - 最大范围。 writeRaster将计算出的统计信息保存在与tiff关联的XML文件中(请参阅R: how to write a raster to disk without auxiliary file?),这样当您再次读取它时,&#34;范围&#34;值是&#34;正确&#34;。

HTH。