वेक्टर बिंदु के आधार पर निकटतम रास्टर सेल मान ज्ञात करना?


9

आर्कजीआईएस में मेरी दो परतें हैं: एक सदिश बिंदु है और दूसरी एक रेखीय परत है। मैं रेखापुंज डेटा ग्रिड के मूल्य को वेक्टर बिंदु पर जोड़ना चाहता हूं। समस्या यह है कि वेक्टर बिंदु मूल्य के साथ किसी भी मौजूदा रेखापुंज ग्रिड से दूर है, इसलिए कमांड "नमूना" उन वेक्टर बिंदु के लिए कोई मूल्य नहीं लौटाता है।

तो मेरा सवाल यह है: मैं एक वेक्टर बिंदु दिए गए निकटतम रास्टर सेल को कैसे खोज सकता हूं और सेल से मान निकाल सकता हूं?

वास्तव में दो चीजें हैं जो मुझे करने की आवश्यकता है:

  1. एक रेंजर के भीतर आउटलाइनर को पहचानें (आमतौर पर मेरे मौजूदा रैस्टर से 1-2 सेल दूर)
  2. यदि वे एक सीमा में हैं, तो निकटतम रास्टर से उन्हें मान प्रदान करें

संपादित: मेरे पास लगभग 3000 सदिश बिंदु हैं और मेरी समस्या यह है: यहां छवि विवरण दर्ज करें

मुझे सदिश बिंदुओं के आधार पर रेखापुंज मूल्य को जोड़ना होगा। मैंने टूल "नमूना" का उपयोग किया और यह अधिकांश बिंदुओं के लिए अच्छी तरह से काम करता है।

हालांकि, इस तरह की स्थिति है यहां छवि विवरण दर्ज करें

सही बिंदु को रेखापुंज ("नमूना" कार्यों) से मान मिल सकता है लेकिन बाएं बिंदु संरेखण मुद्दों के कारण नहीं हो सकता है।

बहुभुज के लिए रेखापुंज काम नहीं कर रहा है क्योंकि मुझे त्रुटि संदेश मिलता है कि मैं उन्हें वेक्टर में नहीं बदल सकता क्योंकि वे डोमेन से बाहर हैं। इसके अलावा मेरे पास इस तरह के बिंदु हैंयहां छवि विवरण दर्ज करें

उन ऊपरी बिंदुओं को कोई मूल्य नहीं मिलना चाहिए क्योंकि वे रेखापुंज से बहुत दूर हैं।

मैंने सोचा था कि कुछ लोग काम करेंगे:

चरण 1. पहले "नमूना" करें

चरण 2. "नमूना" संचालन के बाद शून्य मान का चयन करें

चरण 3. शून्य बिंदुओं के आधार पर बफर ज़ोन (1 दशमलव डिग्री के भीतर) का निर्माण करें

चरण 4. आंचलिक आँकड़ों का उपयोग करें ?? ? या बफर में सभी रेखापुंज कोशिकाओं के माध्यम से पाश करने के लिए अन्य उपकरण, निकटतम को ढूंढें, इसके मूल्य को निकालें और इसे वेक्टर बिंदु में डालें।

मैं चरण 4 पर अटका हुआ हूं। मुझे नहीं पता कि कौन सा उपकरण आर्कएसडीके में मैं इस फ़ंक्शन को प्राप्त करने के लिए उपयोग कर सकता हूं।

या फिर ... क्या आपके पास इससे निपटने के लिए बेहतर विचार है?

मेरे पास इस तरह के 20 रेखापुंज परतें हैं और मैं इसे स्वचालित रूप से (मॉडल बिल्डर और आर्कोबजेक्ट का उपयोग करके) बनाना चाहूंगा।


@ वाउचर: आपकी विधि बहुत चालाक लगती है। मेरा सवाल यह है कि मैं वैश्विक स्तर पर डेटा को संभाल रहा हूं और मैं आउटलाइनिंग रैस्टर के लिए x0 और X1 को कैसे निर्धारित कर सकता हूं?
देखा

प्रोजेक्ट में जोड़ने के बाद उसके गुणों का निरीक्षण करें।
whuber

