Ustawienie NoData dla rastra wielopasmowego?

10

Mam ortoobraz obrazu RGB, który ma czarny obszar zamiast NoData, jak pokazano tutaj: wprowadź opis zdjęcia tutaj

Kiedy korzystam z narzędzia SetNull, usuwa czarny obszar, jednak następnie zamienia go w ortoobraz obrazu w skali szarości, co nie jest tym, czego chcę.

wprowadź opis zdjęcia tutaj

Wiem, że można to obejść za pomocą narzędzia Clip (Zarządzanie danymi), aby przyciąć raster do siebie, i tam można ustawić wartość NoData na wartość czarnych komórek (0). Jednak tworzę warsztaty dla studentów i chciałbym zastosować metodę mniej intuicyjną.

Istnieje oczywiście opcja uruchomienia narzędzia NoData dla każdego pasma osobno, a następnie połączenia trzech pasm razem, jednak muszę mieć warunek, w którym pasmo 1, pasmo 2 i pasmo 3 są równe 0, aby ustawić je jako NoData. Idealna byłaby możliwość wykonania tego w ModelBuilder, ale dobrze byłoby też napisać skrypt za pomocą ArcPy.

Korzystam z ArcGIS 10.2 Desktop z licencją zaawansowaną.

Alex McVittie
źródło
Mówisz, że używasz „ArcGIS 10.2 Pro”, ale aplikacja ArcGIS Pro została wydana tylko z ArcGIS 10.3 na komputery. Czy możesz edytować swoje pytanie, aby wyjaśnić, czego używasz?
PolyGeo
Przepraszam. Korzystam z ArcGIS 10.2 na komputery z licencją Advanced.
Alex McVittie,
Dziękuję za pytanie. Mam klientów, którzy cały czas do mnie wracają, myśląc, że coś jest nie tak z ich obrazami.
Wes

Odpowiedzi:

12

Co chcesz zrobić, to ustawić właściwości rastra w skrypcie lub zmienić go ręcznie w ArcCatalog. Nie stworzy to nowego rastra ani nawet nie potrwa długo.

W pythonie jest to trochę trudne:

import sys, os, arcpy

InFolder = sys.argv[1]
arcpy.env.workspace = InFolder

for Ras in arcpy.ListRasters():
    arcpy.AddMessage("Processing " + Ras)
    arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0")

Ponieważ nodata znajduje się daleko na liście, łatwiej mi to określić; parametry to Wartość pasma; Wartość pasma; ... aż wszystkie pasma zostaną zaadresowane. Jeśli prawdopodobnie masz więcej pasm (lub mniej) w tym samym folderze, będziesz musiał użyć arcpy.Describe i właściwości bandCount, aby ustawić wartość null dla prawidłowej liczby pasm:

import sys, os, arcpy

InFolder = sys.argv[1]
arcpy.env.workspace = InFolder

for Ras in arcpy.ListRasters():
    arcpy.AddMessage("Processing " + Ras)
    desc = arcpy.Describe(Ras)
    if desc.bandCount == 3:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0")
    elif desc.bandCount == 4:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0;2 0;3 0;4 0")
    elif desc.bandCount == 1:
        arcpy.SetRasterProperties_management(Ras,nodata="1 0")

W ArcCatalog kliknij warstwę prawym przyciskiem myszy i przejdź do właściwości: wprowadź opis zdjęcia tutaj

naciśnij przycisk edycji:

wprowadź opis zdjęcia tutaj

Wprowadź wartości, a następnie naciśnij OK, aby zamknąć edytor NoData i OK, aby wymusić zmianę.

Teraz raster nie wyświetli nic w ArcMap, gdzie wartość komórki wynosi 0,0,0.

Michael Stimson
źródło
3

Jeśli przejdziesz do właściwości rastra i jeśli symbolika jest ustawiona jako kompozyt RGB (jak się wydaje), możesz zaznaczyć pole Wyświetlaj wartości tła (RGB) i ustawić dowolne puste tło. Więc po prostu ustaw 0 0 0 jako wartość tła i powinieneś być w biznesie.

mr.adam
źródło
2

Myślę, że najłatwiejszym sposobem na osiągnięcie tego byłoby utworzenie rastra warunku zerowego, a następnie użycie tego rastra do przypisania wartości NoData do każdego pasma osobno.

Spróbuj uruchomić funkcję Con stworzyć raster stan zerowy.

nullCondition = Con(((band1 == 0) & (band2 == 0) & (band3 == 0)), 1, 0)

Następnie użyj rastru warunek zerowy, aby przypisać wartości NoData do każdego pasma za pomocą ustawionej funkcji zerowej . Powinieneś być w stanie to zrobić za pomocą konstruktora modeli lub Pythona.

Ben Gosack
źródło
2

Wierzę, że możesz użyć drzewa różnych procedur, które teoretycznie powinny zadziałać. Kalkulator rastrowy, w którym można użyć tego wyrażenia SETNULL([raster] == value, [raster]) Ponownie sklasyfikuj, w którym miejscu należy przeklasyfikować tylko żądaną wartość. Za pomocą ArcPy możesz użyć skryptu, który znalazłem tutaj https://gis.stackexchange.com/a/24578/47790

import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
outSetNull = SetNull("elevation", "elevation", "VALUE = 9999")
outSetNull.save("C:/sapyexamples/output/outsetnull")
Diogo Matos
źródło