Mengapa slot @ data @ values ​​untuk RasterLayer hanya berisi logis (0) dan bukan nilai sebenarnya?

12

Mencoba memahami alasannya, ketika saya membaca dalam raster NDVI, slot @ data @ values ​​tidak berisi nilai aktual hingga saya menyetelnya secara manual. Sebagai contoh:

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

Ini tidak terjadi dengan raster lain yang telah saya muat dengan metode yang sama, jadi saya bingung. Saya berharap saya bisa lebih spesifik tetapi saya tidak ingat melakukan sesuatu yang berbeda sebelumnya. Cukup mudah untuk mendapatkan nilai secara manual, menggunakan:

    NDVI1@data@values <- getValues(NDVI19east)

Tetapi masih sulit untuk melakukannya untuk setiap file. Jadi, pertanyaan dua bagian:

  1. Mengapa ini terjadi? Saya mengerti bahwa ini mungkin ada hubungannya dengan bagaimana file raster disimpan (yaitu apakah itu ada dalam memori atau tidak) tetapi saya tidak dapat benar-benar memahami bagaimana hal itu mengubah metode yang harus saya gunakan untuk mengakses data ...

  2. Apakah ada cara untuk mengotomatisasi proses ini (mungkin menggunakan metode yang mirip dengan lapply) untuk membaca file sebagai RasterLayers dan mengakses nilai untuk file-file itu? Proyek saya saat ini melibatkan membaca 6-10 file sekaligus untuk NDVI, Curah Hujan dan variabel lingkungan lainnya, untuk menggabungkan mereka dan melakukan beberapa overlay tertimbang. Akan sangat membantu untuk mengotomatiskan proses impor data.

Henry Hawkins Wells
sumber
6
Jangan gunakan @ kecuali Anda mengembangkan kode internal - gunakan readAll (NDVI). Ini terjadi sebagai teknik efisiensi memori, Anda dapat membuka kisi yang sangat besar sebagai semacam janji - raster menjanjikan untuk menarik data (melalui rgdal, melalui GDAL dalam kasus ini) ketika Anda benar-benar membutuhkan angka. Jika Anda perlu menyimpan objek sebagai objek R mandiri yang tidak terikat ke file readAll adalah cara untuk melakukannya. Lihat? Raster "Dalam banyak kasus ... apakah (awalnya) tidak mengandung nilai sel (piksel) dalam (RAM)"
mdsumner
2
yang logical(0)sebenarnya nilai untuk setiap Raster * objek diciptakan dari sebuah file. Apa pun caranya, seperti yang dikatakan @mdsumner, jangan langsung membaca nilai-nilai ini, dan tentu saja tidak mengaturnya! (meskipun Anda NDVI1@data@values <- getValues(NDVI19east)tidak akan memengaruhi apa pun , nilai-nilai ini diabaikan). Mungkin lebih jauh ke bawah skrip Anda di mana Anda tidak mengerti cara menggunakan objek-objek ini secara efektif. Anda dapat menggunakan getValues, tetapi bahkan itu jarang diperlukan. Berikan contoh sederhana dan mandiri tentang apa yang ingin Anda capai.
Robert Hijmans
2
Terima kasih banyak. Saya akhirnya menyelesaikan apa yang saya butuhkan dengan readAll () seperti kata mdsumner, jadi terima kasih untuk itu - itu saran yang bagus! Saya baru mengenal paket raster baru-baru ini, jadi saya jujur ​​belum mengetahui fungsi itu dan kebutuhan untuk menggunakannya untuk mengakses nilai aktual dari file besar.
Henry Hawkins Wells

Jawaban:

3

Pertanyaan ini telah dijawab dalam komentar (oleh mdsummer ). Ini hanya cara untuk menertibkan ide-ide itu dan mengeluarkan pertanyaan ini dari antrian yang tidak terjawab.

Di sini Anda dapat mengunduh NVDI jpg di seluruh dunia dari nasa .

Di sini Anda memiliki kode dan file raster untuk dicoba .

Seperti ditunjukkan dalam pertanyaan, memuat raster ke fungsi R dengan raster () tidak memuat nilai aktual ke dalam memori.

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, nilai NVDI @ data @ tidak memiliki nilai sementara plot dapat ditampilkan dengan menampilkan nilai "hiden" tersebut. Anda dapat melihat, bahwa, jika Anda memuat file ke QGIS, nilainya benar-benar dibaca.

masukkan deskripsi gambar di sini

Jadi, Anda harus menggunakan fungsi readAll () dari paket raster (seperti kata mdsummer di komentar). Ini kodenya:

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)

Dengan menggunakan fungsi ini, Anda sekarang dapat mengakses nilai raster di dalam file.

masukkan deskripsi gambar di sini

César Arquero
sumber