भारित थिएसेन बहुभुज बनाएं?


17

मेरे पास एक पॉइंट शेपफाइल है और मैं थिएसेन (वोरोनोई) पॉलीगनों को प्रोग्रामेटिक रूप से इस स्क्रिप्ट वाक्य विन्यास का उपयोग करके बनाता हूं:

CreateThiessenPolygons_analysis (in_features, out_feature_class, fields_to_copy) 

हालांकि, प्रत्येक बिंदु एक क्षेत्र (यानी प्रत्येक बहुभुज का पसंदीदा आकार) से संबंधित है और मैं इस क्षेत्र के आधार पर थिएसेन बहुभुजों को भारित करने की कामना करता हूं।

क्या यह संभव है और कैसे?

क्या VBA में कोई प्रासंगिक कोड है?

जवाबों:


15

थियासेन बहुभुज के निर्माण के लिए वजन दूर करने के कई तरीके हैं । उन्हें बनाने में मूल विचार एक मनमाना बिंदु x और दो निश्चित बिंदुओं p और q के बीच की दूरी की तुलना करने पर आधारित है ; आपको यह तय करने की आवश्यकता है कि क्या x , q के मुकाबले p से "निकट" है या नहीं। इस अंत तक - कम से कम वैचारिक रूप से - हम दूरियों को dp = d ( x , p ) और dq = d ( x , q ) मानते हैं । आमतौर पर वेटिंग दो तरह से होती है: पॉइंट को पॉजिटिव न्यूमेरिक वेट wp और wq दिया जा सकता है और डिस्टेंस को खुद ट्रांसफॉर्म किया जा सकता है।

समझ बनाने के लिए, परिवर्तन (जिसे मैं च के रूप में लिखूंगा ) को दूरियों में वृद्धि के रूप में बढ़ाना चाहिए; वह है, f (d ')> f (d) जब भी d'> d> = 0. इस तरह के परिवर्तनों के उदाहरण f (d) = d + 1, f (d) = d ^ 2 (रीली के लॉ ऑफ रिटेल ग्रेविटेशन) हैं ), f (d) = 1 - 1 / d (सभी दूरियां 1 से कम हैं), f (d) = log (d), f (d) = exp (d) -1।

हम तो कहेंगे कि x " p " के बराबर है जब तक कि वास्तव में q से p

f (d ( x , p )) / wp <f (d ( x , q )) / wq।

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

यहाँ सुंदर बात है, और यह कुछ हद तक सार प्रदर्शनी का पूरा बिंदु है: यद्यपि परिणामस्वरूप थिएसेन क्षेत्रों में जटिल, सीमाओं की गणना करना बेहद मुश्किल है, वे ग्रिड-आधारित प्रतिनिधित्व का उपयोग करके गणना करना अपेक्षाकृत आसान है। यहाँ नुस्खा है:

  1. प्रत्येक इनपुट बिंदु p के लिए , इसकी यूक्लिडियन दूरी ग्रिड [d (p)] की गणना करें।

  2. F और वेट लगाने के लिए मैप बीजगणित का उपयोग करें , जिससे प्रत्येक दूरी ग्रिड के रूप में फिर से व्यक्त हो

    [fp] = f ([d (p)]) / wp

    यहाँ f (d) = 100 + d ^ (3/2) का उपयोग करके एक उदाहरण दिया गया है; स्केल 400 बाई 600 है।

    आकृति 1

    जैसे-जैसे f (d) बढ़ता है, मान गहराता जाता है। इस उदाहरण में मुख्य रूप से दूरी केंद्रीय लाल बिंदु के संबंध में है; अन्य चार बिंदुओं को उनकी अलग-अलग दूरी की गणना (नहीं दिखाई गई) मिलती है। डॉट्स के क्षेत्र उनके वजन के अनुपात में हैं, जो 2, 10, 3, 4 और 5 हैं।

  3. इन सभी ग्रिडों की स्थानीय न्यूनतम गणना करें [fp]। इस [f] को बुलाओ। यहाँ एक उदाहरण है।

    चित्र 2

  4. [एफ] की तुलना प्रत्येक [एफपी] से करके, प्रत्येक ग्रिड सेल के लिए पहले पी के पहचानकर्ता को असाइन करें जिसके लिए [एफ]> = [एफपी]। ( उदाहरण के लिए, निम्नतम स्थिति ऑपरेशन के साथ एक चरण में यह किया जा सकता है ।)

    चित्र तीन

    (मुझे संदेह है कि कहीं भी एक एल्गोरिथ्म मौजूद है जो इस भारोत्तोलन समारोह के लिए एक वेक्टर-प्रारूप समाधान की गणना करेगा।)

जाहिर है आप अंक के एक मुट्ठी भर से अधिक है, तो पी आप स्क्रिप्ट इस, और हजारों में उनकी संख्या रन आप शायद computationally अव्यावहारिक होने के रूप में प्रयास का परित्याग कर देगा यदि (हालांकि वहाँ यह खपरैल का छत से गणना में तेजी लाने के तरीके हैं)।

