RasterLayer için @ data @ değerleri yuvası neden gerçek değerleri değil mantıksal (0) içeriyor?


12

NDVI taramasında okuduğumda, @ data @ değerleri yuvasında neden manuel olarak ayarlayana kadar gerçek değerler bulunmuyor. Örneğin:

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

Bu, aynı yöntemle yüklediğim diğer rasterlerle olmadı, bu yüzden kafam karıştı. Keşke daha spesifik olabilseydim ama daha önce farklı bir şey yaptığımı hatırlamıyorum. Aşağıdakileri kullanarak değerleri manuel olarak almak yeterince kolaydır:

    NDVI1@data@values <- getValues(NDVI19east)

Ama yine de her dosya için bunu yapmak bir acı. Yani, iki bölümlü soru:

  1. Bu neden ilk etapta oldu? Raster dosyasının nasıl saklandığı ile ilgili bir şey olabileceğini anlıyorum (yani bellekte olsun ya da olmasın) ama gerçekten veriye erişmek için kullanmam gereken yöntemleri nasıl değiştirdiğini anlayamıyorum ...

  2. RasterLayers olarak dosyaları okumak ve bu dosyalar için değerlere erişmek için bu işlemi otomatikleştirmenin (belki de lapply'ye benzer bir yöntem kullanarak) bir yolu var mı? Şu anki projem NDVI, Yağış ve diğer çevresel değişkenler için bir seferde 6-10 dosya okumayı ve bunları birleştirerek bazı ağırlıklı bindirmeler yapmayı içeriyor. Verileri içe aktarma işlemini otomatikleştirmek yararlı olacaktır.


6
Dahili kod geliştirmediyseniz @ kullanmayın - readAll (NDVI) kullanın. Bir bellek verimliliği tekniği olarak gerçekleşir, çok büyük ızgaraları bir tür söz olarak açabilirsiniz - raster, sayılara gerçekten ihtiyacınız olduğunda verileri (rgdal aracılığıyla, GDAL aracılığıyla) çekmeyi vaat eder. Nesneyi, bir okuma dosyasına bağlı olmayan bağımsız bir R nesnesi olarak kaydetmeniz gerekiyorsa bunu yapmanın yolu budur. Bkz. "Raster" Birçok durumda. (Başlangıçta) (RAM) içinde herhangi bir hücre (piksel) değeri içermiyor "
mdsumner

2
logical(0)aslında karşılığını herhangi bir dosyadan oluşturulan Raster * nesne. Her iki durumda da, mdsumner'ın dediği gibi, bu değerleri doğrudan okumayın ve kesinlikle ayarlamayın! ( hiçbir şeyNDVI1@data@values <- getValues(NDVI19east) etkilemez , ancak bu değerler yok sayılır). Muhtemelen bu nesneleri etkili bir şekilde nasıl kullanacağınızı bilmediğiniz komut dosyasında daha aşağı. GetValues ​​kullanabilirsiniz, ancak bu nadiren gereklidir. Neyi başarmaya çalıştığınıza dair basit ve bağımsız bir örnek verin.
Robert Hijmans

2
Çok teşekkürler. Ben mdsumner dediği gibi readAll () ile ne gerek başarılması sona erdi, bu yüzden bunun için teşekkürler - iyi bir tavsiye oldu! Son zamanlarda raster paketinde yeni olmuştum, bu yüzden dürüstçe bu işlevin ve büyük dosyaların gerçek değerlerine erişmek için kullanma gereğinin farkında değildim.
Henry Hawkins Wells

Yanıtlar:


3

Bu soru yorumlarda cevaplanmıştır ( mdsummer tarafından ). Bu sadece bu fikirleri sıraya koymanın ve bu soruyu cevapsız kuyruktan çıkarmanın bir yoludur.

Burada nasa'dan dünya çapında jpg'nin NVDI'sını indirebilirsiniz .

Burada kodu ve denemek için bir raster dosyası var .

Söz konusu şekilde, raster (raster) fonksiyonuyla raster'e yüklendiğinde, gerçek değerler belleğe yüklenmez.

resim açıklamasını buraya girin

Gördüğünüz gibi, NVDI @ data @ değerlerinde değer yokken, grafik "gizlenmiş" değerleri gösteren grafik oluşturulabilir. Dosyayı QGIS'e yüklerseniz, değerlerin gerçekten okunduğunu görebilirsiniz.

resim açıklamasını buraya girin

Bu nedenle, raster paketinden readAll () işlevini kullanmalısınız ( mdsummer'ın yorumlarda söylediği gibi ). İşte kod:

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)

Bu işlevi kullanarak, artık dosyadaki tarama değerlerine erişebilirsiniz.

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.