Đặt NoData cho raster multiband?


10

Tôi có một trực giao RGB có vùng màu đen thay vì NoData, như trong hình: nhập mô tả hình ảnh ở đây

Khi tôi sử dụng công cụ SetNull, nó sẽ loại bỏ vùng màu đen, tuy nhiên sau đó nó sẽ biến nó thành một chỉnh hình thang độ xám, đây không phải là điều tôi muốn.

nhập mô tả hình ảnh ở đây

Tôi biết rằng có một cách khắc phục điều này bằng cách sử dụng công cụ Clip (Quản lý dữ liệu) để cắt raster thành chính nó và ở đó bạn có thể đặt giá trị NoData là giá trị của các ô đen (0). Tuy nhiên, tôi đang tạo một hội thảo cho sinh viên và tôi muốn sử dụng một phương pháp ít phản trực giác hơn.

Tất nhiên, có tùy chọn chạy công cụ NoData trên từng băng tần riêng lẻ và sau đó kết hợp ba băng tần lại với nhau, tuy nhiên tôi cần có một điều kiện trong đó band1, band2 và band3 đều bằng 0 để đặt nó thành NoData. Có thể làm điều này trong ModelBuilder sẽ là lý tưởng, nhưng kịch bản nó bằng ArcPy cũng sẽ tốt.

Tôi đang sử dụng ArcGIS 10.2 Desktop với Giấy phép nâng cao.


Bạn nói rằng bạn đang sử dụng "ArcGIS 10.2 Pro" nhưng ứng dụng ArcGIS Pro chỉ được phát hành với ArcGIS 10.3 cho Máy tính để bàn. Bạn có thể chỉnh sửa câu hỏi của bạn để làm rõ những gì bạn đang sử dụng, xin vui lòng?
PolyGeo

Lời xin lỗi của tôi. Tôi đang sử dụng ArcGIS 10.2 cho Máy tính để bàn có giấy phép Nâng cao.
Alex McVittie

Cảm ơn bạn đã hỏi câu hỏi này. Tôi có những khách hàng quay lại với tôi suốt thời gian nghĩ rằng có gì đó không đúng với hình ảnh của họ.
Wes

Câu trả lời:


12

Những gì bạn muốn làm là Đặt Thuộc tính Raster trong một tập lệnh hoặc thay đổi nó theo cách thủ công trong ArcCatalog. Điều này sẽ không tạo ra một raster mới hoặc thậm chí mất rất nhiều thời gian.

Trong python đó là một chút khó khăn:

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

Bởi vì các nốt nằm trong danh sách, tôi thấy việc xác định điều đó dễ dàng hơn; các tham số là Band Value; Band Value; ... cho đến khi tất cả các dải được xử lý. Nếu bạn có thể có nhiều băng tần (hoặc ít hơn) trong cùng một thư mục thì bạn sẽ phải sử dụng thuộc tính arcpy.DescribebandCount để đặt null cho số lượng băng tần chính xác:

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

Trong ArcCatalog, nhấp chuột phải vào lớp và đi đến các thuộc tính: nhập mô tả hình ảnh ở đây

nhấn nút chỉnh sửa:

nhập mô tả hình ảnh ở đây

Nhập các giá trị rồi nhấn OK để loại bỏ trình soạn thảo NoData và OK để thực thi thay đổi.

Bây giờ raster sẽ không hiển thị gì trong ArcMap trong đó giá trị ô là 0,0,0.


3

Nếu bạn đi đến các thuộc tính raster và nếu ký hiệu được đặt là hỗn hợp RGB (có vẻ như là vậy), bạn có thể kiểm tra hộp Hiển thị giá trị nền (RGB) và đặt bất cứ thứ gì bạn thích làm nền rỗng. Vì vậy, chỉ cần đặt 0 0 0 làm giá trị nền và bạn sẽ kinh doanh.


2

Tôi nghĩ rằng cách dễ nhất để đạt được điều này trước tiên là tạo một raster điều kiện null, sau đó sử dụng raster đó để gán các giá trị NoData cho mỗi băng tần riêng biệt.

Hãy thử chạy hàm Con để tạo raster điều kiện null.

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

Sau đó sử dụng raster điều kiện null để gán giá trị NoData cho mỗi băng tần với hàm Null được đặt . Bạn sẽ có thể làm điều này với trình xây dựng mô hình hoặc python.


2

Tôi tin rằng bạn có thể sử dụng các thủ tục khác nhau trên cây mà lý thuyết nên hoạt động. Trình tính toán raster nơi bạn có thể sử dụng biểu thức này SETNULL([raster] == value, [raster]) Phân loại lại nơi bạn chỉ nên phân loại lại giá trị mà bạn muốn. Và sử dụng ArcPy, bạn có thể sử dụng tập lệnh này mà tôi đã tìm thấy ở đây /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")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.