यह उत्तर कई वर्गों में विभाजित है:
विश्लेषण और समस्या को कम करना , यह दर्शाता है कि "कैन्ड" रूटीन के साथ वांछित बिंदु कैसे खोजना है।
उदाहरण: वर्किंग प्रोटोटाइप , वर्किंग कोड।
उदाहरण , समाधान के उदाहरण दिखाते हुए।
नुकसान , संभावित समस्याओं पर चर्चा और उन्हें कैसे से निपटने के लिए।
ArcGIS कार्यान्वयन , एक कस्टम ArcGIS उपकरण बनाने के बारे में टिप्पणी करता है और जहां आवश्यक रूटीन प्राप्त करना है।
विश्लेषण और समस्या को कम करना
आइए यह देखते हुए शुरू करें कि (पूरी तरह से गोल) गोलाकार मॉडल में हमेशा एक समाधान होगा - वास्तव में, दो समाधान। आधार अंक ए, बी और सी को देखते हुए, प्रत्येक जोड़ी अपने "लंबवत द्विभाजक" को निर्धारित करती है, जो दो दिए गए बिंदुओं से समान बिंदुओं का समूह है। यह द्विभाजक एक भूगणित (महान वृत्त) है। गोलाकार ज्यामिति अण्डाकार है : कोई भी दो भूगणित प्रतिच्छेद (दो विशिष्ट बिंदुओं में)। इस प्रकार, एबी के द्विभाजक और बीसी के द्विभाजक के चौराहे बिंदु हैं - परिभाषा के अनुसार - ए, बी और सी से समतुल्य, जिससे समस्या का समाधान होता है। (नीचे पहला आंकड़ा देखें।)
एक दीर्घवृत्त पर चीजें अधिक जटिल लगती हैं, लेकिन क्योंकि यह गोले का एक छोटा छिद्र है, हम समान व्यवहार की उम्मीद कर सकते हैं। (इसका विश्लेषण हमें बहुत दूर तक ले जाएगा।) एक दीर्घवृत्त पर सटीक दूरी की गणना करने के लिए उपयोग किए जाने वाले जटिल सूत्र (आंतरिक रूप से एक जीआईएस) एक वैचारिक जटिलता नहीं है, हालांकि: समस्या मूल रूप से समान है। यह देखने के लिए कि समस्या वास्तव में कितनी सरल है, आइए इसे कुछ हद तक अमूर्त रूप से बताएं। इस कथन में, "d (U, V)" बिंदु U और V के बीच की सही, पूरी तरह से सटीक दूरी को संदर्भित करता है।
एक दीर्घवृत्त पर A, B, C (लैट-लोन जोड़े के रूप में) तीन बिंदुओं को देखते हुए एक बिंदु X खोजें जिसके लिए (1) d (X, A) = d (X, B) = d (X, C) और ( 2) यह आम दूरी यथासंभव छोटी है।
ये तीनों दूरियां अज्ञात X पर निर्भर करती हैं । इस प्रकार अंतर u (X) = d (X, A) - d (X, B) और v (X) = d (X, B) - d (X, C) X के वास्तविक-मूल्यवान कार्य हैं। फिर, कुछ हद तक, हम इन मतभेदों को एक आदेशित जोड़ी में इकट्ठा कर सकते हैं। हम X के लिए निर्देशांक के रूप में (lat, lon) का भी उपयोग करेंगे, जिससे हमें इसे एक ऑर्डर की गई जोड़ी के रूप में विचार करने की अनुमति मिलती है, X = (phi, lambda)। इस सेटअप में, फ़ंक्शन
एफ (फी, लंबा) = (यू (एक्स), वी (एक्स))
दो-आयामी अंतरिक्ष में मान लेने वाले दो-आयामी अंतरिक्ष के एक हिस्से से एक कार्य है और हमारी समस्या कम हो जाती है
सभी संभव (phi, lambda) खोजें, जिसके लिए F (phi, lambda) = (0,0) है।
यहाँ वह जगह है जहाँ अमूर्त भुगतान करता है: इस को हल करने के लिए बहुत सारे महान सॉफ्टवेयर मौजूद हैं (विशुद्ध रूप से संख्यात्मक बहुआयामी मूल-खोज समस्या)। जिस तरह से यह काम करता है वह यह है कि आप एफ की गणना करने के लिए एक रूटीन लिखते हैं , फिर आप सॉफ्टवेयर के साथ-साथ इसके इनपुट पर प्रतिबंध के बारे में किसी भी जानकारी के साथ इसे पास करते हैं ( phi -90 और 90 डिग्री के बीच झूठ और लैम्ब्डा -180 और 180 के बीच झूठ होना चाहिए डिग्री)। यह एक सेकंड के एक अंश के लिए दूर हो जाता है और रिटर्न (आम तौर पर) का केवल एक मान ( फी , लैम्ब्डा ) होता है, अगर यह एक मिल सकता है।
संभाल करने के लिए विवरण हैं, क्योंकि इसमें एक कला है: एफ "व्यवहार" के आधार पर चुनने के लिए विभिन्न समाधान विधियां हैं ; यह सॉफ्टवेयर को उसकी खोज के लिए एक उचित प्रारंभिक बिंदु देकर "स्टीयर" करने में मदद करता है (यह एक तरीका है जिससे हम किसी अन्य के बजाय निकटतम समाधान प्राप्त कर सकते हैं); और आपको आमतौर पर यह निर्दिष्ट करने की आवश्यकता होती है कि आप कितना सटीक समाधान चाहते हैं (इसलिए यह पता है कि खोज को कब रोकना है)। (अधिक जानकारी के लिए जीआईएस विश्लेषकों को ऐसे विवरणों के बारे में जानने की आवश्यकता है, जो जीआईएस समस्याओं में बहुत ऊपर आते हैं, कृपया सिफारिश करें कि विषयों को भू-स्थानिक प्रौद्योगिकी पाठ्यक्रम के लिए एक कंप्यूटर विज्ञान में शामिल किया जाए और अंत में "मिसटेलनी" अनुभाग देखें। )
चित्रण: एक कार्य प्रोटोटाइप
विश्लेषण से पता चलता है कि हमें दो चीजों को प्रोग्राम करने की आवश्यकता है: समाधान का एक कच्चा प्रारंभिक अनुमान और एफ की गणना ।
प्रारंभिक अनुमान तीन आधार बिंदुओं के "गोलाकार औसत" द्वारा किया जा सकता है। यह भूस्थैतिक कार्टेशियन (x, y, z) निर्देशांक में उनका प्रतिनिधित्व करके, उन निर्देशांक के औसत से, और उस औसत को गोले में वापस लाकर और अक्षांश और देशांतर में पुनः व्यक्त करके प्राप्त किया जाता है। गोले का आकार सारहीन है और गणना इस प्रकार सीधी की जाती है: क्योंकि यह सिर्फ एक प्रारंभिक बिंदु है, हमें दीर्घवृत्त गणना की आवश्यकता नहीं है।
इस कार्यशील प्रोटोटाइप के लिए मैंने Mathematica 8 का उपयोग किया ।
sphericalMean[points_] := Module[{sToC, cToS, cMean},
sToC[{f_, l_}] := {Cos[f] Cos[l], Cos[f] Sin[l], Sin[f]};
cToS[{x_, y_, z_}] := {ArcTan[x, y], ArcTan[Norm[{x, y}], z]};
cMean = Mean[sToC /@ (points Degree)];
If[Norm[Most@cMean] < 10^(-8), Mean[points], cToS[cMean]] / Degree
]
(अंतिम If
स्थिति परीक्षण करती है कि क्या औसत स्पष्ट रूप से एक देशांतर को इंगित करने में विफल हो सकता है; यदि हां, तो यह अक्षांश और इसके इनपुट के अनुदैर्ध्य के सीधे अंकगणित माध्य पर गिरता है - शायद एक बढ़िया विकल्प नहीं है, लेकिन कम से कम एक वैध है। कार्यान्वयन मार्गदर्शन के लिए इस कोड का उपयोग करने वालों के लिए, ध्यान दें कि गणितज्ञों के तर्क ArcTan
अधिकांश अन्य कार्यान्वयनों की तुलना में उलटे हैं: इसका पहला तर्क x-निर्देशांक है, इसका दूसरा भाग y-निर्देशांक है, और यह वेक्टर द्वारा बनाए गए कोण को लौटाता है एक्स, वाई)।)
जहाँ तक दूसरे भाग में जाता है, क्योंकि गणितज्ञ - अरकगिस और लगभग सभी अन्य जीआईएस - में दीर्घवृत्त पर सटीक दूरी की गणना करने के लिए कोड है, लिखने के लिए लगभग कुछ भी नहीं है। हम रूट-रूटिंग रूटीन कहते हैं:
tri[a_, b_, c_] := Block[{d = sphericalMean[{a, b, c}], sol, f, q},
sol = FindRoot[{GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, a] ==
GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, b] ==
GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, c]},
{{f, d[[1]]}, {q, d[[2]]}},
MaxIterations -> 1000, AccuracyGoal -> Infinity, PrecisionGoal -> 8];
{Mod[f, 180, -90], Mod[q, 360, -180]} /. sol
];
इस कार्यान्वयन का सबसे उल्लेखनीय पहलू यह है कि यह कैसे क्रमशः 180 और 360 डिग्री की गणना करके अक्षांश ( f
) और देशांतर ( q
) को कम करने के लिए विवश करता है। यह समस्या (जो अक्सर जटिलताएं पैदा करता है) को बाधित करने से बचता है। MaxIterations
इस कोड को बनाने के लिए कंट्रोल पैरामीटर आदि को ट्वीक किया जाता है जो इसे सबसे बड़ी संभव सटीकता प्रदान करता है।
इसे कार्रवाई में देखने के लिए, आइए इसे संबंधित प्रश्न में दिए गए तीन आधार बिंदुओं पर लागू करें :
sol = tri @@ (bases = {{-6.28530175, 106.9004975375}, {-6.28955287, 106.89573839}, {-6.28388865789474, 106.908087643421}})
{-6.29692, 106.907}
इस समाधान और तीन बिंदुओं के बीच की गणना दूरी है
{1450.23206979, 1450.23206979, 1450.23206978}
(ये मीटर हैं)। वे ग्यारहवें महत्वपूर्ण अंक के माध्यम से सहमत होते हैं (जो कि बहुत सटीक है, वास्तव में, चूंकि दूरी शायद ही कभी मिलीमीटर या तो बेहतर से सटीक होती है)। यहां इन तीन बिंदुओं (काले), उनके तीन पारस्परिक द्विभाजकों और समाधान (लाल) की एक तस्वीर दी गई है:
उदाहरण
इस कार्यान्वयन का परीक्षण करने के लिए और यह समझने के लिए कि समस्या कैसे व्यवहार करती है, की एक बेहतर समझ प्राप्त करें, यहां तीन व्यापक रूप से दूरी के आधार बिंदुओं के लिए दूरी में रूट माध्य वर्ग विसंगति का एक समोच्च साजिश है। (RMS विसंगति सभी तीन अंतर d (X, A) -d (X, B), d (X, B) -d (X, C) और d (X, C) -d (X) की गणना करके प्राप्त की जाती है , ए), उनके वर्गों का औसत, और वर्गमूल लेना। यह शून्य के बराबर होता है जब एक्स समस्या को हल करता है और अन्यथा एक्स एक समाधान से दूर हो जाता है, और इसलिए मापता है कि हम किसी भी स्थान पर समाधान के कितने "करीब" हैं। )
बेस प्लेट (60, -120), (10, -40), और (45,10) इस प्लेट कार्निशन प्रक्षेपण में लाल रंग में दिखाए गए हैं; समाधान (49.2644488, -49.9052992) - जिसकी गणना करने के लिए 0.03 सेकंड की आवश्यकता है - पीले रंग में है। इसकी आरएमएस विसंगति तीन नैनोमीटर से कम है , सभी प्रासंगिक दूरी हजारों किलोमीटर होने के बावजूद। अंधेरे क्षेत्र RMS के छोटे मान दिखाते हैं और प्रकाश क्षेत्र उच्च मान दिखाते हैं।
यह मानचित्र स्पष्ट रूप से एक और समाधान दर्शाता है (-49.2018206, 130.0297177) (पहले समाधान के विपरीत डायनामिक रूप से प्रारंभिक खोज मूल्य सेट करके दो नैनोमीटर के आरएमएस की गणना)।
नुकसान
संख्यात्मक अस्थिरता
जब बेस पॉइंट लगभग एक साथ टकराते हैं और एक साथ बंद होते हैं, तो सभी समाधान लगभग आधी दुनिया से दूर होंगे और सटीक रूप से पिन करने के लिए बेहद मुश्किल होंगे। कारण यह है कि दुनिया भर में एक स्थान में छोटे बदलाव - इसे आधार बिंदुओं से दूर या दूर ले जाना - दूरियों के अंतर में केवल अविश्वसनीय रूप से छोटे बदलावों को प्रेरित करेगा। परिणाम को पिन करने के लिए जियोडैटिक दूरियों की सामान्य गणना में निर्मित पर्याप्त सटीकता और सटीकता नहीं है।
उदाहरण के लिए, बेस पॉइंट्स (45.001, 0), (45, 0), और (44.999,0) के साथ शुरू करना, जो प्रत्येक जोड़ी के बीच केवल 111 मीटर की दूरी पर प्राइम मेरिडियन के साथ अलग हो जाते हैं, tri
समाधान (11.8213, 77.745) प्राप्त करता है )। इसके आधार बिंदुओं से दूरी 8,127,964.998 77 है; 8,127,964.998 41; और 8,127,964.998 65 मीटर, क्रमशः। वे निकटतम मिलीमीटर के लिए सहमत हैं! मुझे यकीन नहीं है कि यह परिणाम कितना सही हो सकता है, लेकिन कम से कम आश्चर्यचकित नहीं होगा अगर अन्य कार्यान्वयन इस एक से दूर के स्थानों को वापस कर देते हैं, जो तीन दूरी की लगभग समान समानता दिखा रहा है।
अभिकलन का समय
ये गणना, क्योंकि वे जटिल दूरी की गणनाओं का उपयोग करके काफी खोज शामिल करते हैं, तेज नहीं होते हैं, आमतौर पर एक दूसरे के ध्यान देने योग्य अंश की आवश्यकता होती है। वास्तविक समय के अनुप्रयोगों के बारे में पता होना चाहिए।
ArcGIS कार्यान्वयन
पाइथन आर्कजीआईएस (संस्करण 9 के साथ शुरुआत) के लिए पसंदीदा स्क्रिप्टिंग वातावरण है। Scipy.optimize पैकेज बहुविविध rootfinder है root
जो क्या करना चाहिए FindRoot
में करता है मेथेमेटिका कोड। बेशक ArcGIS ही सटीक दीर्घवृत्ताभ दूरी गणना प्रदान करता है। बाकी, फिर, सभी कार्यान्वयन विवरण हैं: तय करें कि आधार बिंदु निर्देशांक कैसे प्राप्त किया जाएगा (एक परत से? उपयोगकर्ता द्वारा टाइप किया गया; एक पाठ फ़ाइल से; माउस से?) और आउटपुट कैसे प्रस्तुत किया जाएगा (समन्वय के रूप में) स्क्रीन पर प्रदर्शित किया जाता है? एक ग्राफिक बिंदु के रूप में? एक परत में एक नई बिंदु वस्तु के रूप में?), उस इंटरफ़ेस को लिखें, यहां दिखाया गया मैथमेटिका कोड पोर्ट करें (सीधा), और आप सभी सेट हो जाएंगे।