NoData für ein Multiband-Raster einstellen?

10

Ich habe ein RGB-Orthobild mit schwarzem Bereich anstelle von NoData, wie hier abgebildet: Geben Sie hier die Bildbeschreibung ein

Wenn ich das SetNull-Werkzeug verwende, wird der schwarze Bereich zwar entfernt, aber dann in ein Graustufen-Orthobild umgewandelt, was ich nicht möchte.

Geben Sie hier die Bildbeschreibung ein

Ich weiß, dass es einen Weg gibt, dies zu umgehen, indem Sie das Raster mit dem Clip-Tool (Datenverwaltung) in sich selbst schneiden. Dort können Sie den NoData-Wert auf den Wert der schwarzen Zellen (0) festlegen. Ich erstelle jedoch einen Workshop für Studenten und möchte eine weniger kontraintuitive Methode anwenden.

Es besteht natürlich die Möglichkeit, das NoData-Tool für jedes Band einzeln auszuführen und dann die drei Bänder miteinander zu kombinieren. Ich muss jedoch eine Bedingung haben, bei der Band1, Band2 und Band3 alle gleich 0 sind, um dies als NoData festzulegen. Dies in ModelBuilder zu tun, wäre ideal, aber es wäre auch gut, Skripte mit ArcPy zu erstellen.

Ich verwende ArcGIS 10.2 Desktop mit erweiterter Lizenz.

Alex McVittie
quelle
Sie sagen, Sie verwenden "ArcGIS 10.2 Pro", aber die ArcGIS Pro-Anwendung wurde nur mit ArcGIS 10.3 für Desktop veröffentlicht. Können Sie Ihre Frage bearbeiten, um zu klären, was Sie verwenden?
PolyGeo
Entschuldigen Sie. Ich verwende ArcGIS 10.2 für Desktop mit der erweiterten Lizenz.
Alex McVittie
Vielen Dank, dass Sie diese Frage gestellt haben. Ich habe Kunden, die ständig zu mir zurückkehren und denken, dass etwas mit ihren Bildern nicht stimmt.
Wes

Antworten:

12

Was Sie tun möchten , ist Set Raster - Eigenschaften in einem Skript oder in ArcCatalog manuell ändern. Dadurch wird kein neues Raster erstellt oder es dauert nicht einmal sehr lange.

In Python ist es etwas schwierig:

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")

Da die Nodata ganz unten in der Liste stehen, fällt es mir leichter, dies anzugeben. Die Parameter sind Bandwert; Bandwert; ... bis alle Bänder adressiert sind. Wenn Sie wahrscheinlich mehr Bänder (oder weniger) im selben Ordner haben, müssen Sie arcpy.Describe und die Eigenschaft bandCount verwenden , um die Null für die richtige Anzahl von Bändern festzulegen :

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")

Klicken Sie in ArcCatalog mit der rechten Maustaste auf die Ebene und gehen Sie zu Eigenschaften: Geben Sie hier die Bildbeschreibung ein

Klicken Sie auf die Schaltfläche Bearbeiten:

Geben Sie hier die Bildbeschreibung ein

Geben Sie die Werte ein und klicken Sie auf OK, um den NoData-Editor zu schließen, und auf OK, um die Änderung zu erzwingen.

Jetzt zeigt das Raster in ArcMap nichts an, wobei der Zellenwert 0,0,0 beträgt.

Michael Stimson
quelle
3

Wenn Sie zu den Rastereigenschaften wechseln und die Symbologie als RGB-Verbund festgelegt ist (was anscheinend der Fall ist), können Sie das Kontrollkästchen Hintergrundwerte anzeigen (RGB) aktivieren und einen beliebigen hohlen Hintergrund festlegen. Stellen Sie einfach 0 0 0 als Hintergrundwert ein und Sie sollten im Geschäft sein.

mr.adam
quelle
2

Ich denke, der einfachste Weg, dies zu erreichen, wäre, zuerst ein Raster mit Nullbedingungen zu erstellen und dann dieses Raster zu verwenden, um die NoData-Werte jedem Band separat zuzuweisen.

Führen Sie die Con-Funktion aus , um das Nullbedingungsraster zu erstellen.

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

Verwenden Sie dann das Null-Bedingungsraster, um jedem Band mit der eingestellten Null-Funktion NoData-Werte zuzuweisen . Sie sollten dies mit Model Builder oder Python tun können.

Ben Gosack
quelle
2

Ich glaube, dass Sie verschiedene Baumverfahren anwenden können, die theoretisch funktionieren sollten. Rasterrechner, in dem Sie diesen Ausdruck verwenden können SETNULL([raster] == value, [raster]) Reklassifizieren Sie, wo Sie nur den gewünschten Wert neu klassifizieren sollten. Mit ArcPy können Sie dieses Skript verwenden, das ich hier gefunden habe: /gis//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
quelle