1
आंचलिक आँकड़े एक मृत अंत है। आपके संपादन के आधार पर, एक सरल प्रत्यक्ष समाधान है: अपनी सीमा के चारों ओर रेखापुंज का विस्तार करें और विस्तारित रेखापुंज का नमूना लें। ऐसा करने के कई तरीके हैं, लेकिन उन सभी को रेखापुंज गणनाओं के साथ थोड़ी सुविधा की आवश्यकता होती है। सबसे सरल में से एक है विश्लेषण सीमा को बढ़ाना, एक फोकल माध्य की गणना करना और ('con' का उपयोग करके) अपने मूल्यों को NoData सीमा क्षेत्र में चिपकाना। यह प्रत्येक ऑफ-रास्टर नमूना स्थान के लिए पास के रास्टर मूल्यों का एक साधन प्रदान करता है।
whuber

@whuber एक और समस्या यह है कि मुझे नहीं पता कि आउटलाइनर कहां हैं। इसलिए मेरी प्रक्रिया में वास्तव में 2 प्रक्रियाएं हैं: आउटलाइनरों की पहचान करें और उन्हें मान असाइन करें।
देखा

"आउटलाइनर" क्या है? यदि यह एक बिंदु है जो एक रेखापुंज मूल्य द्वारा कवर नहीं किया जाता है, तो आप मदद नहीं कर सकते, लेकिन उन्हें ढूंढ सकते हैं: ये ऐसे बिंदु होंगे जो Sampleउपकरण को लागू करते समय किसी भी मूल्य को प्राप्त नहीं करते हैं ।
whuber

जवाबों:


8

एक रेखापुंज रूपरेखा मूल (बाईं ओर) (x0, y0), और ऊपरी दाहिनी ओर (X1, y1) होने के कारण, मूल द्वारा बाईं ओर निचले हिस्से में बंधी एक आयत पर कब्जा कर लेती है: ये ऐसे गुण हैं जो आसानी से किसी भी रेखापुंज की खोज कर सकते हैं। आप इस जानकारी का उपयोग रेखापुंज सीमा पर निकटतम बिंदु पर रास्टर की सीमा के बाहर किसी भी बिंदु को स्थानांतरित करने और नए स्थानों पर रेखापुंज मान निकालने के लिए कर सकते हैं।

इस तरह के कार्यों को अक्सर कम आयामों पर विचार करके आसानी से काम किया जाता है । एक आयामी रेखापुंज की सीमा x0 से X1> x0, पारंपरिक रूप से लिखे [x0, X1] से संख्याओं का एक अंतराल है। मान लीजिए कि आप किसी दिए गए नंबर x के लिए इस अंतराल में निकटतम बिंदु ढूंढना चाहते हैं। तीन मामले हैं: x <x0 (x बाईं ओर है), x0 <= x <= X1 (x अंतराल में है), और X1 <x (x दाईं ओर है)। स्पष्ट रूप से निकटतम बिंदु क्रमशः x0, x और X1 हैं। इस परिणाम का एक सूत्र है

x -> मिनट (अधिकतम (x, x0), X1),

जैसा कि आप तीनों मामलों में से प्रत्येक पर अलग-अलग विचार करके देख सकते हैं।

क्योंकि एक रेखापुंज की सीमा दो अंतरालों का कार्टेशियन उत्पाद है, [x0, X1] * [y0, y1], एक ही सूत्र दो आयामों में काम करता है। बस इसे प्रत्येक अंतराल पर लागू करें। इस प्रकार प्रक्षेपित बिंदु के निर्देशांक की गणना (फील्ड कैलकुलेटर में, कहो) के रूप में की जा सकती है

(x, y) -> (न्यूनतम (x, x0), X1), न्यूनतम (अधिकतम (y, y0), y1)।

यहाँ यह सूत्र है कि 100 बिंदुओं को बेतरतीब ढंग से ग्रिड के दायरे में रखा गया है:

आकृति

धराशायी रेखाएं नेत्रहीन रूप से उन स्थानों पर हद से बाहर इंगित करती हैं जहां उन्हें स्थानांतरित किया जाएगा।

इन गणना किए गए निर्देशांक से एक बिंदु परत बनाएं और Sampleरेखीय मान निकालने के लिए उपकरण लागू करें । परिणाम मूल बिंदु परत पर वापस शामिल हों।

एक व्यावहारिक मामले के रूप में , फ्लोटिंग पॉइंट राउंडऑफ़ के साथ समस्याओं से बचने के लिए जो नए बिंदुओं को ग्रिड की सीमा के भीतर झूठ बोलने से रोक सकते हैं, यह x0 और y0 को वास्तविक मूल की तुलना में थोड़ा बड़ा बनाने के लिए बुद्धिमान होगा (आप उन्हें आधा सेलिज़ेट जोड़ सकते हैं) और, इसी तरह, X1 और y1 को थोड़ा छोटा करें।

