Impostazione di NoData per un raster multibanda?


10

Ho un ortoimmagini RGB che ha un'area nera invece di NoData, come nella foto qui: inserisci qui la descrizione dell'immagine

Quando uso lo strumento SetNull, rimuove l'area nera, tuttavia la trasforma in un ortoimage in scala di grigi, che non è quello che voglio.

inserisci qui la descrizione dell'immagine

So che c'è un modo per aggirare questo usando lo strumento Clip (Gestione dati) per agganciare il raster a se stesso e lì puoi impostare il valore NoData come valore delle celle nere (0). Tuttavia, sto creando un seminario per gli studenti e vorrei utilizzare un metodo meno controintuitivo.

Naturalmente c'è la possibilità di eseguire lo strumento NoData su ciascuna banda singolarmente e quindi di combinare le tre bande insieme, tuttavia ho bisogno di una condizione in cui band1, band2 e band3 siano tutti uguali a 0 per impostarlo come NoData. Essere in grado di farlo in ModelBuilder sarebbe l'ideale, ma sarebbe anche utile copiarlo usando ArcPy.

Sto usando ArcGIS 10.2 Desktop con licenza avanzata.


Dici che stai usando "ArcGIS 10.2 Pro" ma l'applicazione ArcGIS Pro è stata rilasciata solo con ArcGIS 10.3 per desktop. Puoi modificare la tua domanda per chiarire cosa stai usando, per favore?
PolyGeo

Mie scuse. Sto usando ArcGIS 10.2 per desktop con la licenza avanzata.
Alex McVittie,

Grazie per aver posto questa domanda. Ho clienti che tornano da me continuamente pensando che ci sia qualcosa di sbagliato nelle loro immagini.
Wes,

Risposte:


12

Quello che vuoi fare è impostare le proprietà raster in uno script o modificarlo manualmente in ArcCatalog. Questo non creerà un nuovo raster o richiederà anche molto tempo.

In Python è un po 'complicato:

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

Poiché il nodata è in fondo alla lista, trovo più facile specificarlo; i parametri sono Valore banda; Valore banda; ... fino a quando tutte le bande non vengono indirizzate. Se è probabile che tu abbia più bande (o meno) nella stessa cartella, dovrai usare arcpy.Describe e la proprietà bandCount per impostare il null per il numero corretto di bande:

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

In ArcCatalog, fai clic con il pulsante destro del mouse sul livello e vai a proprietà: inserisci qui la descrizione dell'immagine

premi il pulsante modifica:

inserisci qui la descrizione dell'immagine

Immettere i valori, quindi premere OK per chiudere l'editor NoData e OK per applicare la modifica.

Ora il raster non mostrerà nulla in ArcMap dove il valore della cella è 0,0,0.


3

Se vai alle proprietà raster e se la simbologia è impostata come composito RGB (come sembra essere), puoi selezionare la casella Visualizza valori di sfondo (RGB) e impostare quello che preferisci come sfondo vuoto. Quindi imposta 0 0 0 come valore di sfondo e dovresti essere in affari.


2

Penso che il modo più semplice per raggiungere questo obiettivo sia quello di creare prima una condizione null raster, quindi utilizzare quel raster per assegnare separatamente i valori NoData a ciascuna banda.

Prova a eseguire la funzione Con per creare il raster di condizione null.

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

Quindi utilizzare la condizione null raster per assegnare valori NoData a ciascuna banda con la funzione Null impostata . Dovresti essere in grado di farlo con Model Builder o Python.


2

Credo che tu possa usare diverse procedure che teoricamente dovrebbero funzionare. Calcolatore raster in cui è possibile utilizzare questa espressione SETNULL([raster] == value, [raster]) Riclassificare dove è necessario riclassificare solo il valore desiderato. E usando ArcPy puoi usare questo script che ho trovato qui 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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.