Nodata pikselleri nedeniyle rasterleri toplamak imkansız


12

Günlük toprak nem verileri ile bir dizi raster (.vrt) var. Aylara göre bir ölçüm yapmak için tüm rasterlerin piksellerini toplamak istiyorum. Bununla birlikte, tüm dünya her gün kapsanmamaktadır, bu da diğer günler için önlemlerin bulunduğu yerlerde nodata değerleriyle sonuçlanmaktadır.

Yapmak istediğim, her bir rasterin değerlerini toplamak. Bununla birlikte, bir nodata pikseli her özetlendiğinde, ortaya çıkan piksel doğrudan nodata olarak kategorize edilir. Tam tersi olmak istiyorum: tüm nodata değerlerini göz ardı etmek ve geri kalanını toplamak.

Sorunu çözmenin 2 yolunu düşündüm:

  1. düğüm değerlerini yok sayarak raster toplamak
  2. nodata piksellerini 0 değerine dönüştürdükten sonra tüm rasterleri toplayın

resim açıklamasını buraya girin

Ne yazık ki, bunu yapmak için herhangi bir araç bulamıyorum.

Biri bana yardım edebilir mi?


Sonucun ne kadar yorumlanabilir olacağını merak ediyorum: sonuçta, toplamlar eksik günlerin değerlerini içermeyecek, eksik verilerin miktarına bağlı olarak çeşitli miktarlarda düşük önyargılı olacağını gösterecektir. Kayda değer miktarda eksik veri varsa, bunun yerine eksik hücrelerdeki değerleri etkilemeyi veya tahmin etmeyi ve ardından toplamı gerçekleştirmeyi düşünmelisiniz .
whuber

1
Bu yorum için teşekkürler. Veri yöneticilerine sordum ve mevcut tüm verileri toplayarak ortalama değeri hesapladıklarını, daha sonra bu pikselde gözlemlerin mevcut olduğu ay içindeki gün sayısına bölündüklerini söylediler.
Damien

2
Bu, CBS'ye sadece tüm NoData hücrelerini yoksayması talimatının verildiği bir raster yığınının yerel ortalamasıyla aynıdır, bu da gitmeniz için başka bir yol önerir. Bu arada, eksik gözlemler değerlerle ilişkili olduğunda bu prosedür hala potansiyel olarak önyargılıdır. Örneğin, bulut örtüsü nedeniyle veri eksik olduğunuzda, o günlerde toprak neminin normalden daha yüksek (ortalama) olması mantıklıdır.
whuber

1
Tamam, sadece 'istatistik yoksay' işaretli hücre istatistik aracı test ve tam olarak ne istediğimi yapar. Bu yöntemin eksikliklerinin farkındayım. Ancak, çalışmam hem uzay hem de zaman açısından oldukça büyük bir ölçekte, bu yüzden bu tür önyargıların daha az önemli olacağını varsayıyorum. Her neyse, çok fazla veri seçeneğim yok.
Damien

