Налаштування NoData для багатополосного растру?


10

У мене є орфографічний малюнок RGB, який має чорну зону замість NoData, як зображено на фотографії: введіть тут опис зображення

Коли я використовую інструмент SetNull, він видаляє чорну область, однак потім перетворює його в орфографічний відтінок сірого, чого я не хочу.

введіть тут опис зображення

Я знаю, що є спосіб подолати це за допомогою інструменту Clip (управління даними), щоб підключити растр до себе, і там ви можете встановити значення NoData як значення чорних комірок (0). Однак я створюю практикум для студентів, і я хотів би використовувати менш контрінтуїтивний метод.

Звичайно, є можливість запустити інструмент NoData на кожній смузі окремо, а потім об'єднати три смуги разом, однак мені потрібно створити умову, коли для band1, band2 та band3 всі рівні 0, щоб встановити це як NoData. Бути в змозі зробити це в ModelBuilder було б ідеально, але сценарій його за допомогою ArcPy також був би хорошим.

Я використовую ArcGIS 10.2 Desktop з розширеною ліцензією.


Ви кажете, що використовуєте "ArcGIS 10.2 Pro", але додаток ArcGIS Pro було випущено лише з ArcGIS 10.3 для Desktop. Чи можете ви відредагувати своє запитання, щоб уточнити, чим ви користуєтесь?
PolyGeo

Мої вибачення. Я використовую ArcGIS 10.2 для Desktop з ліцензією Advanced.
Алекс Маквітті

Дякую, що задали це запитання. У мене є клієнти, які постійно повертаються до мене, думаючи, що в їхніх образах щось не так.
Уес

Відповіді:


12

Що ви хочете зробити, це встановити властивості Raster у сценарії або змінити його вручну в ArcCatalog. Це не створить новий растр або навіть займе дуже багато часу.

У python це трохи хитро:

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

Оскільки нодати - це внизу списку, мені простіше вказати це; параметри - Значення діапазону; Значення діапазону; ..., поки не будуть вирішені всі смуги. Якщо ви, ймовірно, матимете більше діапазонів (або менше) у одній папці, тоді вам доведеться використовувати arcpy.Describe та властивість bandCount, щоб встановити нуль для правильної кількості діапазонів:

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

У ArcCatalog клацніть правою кнопкою миші на шарі та перейдіть до властивостей: введіть тут опис зображення

натисніть кнопку редагування:

введіть тут опис зображення

Введіть значення, а потім натисніть ОК, щоб відхилити редактор NoData, і OK, щоб застосувати зміни.

Тепер растр нічого не відображатиме в ArcMap, де значення комірки становить 0,0,0.


3

Якщо ви перейдете до властивостей растру і якщо символіка встановлена ​​як композиція RGB (що, здається, є), ви можете встановити поле Відображення фонових значень (RGB) і встановити все, що вам подобається, як порожній фон. Тому просто встановіть 0 0 0 як фонове значення, і вам слід займатися бізнесом.


2

Я думаю, що найпростішим способом досягти цього було б спершу створити растровий стан нульового стану, а потім використати цей растр, щоб окремо призначити значення NoData кожному діапазону.

Спробуйте запустити функцію Con, щоб створити растр нульового стану.

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

Потім використовуйте растр нульового стану, щоб призначити значення NoData кожному діапазону із заданою функцією Null . Ви повинні зробити це за допомогою конструктора моделей або пітона.


2

Я вважаю, що ви можете використовувати різні дерева, які теоретично повинні працювати. Растровий калькулятор, де ви можете використовувати цей вираз SETNULL([raster] == value, [raster]) Перекласифікуйте там, де слід перекладати лише те значення, яке вам потрібно. І за допомогою ArcPy ви можете використовувати цей скрипт, який я знайшов тут 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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.