การตั้งค่า NoData สำหรับแรสเตอร์หลายแกน?


10

ฉันมี orthoimage RGB ที่มีพื้นที่สีดำแทน NoData ดังภาพที่นี่: ป้อนคำอธิบายรูปภาพที่นี่

เมื่อฉันใช้เครื่องมือ SetNull มันจะลบพื้นที่สีดำออกไป แต่มันจะเปลี่ยนเป็นสีเทาแบบออร์โธไมซ์ซึ่งไม่ใช่สิ่งที่ฉันต้องการ

ป้อนคำอธิบายรูปภาพที่นี่

ฉันรู้ว่ามีวิธีแก้ไขปัญหานี้โดยใช้เครื่องมือ Clip (Data Management) เพื่อคลิปแรสเตอร์ให้กับตัวเองและในนั้นคุณสามารถตั้งค่า NoData เป็นค่าของเซลล์สีดำ (0) อย่างไรก็ตามฉันกำลังสร้างเวิร์กช็อปสำหรับนักเรียนและฉันต้องการใช้วิธีการที่ใช้งานง่ายกว่า

แน่นอนว่ามีตัวเลือกในการเรียกใช้เครื่องมือ NoData ในแต่ละแบนด์แยกจากกันแล้วรวมสามแบนด์เข้าด้วยกัน แต่ฉันต้องมีเงื่อนไขที่ band1, band2 และ band3 เท่ากับ 0 ทั้งหมดเพื่อตั้งเป็น NoData ความสามารถในการทำเช่นนี้ใน ModelBuilder จะเหมาะ แต่การเขียนสคริปต์โดยใช้ ArcPy ก็จะดีเช่นกัน

ฉันกำลังใช้เดสก์ท็อป ArcGIS 10.2 พร้อมใบอนุญาตขั้นสูง


คุณบอกว่าคุณกำลังใช้ "ArcGIS 10.2 Pro" แต่แอปพลิเคชั่น ArcGIS Pro เปิดตัวด้วย ArcGIS 10.3 สำหรับเดสก์ท็อปเท่านั้น คุณสามารถแก้ไขคำถามของคุณเพื่ออธิบายสิ่งที่คุณกำลังใช้โปรด?
PolyGeo

ขอโทษด้วย. ฉันใช้ ArcGIS 10.2 สำหรับเดสก์ท็อปที่มีใบอนุญาตขั้นสูง
Alex McVittie

ขอบคุณที่ถามคำถามนี้ ฉันมีลูกค้าที่กลับมาหาฉันตลอดเวลาคิดว่ามีบางอย่างผิดปกติกับภาพของพวกเขา
Wes

คำตอบ:


12

สิ่งที่คุณต้องการทำคือตั้งค่าคุณสมบัติแรสเตอร์ในสคริปต์หรือเปลี่ยนแปลงด้วยตนเองใน ArcCatalog สิ่งนี้จะไม่สร้างแรสเตอร์ใหม่หรือใช้เวลานานมาก

ในงูหลามมันค่อนข้างยุ่งยาก:

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

เนื่องจากข้อมูลที่อยู่ในรายการฉันพบว่าระบุได้ง่ายกว่า พารามิเตอร์คือ Band Value; Band Value; ... จนกระทั่งแบนด์ทั้งหมดได้รับการแก้ไข หากคุณมีแนวโน้มที่จะมีแบนด์เพิ่มเติม (หรือน้อยกว่า) ในโฟลเดอร์เดียวกันคุณจะต้องใช้arcpy.Describeและคุณสมบัติ bandCountเพื่อตั้งค่า null สำหรับจำนวนแบนด์ที่ถูกต้อง:

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 และตกลงเพื่อบังคับใช้การเปลี่ยนแปลง

ตอนนี้แรสเตอร์จะไม่แสดงผลอะไรใน ArcMap โดยที่ค่าของเซลล์เท่ากับ 0,0,0


3

หากคุณไปที่คุณสมบัติแรสเตอร์และหากตั้งค่าสัญลักษณ์เป็นคอมโพสิต RGB (ซึ่งดูเหมือนจะเป็น) คุณสามารถทำเครื่องหมายในกล่องแสดงค่าพื้นหลังจอแสดงผล (RGB) และตั้งค่าสิ่งที่คุณต้องการเป็นพื้นหลังแบบกลวง ดังนั้นเพียงแค่ตั้งค่า 0 0 0 เป็นค่าพื้นหลังและคุณควรจะอยู่ในธุรกิจ


2

ฉันคิดว่าวิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนี้คือการสร้างแรสเตอร์เงื่อนไขว่างก่อนจากนั้นใช้แรสเตอร์นั้นเพื่อกำหนดค่า NoData ให้กับแต่ละแบนด์

ลองเรียกใช้ฟังก์ชัน Conเพื่อสร้างแรสเตอร์เงื่อนไขว่าง

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

จากนั้นใช้ raster สภาพ 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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.