सारांश में , वर्कफ़्लो में मूल बिंदु परत की तालिका में दो फ़ील्ड (नए निर्देशांक) की गणना होती है, उन नए निर्देशांक से एक बिंदु घटना परत बनाते हैं, Sampleउपकरण चलाते हैं , और डेटाबेस में शामिल होते हैं (एक स्थानिक जोड़ नहीं)।


जब आपके पास रेखापुंज में कोशिकाएं होने की तुलना में कई अधिक वेक्टर बिंदु होते हैं , तो आपको @celenius द्वारा दिए गए समाधान को वरीयता देना चाहिए (जो रास्टर को बिंदुओं में परिवर्तित करने और एक स्थानिक जुड़ाव का उपयोग करने का प्रस्ताव करता है)। आम तौर पर, हालांकि, आपदाओं में बहुत सारी कोशिकाएं होती हैं - लाखों से अरबों - और अंकों में रूपांतरण इतना समय लेने वाला और डिस्क-उपभोग करने वाला होता है कि इसे सावधानी के साथ संपर्क किया जाना चाहिए।

वैकल्पिक रूप से, आप केवल इसकी सीमा के साथ मानों के साथ पूर्णांक ग्रिड बनाने के लिए रास्टर गणना का उपयोग करके सेलेनियस के समाधान में तेजी ला सकते हैं । परिवर्तित कि एक बिंदु परत को त्वरित और आसान है क्योंकि यह कुछ बिंदुओं होगा। चलो इसे "सीमा परत" कहते हैं। सीमा परत बिंदुओं पर ग्रिड का नमूना लें, जिससे सीमा परत की विशेषता तालिका में ग्रिड मानों की प्रतिलिपि बनाई जा सके। Sampleमूल बिंदु परत के साथ चलने के बाद , उन सभी बिंदुओं को हटा दें जहां एक नमूना सफलतापूर्वक प्राप्त किया गया था। नमूना प्रक्रिया को पूरा करने के लिए बचे हुए बिंदुओं पर स्थानिक रूप से सीमा परत मिलाएं।

( केवल अपनी सीमा के साथ मानों के साथ ग्रिड बनाने का एक तरीका फोकल पड़ोस ऑपरेशन लागू करना है जो सीमा के साथ विफल होता है: उदाहरणों में ढलान, पहाड़ियों को ढूंढना शामिल है, 3 x 3 पड़ोस फोकल आँकड़े। यह एक-सेल के साथ एक ग्रिड बनाता है- इसके किनारे के आसपास NoData की मोटी रिंग। NoData कोशिकाओं का पता लगाने और NoData और डेटा कोशिकाओं के बीच कनवर्ट करने के लिए IsNull और SetNull का उपयोग करना । सीमा के अलावा NoData मानों से भरा ग्रिड का उत्पादन करता है ।)


सारांश में, वर्कफ़्लो में मूल बिंदु परत की तालिका में दो फ़ील्ड (नए निर्देशांक) की गणना करना, उन नए निर्देशांक से एक बिंदु घटना परत बनाना, नमूना उपकरण चलाना और डेटाबेस जॉइन करना (एक स्थानिक जुड़ाव नहीं) शामिल है। क्या आप यह बता सकते हैं कि यह कैसे करना है? (आप मेरी समस्या के लिए मेरी तस्वीरें देख सकते हैं)। धन्यवाद!
देखा

मेरे पास लगभग 15% अंक हैं यह समस्या है। आप प्रत्येक बिंदु के लिए x0 और X1 को कैसे निर्धारित कर सकते हैं?
देखा

1
@ के लिए x0, y0, X1, y1 ग्रिड के लिए हैं। बिंदु निर्देशांक (x, y) की गणना फ़ील्ड कैलकुलेटर में की जा सकती है, जैसा कि आर्कगिस मदद या इस साइट पर कई थ्रेड्स में वर्णित है। एक XY बिंदु परत और डेटाबेस जॉइन करने के लिए मेनू आइटम हैं: ये मानक, बुनियादी संचालन हैं।
whuber

4

