2017-08-31 9 views
0

Rのランドサット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) 

Iは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日に記録された037行のパス201のシーンを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。 –

関連する問題