Nie można zsumować rastrów z powodu pikseli nodata


12

Mam zestaw rastrów (.vrt) z codziennymi danymi wilgotności gleby. Chcę zsumować piksele wszystkich rastrów, aby uzyskać miarę według miesiąca. Jednak cały świat nie jest objęty każdego dnia, co powoduje wartości nodata w miejscach, w których istnieją pomiary dla innych dni.

To, co chcę zrobić, to zsumować wartości każdego rastra. Wydaje się jednak, że za każdym razem, gdy piksel nodata jest sumą, piksel wynikowy jest bezpośrednio klasyfikowany jako nodata. Chciałbym mieć coś przeciwnego: ignorowanie wszystkich wartości nodata i sumowanie pozostałych.

Pomyślałem o 2 sposobach rozwiązania problemu:

  1. sumowanie rastrów ignorujących wartości nodata
  2. konwertuj piksele nodata na wartość 0, a następnie zsumuj wszystkie rastry

wprowadź opis zdjęcia tutaj

Niestety nie mogę znaleźć żadnego narzędzia do tego.

Czy ktoś może mi pomóc?


Zastanawiam się, jak interpretacyjny będzie wynik: w końcu sumy nie będą zawierać wartości dla brakujących dni, co wskazuje, że będą one tendencyjnie niskie o różne kwoty w zależności od ilości brakujących danych. Jeśli brakuje znaczących ilości danych, zamiast tego należy rozważyć przypisanie lub prognozowanie wartości w brakujących komórkach, a następnie wykonanie sumy.
whuber

1
Dziękuję za ten komentarz. Zapytałem menedżerów danych, którzy powiedzieli, że obliczyli średnią wartość, sumując wszystkie dostępne dane, a następnie podzielili przez liczbę dni w ciągu miesiąca, w których obserwacje są dostępne na tym pikselu.
Damien

2
Jest to identyczne z lokalnym środkiem stosu rastrów, w którym GIS jest po prostu ignorowany dla wszystkich komórek NoData, co sugeruje inną drogę. Nawiasem mówiąc, procedura ta wciąż potencjalnie jest stronnicza, gdy brakujące obserwacje są skorelowane z wartościami. Na przykład, gdy brakuje danych z powodu zachmurzenia, prawdopodobne jest, że w tych dniach wilgotność gleby może być (średnio) wyższa niż zwykle.
whuber

1
W porządku, właśnie przetestowałem narzędzie do statystyki komórek z zaznaczoną opcją „Ignoruj ​​nodata” i robi dokładnie to, co chciałem. Zdaję sobie sprawę z wad takiej metody. Jednak moje prace są na dość dużą skalę, zarówno w przestrzeni, jak i czasie, więc zakładam, że takie uprzedzenia będą mniej ważne. W każdym razie tak naprawdę nie mam tak dużego wyboru danych.
Damien

Skala nie będzie związana z wielkością błędu. Znaczenie błędu zależy od jego wielkości i wrażliwości aplikacji na to. Chociaż może nie być w stanie zrobić nic na temat danych, to nie mają kontroli nad procedurami ich analizy. Istnieje wiele sposobów na ulepszenie tego. Wśród twoich opcji jest interpolacja w czasie i regresja względem zmiennych towarzyszących, które mogą być skorelowane z wilgotnością gleby i są dostępne nawet w przypadku brakujących dat. (Istnieje cała gałąź statystyki poświęconej „przypisywaniu” brakujących wartości.)
whuber

Odpowiedzi:


1

Jeśli masz dostęp do ArcGIS, to narzędzie Statystyka statystyk ma opcję ignorowania nodanych, które sumujesz \ znaczy \ min \ max swoje rastry.


Jeśli zmienisz tę odpowiedź, aby zastąpić „suma” przez „średnią”, będzie ona poprawna: zobacz przyczynę komentarza w pytaniu.
whuber

Podsumowanie było tylko jedną z części mojego problemu, ponieważ chcę uzyskać średnią wartość. Właśnie sprawdziłem, a narzędzie Statystyka komórki jest również najprostszym sposobem na zsumowanie rastrów z pominięciem pikseli nodata.
Damien

11

Po pierwsze, możesz użyć gdal_calc.py, aby zmienić wszystkie -9999 na 0 i ustawić wartość NoData na 0.

Na przykład:

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

Następnie możesz zignorować wartość NoData, używając gdal_translate z opcją -a_nodata , po której następuje none .

-a_nodata wartość :

Przypisz określoną wartość nodata do pasm wyjściowych. Począwszy od GDAL 1.8.0, można ustawić na none, aby uniknąć ustawienia wartości nodata dla pliku wyjściowego, jeśli taka istnieje dla pliku źródłowego

Przykład:

gdal_translate -a_nodata none input_with_NoData.tif output_without_NoData.tif

Dzięki za wskazówkę. Grałem trochę z parametrem -a_nodata i udało mi się uzyskać wartość -9999 zamiast NULL. Jednak nadal muszę zmienić wszystkie -9999 pikseli na 0
Damien

1
Możesz użyć gdal_calc.py, aby zmienić wszystkie -9999 na 0 przed zastosowaniem gdal_translate -a_nodata none .... Na przykład: gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --type=Int16 --calc="A+9999*(A==-9999)" --NoDataValue=0
Antonio Falciano

Próbowałem kilku poleceń, ale naprawdę myślę, że mam problem z gdal_calc.py. Na przykład właśnie próbowałem dodać 1 do całego rastra ( i.imgur.com/WiZG7MC.png ) i otrzymałem ten błąd Maxrepeat. Nie rozumiem, uruchomiłem polecenie bezpośrednio z powłoki OSGeo, i ten moduł wydaje się być poprawnie zainstalowany, ponieważ pojawia się na liście po otwarciu powłoki ( i.imgur.com/fgtMZQZ.png ). Czy moja instalacja jest zepsuta?
Damien