आप रेखापुंज को बिंदुओं ( रेफ ) में परिवर्तित कर सकते हैं , और फिर बिंदुओं पर (रास्टर्स से) बिंदु पर एक स्थानिक जुड़ाव कर सकते हैं।

(मुझे अभी पता चला है कि अंक यहाँ कल से स्थानिक रूप से जुड़ सकते हैं )


1
एक चतुर दृष्टिकोण के लिए +1। बड़े ग्रिड के लिए, जहां यह अव्यवहारिक हो जाता है, केवल रैस्टर की सीमा कोशिकाओं को बिंदुओं में परिवर्तित करें । (मैं कैसे मेरा जवाब के अंत में वर्णन करते हैं।)
whuber

मैं एक रेखापुंज परत की कोशिकाओं के हजारों है और मैं 20 परतों की तरह समय लेने वाली हैं ... इसलिए वेक्टर अंक में उन लोगों के मोड़ ...
देखा

इसके अलावा, जब मैं बहुभुज के लिए रेखापुंज करने की कोशिश करता हूं, तो मुझे त्रुटि संदेश मिलता है ERROR 000864 इनपुट रेखापुंज के रूप में: इनपुट परिभाषित डोमेन के भीतर नहीं है। ERROR 000863: अमान्य GP डेटा प्रकार
देखा

क्या आपको एक त्रुटि मिलती है जब रेखापुंज को बिंदुओं में परिवर्तित करते हैं?
djq

@celenius यह काम करता है लेकिन इसमें लंबा समय लगा।
देखा

1

आप रैस्टर को बहुभुज टूल का उपयोग करके रैस्टर लेयर को पॉलीगॉन में बदल सकते हैं और या तो स्पेसियल ज्वाइन चला सकते हैं (पॉइंट लेयर पर राइट क्लिक करें और ज्वाइन एंड रिलेट्स चुनें - ज्वाइन करें, पहली ड्रॉप डाउन पर स्पेसियल जॉइन ऑप्शन चुनें और सबसे पास चुनें। रीडियो बटन पर विकल्प), या नियर टूल का उपयोग करें।


उपयुक्त रास्टर मान निकालने के लिए आप स्थानिक जुड़ाव के परिणाम का उपयोग कैसे करते हैं?
whuber

@whuber, जब आप "इसके सबसे करीब होते हैं" का चयन करते हैं, तो डायलॉग डायलॉग के भीतर स्थानिक जुड़ाव निकटतम बहुभुज सुविधा का चयन करता है (परिणाम से रेखापुंज से बहुभुज उपकरण) और बिंदु विशेषता में इस विशेषता जानकारी को जोड़ता है। यह वही है जो आप पूछ रहे थे? मेरे प्रारंभिक उत्तर को उनके संपादन से पहले पोस्ट किया गया था। मैं अनुमान लगा रहा हूँ कि सीन की रेखापुंज बहुभुज में बदलने के लिए बहुत बड़ी हो सकती है?
कलाकृति २१

विचार निकटतम रास्टर को खोजने के लिए नहीं है। वास्तव में, जो कुछ भी चाहता है वह एक रास्टर के मूल्यों को उसकी मूल सीमा से बाहर निकालने का एक तरीका है। प्रश्न निकटतम पड़ोसी दृष्टिकोण का प्रस्ताव करता है: किसी भी नजदीकी बिंदु पर, रेखापुंज पर नहीं, निकटतम सेल को रेखापुंज में खोजें और उस सेल के मान का उपयोग करें।
whuber

अपनी पिछली टिप्पणी को फिर से पढ़ने पर, ऐसा लगता है कि आप रेखापुंज को "बहुभुज" में नहीं बल्कि प्रत्येक कोशिका (या कोशिकाओं के सन्निहित सेट) के लिए एक बहुभुज की परत में बदल सकते हैं । यदि ऐसा है, तो यह बहुत छोटे चूहों के साथ सफल हो सकता है, लेकिन आप इसे क्यों प्रस्तावित करते हैं - जो एक जटिल, महंगा ऑपरेशन है (और केवल पूर्णांक ग्रिड के लिए काम करता है) - इसके बजाय समान लेकिन अधिक कुशल समाधान @celenius पहले की पेशकश की? आपके समाधान के क्या फायदे हैं?
whuber

@ सफेद, बहुभुज परत सही है। हां, सेलेनियस विधि से स्मृति कम खर्च होती है।
कलाकृति 21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.