एक Multiband रेखापुंज के लिए NoData की स्थापना?


10

मेरे पास आरजीबी ऑर्थोइमेज है जो कि नोएडाटा के बजाय काला क्षेत्र है, जैसा कि यहां चित्रित किया गया है: यहां छवि विवरण दर्ज करें

जब मैं सेटनॉल टूल का उपयोग करता हूं, तो यह ब्लैक एरिया को हटा देता है, हालांकि यह तब इसे ग्रेस्केल ऑर्थोइमेज में बदल देता है, जो कि मैं नहीं चाहता।

यहां छवि विवरण दर्ज करें

मुझे पता है कि रास्टर को स्वयं क्लिप करने के लिए क्लिप (डेटा प्रबंधन) टूल का उपयोग करके इसके चारों ओर एक रास्ता है और वहां आप ब्लैक सेल (0) के मान के लिए NoData मान सेट कर सकते हैं। हालांकि, मैं छात्रों के लिए एक कार्यशाला बना रहा हूं और मैं कम काउंटरिंटुइक्टिव विधि का उपयोग करना चाहूंगा।

प्रत्येक बैंड पर व्यक्तिगत रूप से NoData टूल को चलाने और फिर तीन बैंडों को एक साथ मिलाने का विकल्प है, हालाँकि मुझे ऐसी स्थिति में होना चाहिए जहाँ Band1, band2, और band3 सभी बराबर 0 को NoData के रूप में सेट किया जा सके। ModelBuilder में ऐसा करने में सक्षम होना आदर्श होगा, लेकिन ArcPy का उपयोग करके इसे स्क्रिप्ट करना भी अच्छा होगा।

मैं उन्नत लाइसेंस के साथ ArcGIS 10.2 डेस्कटॉप का उपयोग कर रहा हूं।


आप कहते हैं कि आप "ArcGIS 10.2 प्रो" का उपयोग कर रहे हैं, लेकिन ArcGIS प्रो एप्लिकेशन केवल डेस्कटॉप के लिए ArcGIS 10.3 के साथ जारी किया गया था। क्या आप अपने प्रश्न को संपादित करने के लिए स्पष्ट कर सकते हैं कि आप क्या उपयोग कर रहे हैं, कृपया?
PolyGeo

मैं क्षमाप्रार्थी हूं। मैं उन्नत लाइसेंस के साथ डेस्कटॉप के लिए ArcGIS 10.2 का उपयोग कर रहा हूं।
एलेक्स मैकविटी

यह सवाल पूछने के लिए धन्यवाद। मेरे पास ऐसे ग्राहक हैं जो हर समय यह सोचकर मेरे पास आते हैं कि उनकी इमेजरी में कुछ गड़बड़ है।
वेस

जवाबों:


12

आप जो करना चाहते हैं वह सेट रैस्टर प्रॉपर्टीज़ को स्क्रिप्ट में बदलना है या इसे मैन्युअल रूप से आर्ककॉस्टिक्स में बदलना है। यह एक नया रेखापुंज नहीं बनाएगा या बहुत लंबा भी नहीं लेगा।

अजगर में यह थोड़ा मुश्किल है:

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

चूँकि नोडा सूची से नीचे है इसलिए मुझे यह निर्दिष्ट करना आसान लगता है; पैरामीटर बैंड वैल्यू हैं; बैंड वैल्यू; ... जब तक कि सभी बैंड संबोधित नहीं हो जाते। यदि आपके पास एक ही फ़ोल्डर में अधिक बैंड (या कम) होने की संभावना है, तो आपको आर्कफी का उपयोग करना होगा । सही संख्या के लिए नल सेट करने के लिए बैंडसिंट और बैंडकाउंट संपत्ति का उपयोग करें :

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 संपादक को खारिज करने के लिए ओके मारा और परिवर्तन को लागू करने के लिए ओके करें।

अब रेखापुंज आर्कपार्क में कुछ भी प्रदर्शित नहीं करेगा जहाँ सेल का मान 0,0,0 है।


3

यदि आप रेखापुंज गुणों में जाते हैं, और यदि सिम्बोलोजी को RGB समग्र (जो ऐसा प्रतीत होता है) के रूप में सेट किया गया है, तो आप डिस्प्ले बैकग्राउंड वैल्यूज़ (RGB) बॉक्स को चेक कर सकते हैं और जो कुछ भी आपको पसंद है उसे एक खोखले बैकग्राउंड के रूप में सेट कर सकते हैं। तो बस पृष्ठभूमि मूल्य के रूप में 0 0 0 सेट करें और आपको व्यवसाय में होना चाहिए।


2

मुझे लगता है कि इसे प्राप्त करने का सबसे आसान तरीका यह होगा कि पहले एक अशक्त स्थिति रेखापुंज बनाया जाए, फिर उस रेखापुंज का उपयोग करके प्रत्येक बैंड को अलग से NoData मान निर्दिष्ट करें।

रिक्त स्थिति रेखापुंज बनाने के लिए कॉन फ़ंक्शन को चलाने का प्रयास करें ।

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

फिर सेट नल फ़ंक्शन के साथ प्रत्येक बैंड को NoData मान निर्दिष्ट करने के लिए अशक्त स्थिति रेखापुंज का उपयोग करें । आपको मॉडल बिल्डर या अजगर के साथ ऐसा करने में सक्षम होना चाहिए।


2

मेरा मानना ​​है कि आप पेड़ को विभिन्न प्रक्रियाओं का उपयोग कर सकते हैं जो सैद्धांतिक काम करना चाहिए। रेखापुंज SETNULL([raster] == value, [raster]) गणनाकर्ता जहां आप इस अभिव्यक्ति का उपयोग कर सकते हैं Reclassify जहां आपको केवल उस मान को पुनर्कथन करना चाहिए जो आप चाहते हैं। और आर्कपी का उपयोग करके आप इस स्क्रिप्ट का उपयोग कर सकते हैं जो मैंने यहां पाया है https://gis.stackexchange.com/a/24578/47990

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.