Ölçek, yanlılık miktarıyla ilgili olmayacaktır. Yanlılığın önemi, büyüklüğüne ve uygulamanızın hassasiyetine bağlıdır. Veriler hakkında hiçbir şey yapamayabilirsiniz , ancak bunları analiz etme prosedürleri üzerinde kontrolünüz vardır. Bu konuda iyileştirmenin birçok yolu vardır. Seçenekleriniz arasında zaman içinde enterpolasyon ve toprak nemi ile ilişkili olabilecek ve eksik tarihlerde bile mevcut olan değişkenlere karşı gerileme bulunmaktadır. (Eksik değerleri "
tanımlamak

Yanıtlar:


1

ArcGIS'e erişiminiz varsa Hücre İstatistikleri aracının \ mean \ min \ max toplayıcılarınızı topladığınız nodata yoksayma seçeneği vardır.


"Toplamı", "ortalama" ile değiştirmek için bu yanıtı değiştirirseniz, doğru olacaktır: bu nedenle sorunun sorgusuna bakın.
whuber

Ortalama değeri elde etmek istediğim için, toplama problemimin sadece bir parçasıydı. Az önce kontrol ettim ve Hücre istatistik aracı, nodata piksellerini göz ardı ederek rasterleri toplamanın en kolay yoludur.
Damien

11

Öncelikle, kullanabilirsiniz gdal_calc.py 0'a tüm -9999 değiştirip 0 nodata değerini ayarlamak için.

Örneğin:

gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --calc="A+9999*(A==-9999)" --NoDataValue=0

Ardından, gda_translate öğesini -a_nodata seçeneği ve ardından hiçbiri ile kullanarak NoData değerini yok sayabilirsiniz .

-a_nodata değeri :

Çıkış bantlarına belirtilen bir nodata değeri atayın. GDAL 1.8.0'dan başlayarak, kaynak dosya için bir tane varsa çıktı dosyasına bir nodata değeri ayarlanmasını önlemek için none olarak ayarlanabilir.

Misal:

gdal_translate -a_nodata none input_with_NoData.tif output_without_NoData.tif

Bahşiş için teşekkürler. -A_nodata parametresiyle biraz oynadım ve NULL yerine -9999 değerine sahip olmayı başardım. Ancak, yine de tüm -9999 pikselleri 0 olarak değiştirmem gerekiyor
Damien

1
Uygulamadan önce tüm -9999 değerini 0 olarak değiştirmek için gdal_calc.py komutunu kullanabilirsiniz gdal_translate -a_nodata none .... Örneğin: gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --type=Int16 --calc="A+9999*(A==-9999)" --NoDataValue=0
Antonio Falciano

Birkaç komut denedim, ama gerçekten gdal_calc.py ile ilgili bir sorunum olduğunu düşünüyorum. Örneğin, tüm rasterlere 1 eklemeyi denedim ( i.imgur.com/WiZG7MC.png ) ve bu Maxrepeat hatasını aldım. Anlamadım, komutu doğrudan OSGeo kabuğundan çalıştırdım ve kabuğu açtığımda listede göründüğü için bu modül doğru bir şekilde kurulmuş gibi görünüyor ( i.imgur.com/fgtMZQZ.png ). Yüklemem bozuk mu?
Damien

Normal ifade sorunu gibi görünüyor ... cdKomutunu kullanarak çalışma dizininizi değiştirmeyi deneyin ve yalnızca sahip olmak için yeniden deneyin -A test.tif.
Antonio Falciano

1
Benim için çalışıyor, ancak tüm bu şeyleri OSGeo4W yükleyici aracılığıyla yükledim . Bunun yerine, QGIS'i bağımsız yükleyici aracılığıyla kurduğunuzu görüyorum. Bu yüzden kurulumunuzu yenilemeyi / güncellemeyi deneyin.
Antonio Falciano

5

R cinsinden:

library(raster)
s <- stack('file1', 'file2', ...)
ss <- sum(s, na.rm=TRUE)

Bu koda bir açıklama (yazdıysanız) veya siteden kısa bir özetle bulduğunuz yere bir bağlantı ekleyebilir misiniz?
Paul

1
Yukarıda ilk olarak tarama paketi yüklenir, daha sonra virgülle ayrılmış dosya adlarıyla belirtilen dosyaları içeren bir "yığın" (aynı boyut ve çözünürlükte 3 boyutlu bir tarama dosyası dizisi oluşturulur, burada her dosya bu yığının bir dilimi haline gelir) . Son satır istifin tüm dilimleri boyunca hücre-bazlı miktarda gerçekleştiren sdeğişken ile na.rm=TRUEsonuçlanan NAdeğerleri göz ardı. Çıktı nesnesi ss, rasterdışa aktarılabilen bir nesnedir writeRaster(bkz. ?writeRaster). (@RobertH, R rasterpaketinin yaratıcısıdır .)
jbaums

1

Uzamsal Analistte Koşullu Araç, boş değerleri sıfırlara dönüştürmenin kolay bir yoludur. Sonra toplamları almak bir çırpıda olmalıdır.


Cevabın için teşekkürler. Bu gönderiyi takip ettim: support.esri.com/fr/knowledgebase/techarticles/detail/34932 ve tüm null pikselleri 0'a çevirmeyi başardım. Ancak, bu işlemi bir içindeki tüm rasterler için yapabilmek isterdim dizin. QGIS'deki 'Izgara değerlerini yeniden sınıflandır' bunu yapabiliyor gibi görünüyor, ancak tüm bunların nasıl çalıştığını bilmiyorum. "Basit tablo" yöntemini seçiyorum ve null değerini 0 olarak ayarlamasını ve diğer değerleri değiştirmemesini istiyorum, ancak sonuçta bulunan raster -0.99 ila 0.08 arasında değişirken, başlangıçta 428'den 3491'e kadar
Damien

Bir yerde orijinal rasterinizin bir alıntısını gönderebilir misiniz, böylece bir göz atabilir miyiz?
til_b

2
Araca sağ tıklarsanız, istediğiniz kadar dosyada, yani bir dizinin tamamında bir toplu işlem çalıştırabilirsiniz.
brock

Cevabınız için teşekkürler. Ancak, 'uzamsal analist / Harita cebiri / Raster hesaplayıcısı'nı kullanarak tek bir dosya için tüm NULL'ları 0'a dönüştürebilirim. Bu araçta sağ tıklıyorsam, bir dizini toplu yapabilirim, ancak her dosyayı otomatik olarak dikkate almak için sözdizimi ne olacak? ( i.imgur.com/aYaUCzz.png )
Damien

'Mekansal analist / Yeniden Sınıflama / Yeniden Sınıflandırma' aracına bir göz attım ve tam olarak istediğimi yapıyor. Bir kerede birden fazla dosyayı işlemek için toplu pencereyi kullanmayı başardım. Son bir sorunum var: 'çıkış rasterini' sağ tıklarsam / doldurursam, tüm giriş rasterleri için aynı çıktı dosyalarını kopyalar. Her bir giriş için farklı bir çıktı oluşturmasını nasıl sağlayabilirim? ( i.imgur.com/jzTI2x9.png )
Damien

1

Aynı problemi bir süre önce de yaşadım ve çözmeyi başardım.

QGIS'de nodata değerlerinin görüntülenmesi hakkında bir not gibi: nodata değerleri her zaman harita penceresinde nodata değerleri olarak ve "nesne bilgisi" aracını kullanırken, aslında -9999, 0, NULL vb. Bu nedenle, nodata değerlerinin 0'a yeniden sınıflandırılmasından sonra, katman ayarlarına giderseniz, meta verilerde nodata'nın 0 değerine sahip olduğunu görürsünüz.

Sonunda görev için mükemmel bir araç buldum, GRASS r.series. "Toplam işlem" ayarı "maksimum" ve "NULL'ları yay" seçeneği işaretlenmediğinde, araç gereksiniminize uygun bir Katman oluşturur.


0

Bu sorunu bir süre önce hatırlıyorum. Bir çözüm olarak, rasterdeki tüm hücrelere +1 yaptım, rasterleri birlikte ekledim, sonra son bir çıkarma yaptım (ancak eklediğiniz birçok + 1'den). Oldukça kaba ama işi yaparsa ...!

Alternatif olarak, boş değerlerinizi sıfıra dönüştürmek için QGIS'deki İşleme araç kutusundaki 'Izgara değerlerini yeniden sınıflandır' seçeneğini kullanın.


Merhaba, 'ızgara değerlerini yeniden sınıflandır' aracını başarı ile kullanmanın birçok yolunu denedim. Tüm NULL pikselleri -9999'a dönüştürdüğüm bir rasterde başladım. [0] single yöntemini kullanarak yeniden sınıflandırmaya çalıştım ve 'old value = -9999', 'new value = 0.0', 'operator: [0] =' ayarladım, ancak tüm elde ettiğim 'nan' ile dolu bir tarama piksel. Neyi yanlış yapıyorum?
Damien
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.