Çok bantlı tarama için NoData ayarlanıyor mu?


10

Burada gösterildiği gibi NoData yerine siyah alana sahip bir RGB ortoimage var: resim açıklamasını buraya girin

SetNull aracını kullandığımda, siyah alanı kaldırıyor, ancak daha sonra istediğim gibi olmayan gri tonlu bir ortoimage haline getiriyor.

resim açıklamasını buraya girin

Raster kendisine klipslemek için Clip (Data Management) aracını kullanarak bu konuda bir yol olduğunu biliyorum ve orada siyah hücrelerin (0) değeri olarak NoData değerini ayarlayabilirsiniz. Ancak, öğrenciler için bir atölye çalışması yapıyorum ve daha az sezgisel bir yöntem kullanmak istiyorum.

Tabii ki NoData aracını her bant üzerinde ayrı ayrı çalıştırma ve daha sonra üç bandı bir araya getirme seçeneği var, ancak burada NoData olarak ayarlamak için band1, band2 ve band3'ün hepsinin 0'a eşit olduğu bir koşula ihtiyacım var. ModelBuilder'da bunu yapabilmek ideal olurdu, ancak ArcPy kullanarak komut dosyası yazmak da iyi olurdu.

Gelişmiş Lisanslı ArcGIS 10.2 Masaüstü kullanıyorum.


"ArcGIS 10.2 Pro" kullandığınızı söylüyorsunuz, ancak ArcGIS Pro uygulaması yalnızca ArcGIS 10.3 for Desktop ile piyasaya sürüldü. Eğer Can düzenlemek soru, kullandığınız söyler misiniz lütfen netleştirmek için?
PolyGeo

Özür dilerim. Gelişmiş lisanslı Masaüstü için ArcGIS 10.2 kullanıyorum.
Alex McVittie

Bu soruyu sorduğunuz için teşekkür ederiz. Görüntüleri ile ilgili bir sorun olduğunu düşünerek sürekli bana gelen müşterilerim var.
Wes

Yanıtlar:


12

Yapmak istediğiniz şey bir komut dosyasında Raster Özelliklerini Ayarlamak veya ArcCatalog'da manuel olarak değiştirmek. Bu yeni bir tarama oluşturmayacak veya çok uzun sürmeyecektir.

Python'da biraz zor:

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

Nodata listenin aşağısında yer aldığından bunu belirtmeyi daha kolay buluyorum; parametreler Bant Değeri; Bant Değeri; ... tüm bantlar adreslenene kadar. Aynı klasörde daha fazla bant (veya daha az) olması muhtemelse , doğru sayıda bant için null değeri ayarlamak üzere arcpy.Describe ve bandCount özelliğini kullanmanız gerekir :

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'da katmana sağ tıklayın ve özelliklere gidin: resim açıklamasını buraya girin

düzenle düğmesine basın:

resim açıklamasını buraya girin

Değerleri girin ve ardından NoData düzenleyicisini kapatmak için Tamam'a ve değişikliği uygulamak için Tamam'a basın.

Şimdi raster ArcMap'te hücre değerinin 0,0,0 olduğu hiçbir şey göstermeyecek.


3

Raster özelliklerine giderseniz ve semboloji RGB bileşimi olarak ayarlanmışsa (ki bu öyle görünüyorsa), Arka Plan Değerlerini Görüntüle (RGB) kutusunu işaretleyebilir ve boş bir arka plan olarak istediğinizi ayarlayabilirsiniz. Yani arka plan değeri olarak 0 0 0 ayarlayın ve işte olmalısınız.


2

Ben bunu başarmak için en kolay yolu ilk olarak bir boş koşul raster oluşturmak, daha sonra ayrı ayrı her gruba NoData değerleri atamak için bu raster kullanmak olacağını düşünüyorum.

Boş koşullu tarama oluşturmak için Con işlevini çalıştırmayı deneyin .

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

Ardından, set Null işleviyle her banda NoData değerleri atamak için null koşul rasterini kullanın . Bunu model oluşturucu veya python ile yapabilmelisiniz.


2

Teorik olarak çalışması gereken ağaç farklı prosedürleri kullanabileceğinize inanıyorum. Bu ifadeyi kullanabileceğiniz Raster hesaplayıcı SETNULL([raster] == value, [raster]) Yalnızca istediğiniz değeri yeniden sınıflandırmanız gereken yeri yeniden sınıflandırın. Ve ArcPy kullanarak burada bulduğum bu komut dosyasını kullanabilirsiniz 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")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.