जवाबों:
इस तरह की समस्याओं के लिए पिक बनाया गया था। इसे "कोन" के "स्विच" (या "केस") संस्करण के रूप में सोचें, जो "अगर ... और" का नक्शा बीजगणित कार्यान्वयन है।
उदाहरण के लिए, 3 ओवरलैपिंग रस्टर्स हैं, तो (पायथन) सिंटैक्स जैसा दिखेगा
inPositionRaster = 1 + int(3 * CreateRandomRaster())
Pick(inPositionRaster, [inRas01, inRas02, inRas03])
ध्यान दें कि pick
1 पर अनुक्रमण शुरू होता है, 0 नहीं।
(टिप्पणी धागा देखें)
NoData मानों का सामना करने के लिए, सबसे पहले आपको ArcGIS के NoData हैंडलिंग को बंद करना होगा। NoData के स्थान पर एक विशेष (लेकिन मान्य) मान वाले ग्रिड बनाकर ऐसा करें, जैसे कि 99999 (या जो भी: लेकिन ऐसा मान चुनें जो किसी मान्य संख्या से बड़ा हो जो प्रकट हो सकता है: यह बाद में आसान होगा) । इस के रूप में IsNull अनुरोध का उपयोग करने की आवश्यकता है
p01 = Con(IsNull(inRas01), 99999, inRas01)
p02 = Con(IsNull(inRas02), 99999, inRas01)
p03 = Con(IsNull(inRas03), 99999, inRas01)
उदाहरण के लिए, इन एक-पंक्ति ग्रिड के मामले पर विचार करें (NoData को "*" के रूप में दिखाया गया है):
inRas01: 1 2 19 4 * * * *
inRas02: 9 2 * * 13 14 * *
inRas03: 17 * 3 * 21 * 23 *
परिणाम प्रत्येक "*" के स्थान पर 99999 रखा जाता है।
इसके बाद, इन सभी आपदाओं को लापता ब्लॉकों (छेद) के अनुरूप नूडाटा के साथ लकड़ी के ब्लॉक के फ्लैट सरणियों के रूप में कल्पना करें। जब आप लंबवत रूप से इन चूहों को ढेर करते हैं, तो ब्लॉक उनके नीचे किसी भी छेद में गिर जाएंगे। हमें NoData मान चुनने से बचने के लिए उस व्यवहार की आवश्यकता है: हम ब्लॉकों के ढेर में कोई भी ऊर्ध्वाधर अंतराल नहीं चाहते हैं। प्रत्येक टॉवर में ब्लॉक का क्रम वास्तव में मायने नहीं रखता है। इसके लिए, हम प्रत्येक टॉवर को डेटा रैंकिंग के द्वारा प्राप्त कर सकते हैं :
q01 = Rank(1, [p01, p02, p03])
q02 = Rank(2, [p01, p02, p03])
q03 = Rank(3, [p01, p02, p03])
उदाहरण में, हम प्राप्त करते हैं
q01: 1 2 3 4 13 14 23 99999
q02: 9 2 19 99999 21 99999 99999 99999
q03: 17 99999 99999 99999 99999 99999 99999 99999
ध्यान दें कि रैंक सबसे कम से उच्चतम तक होती हैं, ताकि q01 में प्रत्येक स्थान पर सबसे कम मान शामिल हों, q02 में दूसरे-सबसे कम शामिल हैं, आदि NoData कोड तब तक दिखाई नहीं देते हैं जब तक कि सभी वैध नंबर एकत्र नहीं किए जाते हैं, क्योंकि वे कोड किसी भी मान्य संख्या से बड़ी हैं ।
यादृच्छिक चयन के दौरान इन NoData कोड को चुनने से बचने के लिए, आपको यह जानना होगा कि प्रत्येक स्थान पर कितने ब्लॉक हैं: यह बताता है कि कितने वैध मूल्य होते हैं। इसे संभालने का एक तरीका है , NoData कोड की संख्या की गणना करना कि और चयन ग्रिड की कुल संख्या से घटाएं:
n0 = 3 - EqualToFrequency(99999, [q01, q02, q03])
यह प्रदान करता है
n0: 3 2 2 1 2 1 1 0
उन मामलों को संभालने के लिए जहां n = 0 (इसलिए चयन करने के लिए कुछ भी उपलब्ध नहीं है), उन्हें NoData पर सेट करें:
n = SetNull(n0 == 0, n0)
अभी
n: 3 2 2 1 2 1 1 *
यह भी गारंटी देगा कि आपके (अस्थायी) NoData कोड अंतिम गणना में गायब हो जाते हैं। 1 और n के बीच यादृच्छिक मान उत्पन्न करें:
inPositionRaster = 1 + int(n * CreateRandomRaster())
उदाहरण के लिए, यह रेखापुंज जैसा लग सकता है
inPositionRaster: 3 2 1 1 2 1 1 *
इसके सभी मान 1 और संगत मान [n] के बीच स्थित हैं।
पहले की तरह ही मान चुनें:
selection = Pick(inPositionRaster, [q01, q02, q03])
इसका परिणाम यह होगा
selection: 17 2 3 4 21 14 23 *
यह जांचने के लिए कि सब ठीक है, सभी आउटपुट कोशिकाओं का चयन करने का प्रयास करें जिनके पास NoData कोड है (इस उदाहरण में 99999): कोई भी नहीं होना चाहिए।
हालाँकि यह चल रहा उदाहरण केवल चयन करने के लिए तीन ग्रिड का उपयोग करता है, मैंने इसे इस तरह से लिखा है कि किसी भी संख्या में ग्रिड के लिए आसानी से सामान्यीकृत होता है। बहुत सारे ग्रिड के साथ, एक स्क्रिप्ट लिखना (बार-बार के संचालन पर लूप करना) अमूल्य होगा।
pick
रेखापुंज हैं NoData (लेकिन मैं इस मामले में पूरी तरह से सुनिश्चित नहीं हूं : यदि InPositionRaster और चयनित रेखापुंज दोनों में एक सेल में मान्य मान हैं, तो परिणाम संभव है उस कक्ष के लिए चयनित रेखापुंज का मान होना चाहिए, चाहे किसी भी अन्य आपदाओं में कोई भी हो)। आप किस वैकल्पिक व्यवहार के बारे में सोच रहे हैं?
अजगर और आर्कजीआईएस 10 का उपयोग करना और निम्नलिखित फ़ंक्शन के शंकु समारोह का उपयोग करना है :
Con (in_conditional_raster, in_true_raster_or_constant, {in_false_raster_or_constant}, {where_clause})
यहाँ विचार यह है कि यदि यादृच्छिक रेखापुंज में मान 0.5 से कम है, यदि यह raster1 चुनता है, अन्यथा raster2 चुनें। NoData
+ डेटा = NoData
तो पहले इन सेटों NoData
को 0 के साथ किसी भी मान को पुनः सेट करें :
import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
ras1_NoNull = Con(IsNull("elevation1"),0, "elevation1") # remove NoData
ras2_NoNull = Con(IsNull("elevation2"),0, "elevation2") # remove NoData
randRaster = CreateRandomRaster(100, 2, Extent(0, 0, 150, 150)) # raster generated between 0 and 1; 100 is seed value
outCon = Con(randRaster < 0.5, ras1_NoNull, ras2_NoNull)
outCon.save("C:/outcon.img") # save raster
संपादित करें: बस एहसास हुआ कि आप NoData
मूल्यों को नहीं जोड़ रहे हैं ताकि टुकड़ा छोड़ दिया जा सके।
Con(IsNull(ras1), 0, ras2)
NoData
? क्या यह सुनिश्चित करना है कि बेतरतीब ढंग से चुनने पर उन्हें चुना नहीं गया है?
मैं बस एक ही सीमा और सेल आकार का एक यादृच्छिक रेखापुंज ( सहायता ) बनाऊंगा । फिर CON ( हेल्प ) का उपयोग करके इसे 1 रैस्टर से मान लेने के लिए सेट करें यदि रैंडमाइज्ड रैस्टर से सेल का मूल्य <128 है (यदि एक यादृच्छिक रैस्टर 0 - 255 होगा) तो 2nd रैस्टर से मान चुनें।
आशा है कि समझ में आता है :)