एक अन्य उदाहरण, थिसेन बहुभुजों को एक दीर्घवृत्त पर दिखाते हुए, /gis//a/17377/ पर दिखाई देता है ।


3
+1 मैंने कभी महसूस नहीं किया कि रेखापुंज लेने से यह समस्या कितनी आसान हो जाती है।
किर्क क्यूकेन्डल

Whuber: बहुत परिष्कृत प्रक्रिया! हालांकि, मेरी प्रशंसा में ध्यान केंद्रित करने के लिए, मेरी इनपुट फ़ाइल के प्रत्येक बिंदु एक भूमि पार्सल के अनुमानित सेंटॉइड का प्रतिनिधित्व करता है। मैं एक वेक्टर थिएसेन बहुभुज फ़ाइल के ऊपर उल्लिखित उस स्क्रिप्ट लाइन का उपयोग कर रहा हूं। प्रत्येक बहुभुज को एक स्थान निर्दिष्ट किया जाता है अर्थात सीमाओं की समान दूरी के थिएसेन बहुभुज सिद्धांत के आधार पर आकार। दूसरी ओर, प्रत्येक भूमि परेल का एक पूर्वनिर्धारित आकार होता है जो कि क्षेत्र क्षेत्र में प्रदान किया जाता है; और यह वह कारक है जिसे मैं ध्यान में रखना चाहता हूं ताकि बहुभुज इस कारक के अनुपात में होंगे। कोई विचार कृपया?
डेमेट्रिस

मैं आपकी टिप्पणी को नहीं समझता, डेमेट्रीस। उन्हें लगता है कि आप वास्तव में थिएसेन बहुभुजों के संग्रह के बजाय एक एरिया कार्टोग्राम चाहते हैं। यह समझाने में मदद करेगा कि आप इन बहुभुजों की गणना क्यों कर रहे हैं। वे किस समस्या को हल करने जा रहे हैं? उनकी व्याख्या कैसे होगी?
व्हीलर

Whuber: थिएसेन बहुभुज प्रक्रिया में मेरे प्रत्येक अंक इनपुट एक नए लैंड पार्सल सेट के अनुमानित सेंट्रोइड का प्रतिनिधित्व करते हैं। इस प्रकार, मैं इन बिंदुओं के आधार पर थिएसेन बहुभुज बनाता हूं जो भूमि पार्सल के आकार (एक बिंदु-एक भूमि विवाद) का प्रतिनिधित्व करता है। मैं अपने आनुवंशिक एल्गोरिथ्म को खिलाने के लिए इन बिंदुओं को स्थानांतरित करके यादृच्छिक भूमि पार्सल आकृतियों के कई सेटों का उत्पादन कर सकता हूं। समस्या यह है कि इन उत्पन्न पार्सल आकार (यानी थिएसेन पॉलीगॉन) में एक पूर्वनिर्धारित क्षेत्र होना चाहिए और मुझे आश्चर्य है कि क्या थिएसेन पॉलीगॉन ऑपरेशन का उपयोग करते समय इसे ध्यान में रखना संभव है। मुझे उम्मीद है कि यह समझ में आता है।
डेमेट्रिस

आपका आनुवंशिक एल्गोरिथम क्या करने का प्रयास कर रहा है? यह अभी भी लगता है कि आपको थिएसेन पॉलीगोन भारित करने की आवश्यकता नहीं है: मेरा मानना ​​है कि कोई भी संभव भार मौजूद नहीं है जो पॉलीगॉन को पूर्व निर्धारित क्षेत्रों या यहां तक ​​कि निर्धारित सापेक्ष क्षेत्रों को प्राप्त करने का आश्वासन देगा।
whuber

10

आप जो चाहते हैं, वह एक भारित वोरोनोई आरेख है: http://en.wikipedia.org/wiki/Weighted_Voronoi_diagram जब एक 2d विमान में गुणक भार के साथ किया जाता है तो एक वृत्ताकार डिरिक्लेट टेसेलेशन के रूप में भी जाना जाता है। ऐसा लगता है कि किसी ने इन्हें बनाने के लिए एक आर्कगिस 9 एक्सटेंशन का निर्माण किया है: http://arcscripts.esri.com/details.asp?dbid=15481 यहाँ उपलब्ध उपयोगकर्ता गाइड के साथ http://geography.unt.edu/~pdong-software .htm और डोंग, पी।, 2008 में प्रकाशित एक पत्र। जीआईएस में बिंदु, रेखा और बहुभुज सुविधाओं के लिए गुणा भार वाले वोरोनोई आरेखों का निर्माण और अद्यतन। कंप्यूटर और भू-विज्ञान, खंड 34, अंक 4, पृष्ठ 411-421।

इसके लिए वेक्टर आधारित एल्गोरिथम पर एक हालिया लेख है (मेरा मानना ​​है कि पी डोंग का एल्गोरिथ्म रेखापुंज आधारित है)। http://www.sciencedirect.com/science/article/pii/S0098300411003037 सार कहता है कि c # कोड शामिल है।


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