Wygląda na problem z wyrażeniem regularnym ... Spróbuj zmienić katalog roboczy za pomocą cdpolecenia i spróbuj ponownie, aby mieć tylko -A test.tif.
Antonio Falciano

1
Działa to dla mnie, ale wszystkie te rzeczy zainstalowałem za pomocą instalatora OSGeo4W . Zamiast tego widzę, że zainstalowałeś QGIS poprzez samodzielny instalator. Spróbuj więc odświeżyć / zaktualizować ustawienia.
Antonio Falciano

5

W R:

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

Czy możesz dodać wyjaśnienie do tego kodu (jeśli go napisałeś) lub link do miejsca, w którym go znalazłeś, wraz z krótkim streszczeniem ze strony?
Paul

1
Powyższe najpierw ładuje pakiet rastrowy, a następnie tworzy „stos” (trójwymiarową tablicę plików rastrowych o identycznym zakresie i rozdzielczości, gdzie każdy plik staje się plasterkiem tego stosu) zawierający pliki oznaczone nazwami plików oddzielonych przecinkami . Ostatni wiersz wykonuje sumy komórkowe dla wszystkich warstw stosu s, a argument na.rm=TRUEpowoduje NAignorowanie wartości. Obiekt wyjściowy ssto rasterobiekt, który można eksportować za pomocą writeRaster(patrz ?writeRaster). (@RobertH jest twórcą rasterpakietu R. )
jbaums

1

Narzędzie warunkowe w programie Spatial Analyst to prosty sposób na konwersję wartości zerowych na zera. Zatem pobranie sum powinno być kłopotliwe.


Dziękuję za odpowiedź. Śledziłem ten post: support.esri.com/fr/knowledgebase/techarticles/detail/34932 i byłem w stanie przekonwertować wszystkie piksele zerowe na 0. Jednak chciałbym móc wykonać tę operację dla wszystkich rastrów w obrębie informator. Wydaje się, że „Przeklasyfikuj wartości siatki” w QGIS jest w stanie to zrobić, ale nie wiem, jak to działa. Wybieram metodę „Simple table” i proszę o ustawienie wartości null na 0 i nie zmienianie innych wartości, ale wynikowy zakres rastra wynosi od -0,99 do 0,08, podczas gdy pierwotnie obejmuje zakres od 428 do 3491
Damien

Czy możesz gdzieś opublikować fragment oryginalnego rastra, abyśmy mogli obejrzeć?
til_b

2
Po kliknięciu narzędzia prawym przyciskiem myszy można uruchomić proces wsadowy dla dowolnej liczby plików, tzn. Dla całego katalogu.
brock

Dziękuję za odpowiedź. Jednak mogę przekonwertować wszystkie wartości NULL na 0 dla jednego pliku, używając „analityka przestrzennego / algebry mapy / kalkulatora rastrowego”. Jeśli dobrze kliknę na to narzędzie, mogę spakować katalog, ale jaka będzie składnia, aby automatycznie uwzględnić każdy plik? ( i.imgur.com/aYaUCzz.png )
Damien

Rzuciłem okiem na narzędzie „przestrzenny analityk / Reclass / Reclassify” i robi dokładnie to, co chcę. Udało mi się użyć okna wsadowego do przetworzenia wielu plików jednocześnie. Mam ostatni problem: kliknięcie prawym przyciskiem myszy / wypełnienie „wyjściowego rastra” powoduje skopiowanie tych samych plików wyjściowych dla wszystkich wejściowych rastrów. Jak mogę zrobić, aby tworzył inny wynik dla każdego wejścia? ( i.imgur.com/jzTI2x9.png )
Damien

1

Jakiś czas temu miałem ten sam problem i udało mi się go rozwiązać.

Podobnie jak uwaga na temat wyświetlania wartości nodata w QGIS: wartości nodata są zawsze wyświetlane jako wartości nodata w oknie mapy i przy użyciu narzędzia „informacje o obiekcie”, bez względu na to, czy faktycznie mają wartość -9999, 0, NULL itp. Tak więc po przeklasyfikowaniu wartości nodata na 0, jeśli przejdziesz do ustawień warstw, znajdziesz w metadanych, że nodata ma wartość 0.

W końcu znalazłem idealne narzędzie do zadania, GRASS r.series. Po odznaczeniu ustawienia „operacji agregacji” „maksimum” i „propagacji wartości NULL” narzędzie utworzy warstwę pasującą do twoich wymagań.


0

Pamiętam ten problem jakiś czas temu. Jako rozwiązanie, myślę, że zrobiłem +1 dla wszystkich komórek w rastrze, dodałem rastry razem, a następnie dokonałem ostatecznego odjęcia (wszystkich dodanych +1). To dość prymitywne, ale jeśli wykona zadanie ...!

Możesz też użyć opcji „Przeklasyfikuj wartości siatki” w przyborniku Przetwarzanie w QGIS, aby przekonwertować wartości zerowe na zero.


Cześć, bezskutecznie wypróbowałem wiele sposobów korzystania z narzędzia „przeklasyfikuj wartości siatki”. Zacząłem od rastra, w którym przekonwertowałem wszystkie piksele NULL na -9999. Próbowałem przeklasyfikować za pomocą metody [0] single i ustawiłem „old value = -9999”, „new value = 0.0”, „operator: [0] =”, ale dostaję tylko raster pełen „nan” piksele. Co ja robię źle?
Damien
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.