RasterLayerの@ data @ valuesスロットには、実際の値ではなくlogical(0)のみが含まれているのはなぜですか?


12

NDVIのラスターを読み取ると、手動で設定するまで@ data @ valuesスロットに実際の値が含まれないのは、理由の一番下に到達しようとしています。例えば:

    NDVI <- raster("./filename.tif", crs="+proj=longlat +datum=WGS84")
    NDVI@data@values
            ## returns: logical(0)

これは、同じ方法で読み込んだ他のラスターでは発生しなかったため、混乱しています。もっと具体的になりたいのですが、以前と違うことをしたことは覚えていません。以下を使用して、値を手動で取得するのは簡単です。

    NDVI1@data@values <- getValues(NDVI19east)

しかし、すべてのファイルに対してこれを行う必要があるのは、まだ苦痛です。したがって、2つの部分から成る質問:

  1. そもそもなぜこれが起こったのですか?ラスターファイルの格納方法(つまり、メモリにあるかどうか)に関係があることは理解していますが、データにアクセスするために使用するメソッドがどのように変更されるかを本当に理解することはできません...

  2. ファイルをRasterLayersとして読み取り、それらのファイルの値にアクセスするために、このプロセスを自動化する方法はありますか(おそらくlapplyに似た方法を使用して)?私の現在のプロジェクトでは、NDVI、Rainfall、およびその他の環境変数の6〜10個のファイルを一度に読み取り、それらを組み合わせていくつかの加重オーバーレイを実行します。データをインポートするプロセスを自動化すると役立ちます。


6
内部コードを開発している場合を除き、@は使用しないでください。readAll(NDVI)を使用してください。これはメモリ効率の高い手法として行われ、非常に大きなグリッドを一種のプロミスとして開くことができます-ラスタープロミスは、実際に数字が必要なときに(rgdal、GDALを介して)データを取り込むことを約束します。オブジェクトをファイルに関連付けられていないスタンドアロンのRオブジェクトとして保存する必要がある場合は、readAllがその方法です。ラスターを参照してください。「多くの場合、(最初)(RAM)にセル(ピクセル)値が含まれていません」
-mdsumner

2
logical(0)実際にするための値である任意のファイルから作成されたラスタ*オブジェクト。いずれにせよ、@ mdsumnerが言うように、これらの値を直接読み取らないでください。(あなたNDVI1@data@values <- getValues(NDVI19east)何にも影響しませんが、これらの値は無視されます)。これらのオブジェクトを効果的に使用する方法を理解していないのは、おそらくスクリプトのさらに下です。getValuesを使用できますが、それでもほとんど必要ありません。あなたが達成しようとしていることの簡単な自己完結型の例を提供します。
ロバートハイマンズ

2
どうもありがとう。mdsumnerが言ったように、私はreadAll()で必要なことを成し遂げたので、そのことに感謝します-それは良いアドバイスでした!私は最近、ラスターパッケージを初めて使用したので、正直なところ、その機能と、大きなファイルの実際の値にアクセスするためにそれを使用する必要があることを正直に知りませんでした。
ヘンリーホーキンスウェルズ

回答:


3

この質問は(mdsummerによる)コメントで回答されています。これは、それらのアイデアを整理し、この質問を未回答のキューから取り出すための単なる方法です。

ここでは、nasからワールドワイドjpgのNVDIをダウンロードできます

ここには、試してみるコードとラスターファイルがあります

質問に示すように、raster()関数を使用してRにラスタをロードしても、実際の値はメモリにロードされません。

ここに画像の説明を入力してください

ご覧のとおり、NVDI @ data @ valuesには値がありませんが、プロットはこれらの「隠された」値を表示してレンダリングできます。ファイルをQGISにロードすると、値が実際に読み取られることがわかります。

ここに画像の説明を入力してください

そのため、ラスターパッケージのreadAll()関数を使用する必要があります(mdsummerがコメントで述べたように)。コードは次のとおりです。

library(raster)

NDVI <- raster("./RenderData.tif", crs="+proj=longlat +datum=WGS84")
NDVI@data@values
str(NDVI)
plot(NDVI)

NDVI.all <- readAll(NDVI)
head(NDVI.all@data@values)

この関数を使用すると、ファイル内のラスター値にアクセスできます。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.