Jak ustawić wszystkie piksele o wartości <= 0 na „nodata” w rastrze DEM?

28

Mam raster DEM z wartościami pikseli od około 3000 do -0 0003. Muszę ustawić wszystkie piksele o wartości 0 i smaler (<= 0) na „nodata” (do późniejszych obliczeń rastrowych i zmniejszenia rozmiaru pliku).

Wydaje mi się, że jest to zadanie kalkulatora rastrowego (ustaw wartość pikseli <= 0 na „nodata”) lub przeklasyfikowanie (ustaw wartość pikseli <= 0 na „nodata” i zachowaj wszystkie inne wartości), ale nie wiem jak.

MAPA
źródło
Muszę też ustawić wszystkie piksele o wartości <0 na „nodata”. Więc post z vascobnunes mi nie pomaga.
MAP
Przepraszam, ale to nie pomaga mi zmienić stylu wyświetlania rastra. Muszę fizycznie edytować plik rastrowy.
MAP
Z komentarzy i sugestii zamknięcia wydaje się, że powinieneś edytować swoje Pytanie, aby dokładnie wyjaśnić, czego chcesz i co już próbowałeś.
PolyGeo

Odpowiedzi:

29

Nie znalazłem rozwiązania jednego narzędzia, ale możesz najpierw użyć kalkulatora rastrowego, aby ustawić wszystkie wartości poniżej określonego progu na zero, a następnie użyć gdal_translate z -a_nodata 0, aby zamienić 0 na nodata.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

podmrok
źródło
17

Oto wyrażenia mapcalc GRASS, aby ustawić zakres na NULL:

r.mapcalc "dem_corrected = if(dem<=0, null(), dem)"
Micha
źródło
Świetnie, działa dla mnie!
ilFonta
16

Można to zrobić w jednym kroku w QGIS w kalkulatorze rastrowym.

W QGIS3 dla warstwy rastrowej o nazwie „x” użyj następującego wyrażenia:

(("x">0)*"x") / (("x">0)*1 + ("x"<=0)*0)

Ta sztuczka odwzorowuje wartości rastrowe x> 0 na stosunek x / 1 = x, a wartości rastrowe x <= 0 na stosunek 0/0 = NaN. Ten NaN jest renderowany jako FLOAT_MIN (aka -3,402832 ... e + 38), jeśli raster jest 4-bajtowym zmiennoprzecinkowym.

O dziwo wydaje się, że to pytanie już dawno minęło, a (o ile dziś pokazuje moje szybkie wyszukiwanie w Google) większość respondentów twierdzi, że nie można tego zrobić jednym krokiem. Z pewnością nie trzeba go tak hakować. Dokumentacja QGIS może być również lepsza.

Colin Stark
źródło
10

Wielkie podziękowania dla Dominika. Moja pierwsza odpowiedź nie jest poprawna dla QGIS 2.8.3 (wyrażenie "myraster@1" > 0zwraca 0 lub 1 dla nie- NODATA wejściowe, na kod NODATA wejście to powraca NODATA ).

Poniższe wyrażenie QGIS Raster Calculator powinno wystarczyć (warstwa rastrowa o nazwie „myraster”), ponieważ QGIS Raster Calculator ustawia wszystkie piksele niespełniające warunku na nodata :

(„myraster @ 1”> 0) * „myraster @ 1”

Poniższe rozwiązanie jest oparte na https://docs.qgis.org/2.8/en/docs/training_manual/processing/no_data.html i działa dla QGIS 2.8.3 z SAGA 2.1.2.

W QGIS przetwarzanie, wykorzystywanie sagi kalkulatora Raster i wprowadź następujące w Formule :

ifelse(g1=0, 0/0, ifelse(g1<0, 0/0, g1))

lub

ifelse(a=0, 0/0, ifelse(a<0, 0/0, a))

Spowoduje to przekształcenie wszystkich wartości mniejszych lub równych 0 w nodata (0/0).

Håvard Tveite
źródło
to nie działa, ponieważ piksele niespełniające warunku to 0, a nie nodata
Dominik
Wspaniały. Można go użyć do filtrowania wartości rastrowych: Na przykład filtr (0,5; 23): ifelse (g1 <0,5, 0/0, ifelse (g1> 23, 0/0, g1))
lolipop
10

Możesz także zapisać warstwę (prawy przycisk myszy, zapisać jako ...) i określić zakres nodata. Pozwoli to zachować oryginalne nodata i utworzyć nowe wartości dodatkowe dla określonego zakresu wartości.

Joost Beckers
źródło
To najlepsze rozwiązanie
Alexander
5

Miałem podobny problem, ale Miałem OBA wartości, które chciałem przekonwertować na brak danych ORAZ istniejące wartości bez danych w rastrze.

Zidentyfikuj wyniki

Przyszedłem na tę stronę po pomoc, ale myślę, że jest tutaj zastrzeżenie. Metody @underdark i @Micha wydają się działać tylko wtedy, gdy w rastrze nie ma żadnych wartości braku danych.

Aby obejść ten problem, musisz przekonwertować zarówno wartości bez danych, jak i wartości, które chcesz przekonwertować na dane bez danych, na stałą liczbę. W takim przypadku można użyć drugiego kroku @underdark.

Aby to zrobić, użyj Przybornika przetwarzania> Przeklasyfikuj wartości siatki (SAGA), aby jednocześnie przekonwertować wartości i wartości bez danych na wspólną liczbę (np. -999). W szczególności użyj metody „zakres” i określ zakres. Następnie w zastępowaniu wartości bez danych wybierz tę samą wartość (np. -999). Odznacz zastąp inne wartości. Działa to dla pojedynczej zmiany wartości lub bardziej złożonych zmian.

Następnie postępuj zgodnie z metodą @underdark i zapisz raster używając Raster> Konwersja> Przetłumacz i zaznacz brak danych, wprowadzając wartość, której użyłeś (np. -999).

Sarracenia
źródło
-3

Kliknij prawym przyciskiem myszy raster, przejdź do właściwości rastra, wybierz trzecią opcję „przezroczystość”, w zakładce bez wartości danych dodaj dodatkową wartość 0 i kliknij Zastosuj. Jest to podobna opcja „wyświetl wartość tła” w Arcgis.

Bharadwaj AK
źródło
4
Nie jest to dobra metoda. Nie jesteś rzeczywiście się zmienia dane, więc jeśli trzeba statystyk wyliczania lub zrobić analizę wyniki będą błędne
khafen