बेतरतीब ढंग से कई अतिव्यापी चूहों से सेल मूल्य का चयन करके रेखापुंज बनाना?


10

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

मैं ओवरलैपिंग सेल के मानों से यादृच्छिक रूप से हमेशा एक को चुनने पर एक से अधिक लकीरों को कैसे जोड़ सकता हूं?

मेरे पास एक ऐसी छवि है जो इसे बेहतर बता सकती है:

उदाहरण

जवाबों:


7

इस तरह की समस्याओं के लिए पिक बनाया गया था। इसे "कोन" के "स्विच" (या "केस") संस्करण के रूप में सोचें, जो "अगर ... और" का नक्शा बीजगणित कार्यान्वयन है।

उदाहरण के लिए, 3 ओवरलैपिंग रस्टर्स हैं, तो (पायथन) सिंटैक्स जैसा दिखेगा

inPositionRaster = 1 + int(3 * CreateRandomRaster())
Pick(inPositionRaster, [inRas01, inRas02, inRas03])

ध्यान दें कि pick1 पर अनुक्रमण शुरू होता है, 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): कोई भी नहीं होना चाहिए।

हालाँकि यह चल रहा उदाहरण केवल चयन करने के लिए तीन ग्रिड का उपयोग करता है, मैंने इसे इस तरह से लिखा है कि किसी भी संख्या में ग्रिड के लिए आसानी से सामान्यीकृत होता है। बहुत सारे ग्रिड के साथ, एक स्क्रिप्ट लिखना (बार-बार के संचालन पर लूप करना) अमूल्य होगा।


क्या आप जानते हैं कि मैं गणना (रास्टर कैलकुलेटर और पायथन के साथ) से NoData मूल्यों को कैसे अनदेखा कर सकता हूं?
सैम

सैम, "अनदेखा" कैसे, ठीक है? मेरा मानना ​​है कि डिफ़ॉल्ट व्यवहार NoData का उत्पादन करने के लिए है, जहाँ भी एक या एक से अधिक इनपुट pickरेखापुंज हैं NoData (लेकिन मैं इस मामले में पूरी तरह से सुनिश्चित नहीं हूं : यदि InPositionRaster और चयनित रेखापुंज दोनों में एक सेल में मान्य मान हैं, तो परिणाम संभव है उस कक्ष के लिए चयनित रेखापुंज का मान होना चाहिए, चाहे किसी भी अन्य आपदाओं में कोई भी हो)। आप किस वैकल्पिक व्यवहार के बारे में सोच रहे हैं?
whuber

मुझे इसे केवल संपूर्ण संख्या मानों से चुनने की आवश्यकता है। मान लीजिए कि मेरे पास तीन विपत्तियाँ हैं। एक सेल के लिए, उनके मान इस प्रकार हैं: 4,5, NoData। मैं चाहता हूं कि आउट सेलर या तो उस सेल में 4 या 5 हो, लेकिन कभी भी NoData नहीं।
सैम

मुझे यह काम करने के लिए 1 + Int (n * CreateRandomRaster ()) प्राप्त करने में समस्या हो रही है।
सैम

"परेशानी" किस अर्थ में? कृपया विशिष्ट रहें!
whuber

4

अजगर और आर्कजीआईएस 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मूल्यों को नहीं जोड़ रहे हैं ताकि टुकड़ा छोड़ दिया जा सके।


मैं अभी भी अपने पायथन कौशल पर काम कर रहा हूं। क्या रैस्टर कैलकुलेटर में इसे दर्ज करने का कोई तरीका है जो प्रक्रिया से NoData मान को भी बाहर कर देगा? मेरे पास 10 रिस्तेदार हैं और कुछ के पास NoData है जहां दूसरों के मूल्य हैं।
सैम

मुझे लगता है कि आप रेखापुंज कैलकुलेटर में कुछ इस तरह का उपयोग कर स्थितियां बना सकते हैंCon(IsNull(ras1), 0, ras2)
djq

दुर्भाग्य से, यह वास्तव में NoData मूल्यों को बाहर नहीं करता है: यह सिर्फ उन्हें शून्य के साथ बदल देता है। कुछ मामलों में जो उचित हो सकता है, लेकिन शायद यहाँ नहीं!
whuber

हम्म, अच्छा बिंदु @whuber। तो बाहर करने का क्या मतलब है NoData? क्या यह सुनिश्चित करना है कि बेतरतीब ढंग से चुनने पर उन्हें चुना नहीं गया है?
djq

इस तरह मैंने इसकी व्याख्या की है (इस धागे में मेरा संपादित उत्तर देखें), लेकिन यह एक अच्छा प्रश्न है। इस फैशन में एनडी मूल्यों की अनदेखी करने से शेष ग्रिडों को अधिक संभावना के साथ चुना जाता है, जो एक अवांछनीय दुष्प्रभाव हो सकता है। यह सब गणना के उद्देश्य पर निर्भर करता है।
whuber

1

मैं बस एक ही सीमा और सेल आकार का एक यादृच्छिक रेखापुंज ( सहायता ) बनाऊंगा । फिर CON ( हेल्प ) का उपयोग करके इसे 1 रैस्टर से मान लेने के लिए सेट करें यदि रैंडमाइज्ड रैस्टर से सेल का मूल्य <128 है (यदि एक यादृच्छिक रैस्टर 0 - 255 होगा) तो 2nd रैस्टर से मान चुनें।

आशा है कि समझ में आता है :)


क्या आप जानते हैं कि केवल मूल्यों वाले चूहों से कैसे चयन करें? उदाहरण के लिए मेरे चित्र में चार 2 और दो 3 के हैं जो कि NoData के साथ ओवरलैप हैं। मैं यह सुनिश्चित करना चाहता हूं कि यह केवल उन चूहों से एक सेल में मूल्यों के साथ चयन करता है, न कि नोडाटा।
सैम

जवाब न देने के लिए क्षमा करें। क्या आप अभी भी NoData मुद्दे से जूझ रहे हैं?
फॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.