2017-08-31 469 views
0

我正在處理R中的Landsat 8場景以計算NDVI並運行土地覆蓋分類算法。 我遇到了柵格包中writeRaster函數的問題,特別是當它在磁盤上寫入光柵堆棧時。在R中使用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對象的特性,我可以看到,對於所有頻帶的值的範圍是0 - > 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上免費下載。 感謝

+0

是否要將多光譜GeoTiff保存到磁盤?如果是這樣,'writeRaster'中的選項參數應該是'options =「INTERLEAVE = BAND」'。 – www

+0

該選項似乎無法解決將文件寫入磁盤後,我的圖層的值範圍發生更改的問題。 –

回答

0

我會嘗試像

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

原來並重新加載堆棧上運行的東西。

這是因爲我懷疑你報告的差異不是「真實的」。特別是,在我看來,在原始光柵中,所有波段覆蓋全部0到65535範圍:這很難發生(這意味着在所有波段中可能的DN範圍完全「飽和」)。

我認爲在這裏發生的是你的「原始」堆棧的「範圍」只顯示給定數據類型的「可能的」最小 - 最大範圍。 writeRaster正在將計算的統計信息保存在與tiff關聯的XML文件中(請參閱R: how to write a raster to disk without auxiliary file?),以便在再次讀入時,「範圍」值爲「正確」。

HTH。

+0

你確實是對的。使用cellStats檢查原始柵格上的值會給我加載寫入磁盤上的柵格堆棧之後找到的相同範圍,這意味着原始柵格是數據類型的可能範圍。謝謝@LoBu。 –