विन्सेन्टी और महान-सर्कल दूरी गणनाओं के बीच अंतर?


16

पायथन के जियोपी पैकेज में दो दूरी माप तकनीक शामिल हैं: ग्रेट सर्कल और विन्सेंटी के सूत्र

>>> from geopy.distance import great_circle
>>> from geopy.distance import vincenty
>>> p1 = (31.8300167,35.0662833) # (lat, lon) - https://goo.gl/maps/TQwDd
>>> p2 = (31.8300000,35.0708167) # (lat, lon) - https://goo.gl/maps/lHrrg
>>> vincenty(p1, p2).meters
429.16765838976664
>>> great_circle(p3, p4).meters
428.4088367903001

अंतर क्या है? किस दूरी माप को प्राथमिकता दी जाती है?

जवाबों:


18

विकिपीडिया के अनुसार, विन्सेन्टी का सूत्र धीमा है लेकिन अधिक सटीक है :

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

सटीकता अंतर ~0.17%इजरायल में 428 मीटर की दूरी पर है। मैंने एक त्वरित और गंदा गति परीक्षण किया है:

<class 'geopy.distance.vincenty'>       : Total 0:00:04.125913, (0:00:00.000041 per calculation)
<class 'geopy.distance.great_circle'>   : Total 0:00:02.467479, (0:00:00.000024 per calculation)

कोड:

import datetime
from geopy.distance import great_circle
from geopy.distance import vincenty
p1 = (31.8300167,35.0662833)
p2 = (31.83,35.0708167)

NUM_TESTS = 100000
for strategy in vincenty, great_circle:
    before = datetime.datetime.now()
    for i in range(NUM_TESTS):
        d=strategy(p1, p2).meters
    after = datetime.datetime.now()
    duration = after-before
    print "%-40s: Total %s, (%s per calculation)" % (strategy, duration, duration/NUM_TESTS)

निष्कर्ष निकालने के लिए: विन्सेन्टी का सूत्र महान-चक्र की तुलना में गणना के समय को दोगुना करता है, और परीक्षण किए गए बिंदु पर इसकी सटीकता ~ ~ 0.17% है।

चूंकि गणना का समय नगण्य है, इसलिए विन्सेन्टी का सूत्र हर व्यावहारिक आवश्यकता के लिए पसंद किया जाता है।

अपडेट : व्हुबेर और सीएफके के और सीएफके के उत्तर के लिए व्यावहारिक टिप्पणियों के बाद , मैं मानता हूं कि सटीकता लाभ की तुलना त्रुटि से की जानी चाहिए, न कि माप से। इसलिए, विन्सेन्टी के सूत्र परिमाण के कुछ आदेश अधिक सटीक हैं, न कि ~ 0.17%।


3
+1 अच्छा किया। पृथ्वी पर त्रुटि के सामान्य विश्लेषण के लिए, कृपया gis.stackexchange.com/questions/25494 पर थ्रेड देखें ।
whuber

3
विन्सेन्ट महान वृत्त सूत्र की तुलना में कई बार अधिक सटीक रूप से दीर्घवृत्तीय भूतापीय दूरी की गणना करता है। इसलिए यह कहना कि विन्सेंटी की सटीकता केवल 0.17% है भ्रामक है। (यह कहने के बराबर है कि दोहरी परिशुद्धता अंकगणित एक स्लाइड नियम का उपयोग करने की तुलना में 0.1% अधिक सटीक है।)
cffk

14

यदि आप जियोफाई का उपयोग कर रहे हैं, तो great_circle और vincenty दूरियां समान रूप से प्राप्त करने के लिए सुविधाजनक हैं। इस मामले में, आपको लगभग हमेशा उसी का उपयोग करना चाहिए जो आपको अधिक सटीक परिणाम देता है, अर्थात, विन्सेन्टी। दो विचार (जैसा कि आप बताते हैं) गति और सटीकता हैं।

विन्सेंटी दो गुना धीमा है। लेकिन शायद एक वास्तविक अनुप्रयोग में बढ़ा हुआ समय नगण्य है। यहां तक ​​कि अगर आपके एप्लिकेशन ने एक लाख दूरी की गणना के लिए कॉल किया है, तो हम केवल कुछ सेकंड के अंतर के बारे में बात कर रहे हैं।

आपके द्वारा उपयोग किए जाने वाले बिंदुओं के लिए, विन्सेटी में त्रुटि 6 माइक्रोन है और महान सर्कल दूरी में त्रुटि 0.75 मीटर है। मैं तब कहूंगा कि विन्सेन्टी 120000 गुना अधिक सटीक है (बजाय 0.17% अधिक सटीक)। सामान्य बिंदुओं के लिए, महान सर्कल दूरी में त्रुटि 0.5% हो सकती है। तो क्या आप दूरी में 0.5% त्रुटि के साथ रह सकते हैं? आकस्मिक उपयोग के लिए (केप टाउन से काहिरा की दूरी क्या है?), शायद आप कर सकते हैं। हालांकि, कई जीआईएस अनुप्रयोगों में बहुत अधिक सटीकता की आवश्यकताएं हैं। (0.5% 5 मी 1 किमी से अधिक है। वास्तव में इससे फर्क पड़ता है।)

लगभग सभी गंभीर मानचित्रण कार्य संदर्भ दीर्घवृत्त पर किए जाते हैं और इसलिए यह समझ में आता है कि दीर्घवृत्त पर भी दूरी को मापा जाना चाहिए। हो सकता है कि आज आप बड़ी दूरियों से दूर हो जाएं। लेकिन प्रत्येक नए आवेदन के लिए, आपको यह जांचना होगा कि क्या यह अभी भी स्वीकार्य है। शुरू से ही दीर्घवृत्तीय दूरी का उपयोग करना बेहतर है। आप रात में बेहतर नींद लेंगे।

ADDENDUM (मई 2017)

@ क्रेग-हिक्स द्वारा दिए गए उत्तर के जवाब में। भूगर्भ में विन्सेंटी () पद्धति में एक संभावित घातक दोष है: यह लगभग एंटीपोडल बिंदुओं के लिए एक त्रुटि फेंकता है। कोड में प्रलेखन पुनरावृत्तियों की संख्या बढ़ाने का सुझाव देता है। लेकिन यह एक सामान्य समाधान नहीं है क्योंकि विन्सेन्ट () द्वारा प्रयुक्त पुनरावृत्ति विधि ऐसे बिंदुओं के लिए अस्थिर है (प्रत्येक पुनरावृत्ति आपको सही समाधान से आगे ले जाती है)।

मैं समस्या को "संभावित रूप से घातक" क्यों बताता हूं? क्योंकि किसी अन्य सॉफ़्टवेयर लाइब्रेरी के भीतर डिस्टेंस फ़ंक्शन के किसी भी उपयोग को अपवाद को संभालने में सक्षम होने की आवश्यकता होती है। NaN या ग्रेट-सर्कल दूरी को वापस करके इसे संभालना संतोषजनक नहीं हो सकता है, क्योंकि परिणामी दूरी फ़ंक्शन त्रिकोण असमानता का पालन नहीं करेगा जो कि इसके उपयोग को रोकता है, जैसे, सहूलियत-बिंदु वाले पेड़ों में।

स्थिति पूरी तरह से धूमिल नहीं है। मेरे अजगर पैकेज geographiclib किसी भी विफलताओं किए बिना Geodesic दूरी की गणना करता है। Geopy पुल अनुरोध # 144 geopy की दूरी के उपयोग geographiclib पैकेज समारोह को परिवर्तित करता है यह उपलब्ध है। दुर्भाग्य से यह पुल अनुरोध अगस्त 2016 से अधर में है।

ADDENDUM (मई 2018)

जियोफाई 1.13.0 अब कंप्यूटिंग दूरी के लिए भौगोलिक भौगोलिक पैकेज का उपयोग करता है। यहां एक नमूना कॉल (मूल प्रश्न में उदाहरण के आधार पर):

>>> from geopy.distance import great_circle
>>> from geopy.distance import geodesic
>>> p1 = (31.8300167,35.0662833) # (lat, lon) - https://goo.gl/maps/TQwDd
>>> p2 = (31.8300000,35.0708167) # (lat, lon) - https://goo.gl/maps/lHrrg
>>> geodesic(p1, p2).meters
429.1676644986777
>>> great_circle(p1, p2).meters
428.28877358686776

3

दूसरे उत्तर को पोस्ट करने के लिए मेरी क्षमा याचना, लेकिन मैं @ रीढिग-हिक्स द्वारा अनुरोध का जवाब देने का अवसर ले रहा हूं ताकि भू-दूरी की गणना के लिए विभिन्न एल्गोरिदम के लिए सटीकता और समय की तुलना प्रदान की जा सके। यह एक टिप्पणी करता है जिसे मैं अपने पुल अनुरोध # 144 के लिए बनाता हूं भूगोल के लिए जो भूगोल के लिए मेरे एल्गोरिथ्म के दो कार्यान्वयन में से एक का उपयोग करने की अनुमति देता है भूभौतिकी के लिए एक का उपयोग किया जाता है, एक एक देशी अजगर कार्यान्वयन, जियोडेसिक (भौगोलिक) और दूसरा उपयोग करता है C, जियोडेसिक (pyproj) में एक कार्यान्वयन

यहाँ कुछ समय डेटा है। टाइम्स प्रति कॉल में माइक्रोसेकस में हैं

method                          dist    dest
geopy great_circle              20.4    17.1
geopy vincenty                  40.3    30.4
geopy geodesic(pyproj)          37.1    31.1
geopy geodesic(geographiclib)  302.9   124.1

यहां मेरे जियोडेसिक टेस्ट सेट के आधार पर जियोडेसिक गणना की सटीकता है । त्रुटियां माइक्रोन की इकाइयों (1e-6 m) में दी गई हैं

method                        distance destination
geopy vincenty                 205.629  141.945
geopy geodesic(pyproj)           0.007    0.013
geopy geodesic(geographiclib)    0.011    0.010

मैंने # 194 में हैनकोशे के पुल अनुरोध को शामिल किया है जो गंतव्य फ़ंक्शन में खराब बग को ठीक करता है। इस फिक्स के बिना, विन्सेन्ट के लिए गंतव्य गणना में त्रुटि 8.98 मीटर है।

परीक्षण के मामलों में से 19.2% vincenty.distance (पुनरावृत्तियों = 20) के साथ विफल रहे। हालाँकि परीक्षण सेट उन मामलों की ओर तिरछा है, जो इस विफलता का कारण बनेंगे।

WGS84 दीर्घवृत्त पर यादृच्छिक बिंदुओं के साथ, विन्सेन्टी एल्गोरिथ्म को 1000000 बार में से 16.6 को विफल करने की गारंटी दी गई है (सही समाधान विन्सेंटी विधि का एक अस्थिर निश्चित बिंदु है)।

विन्सेन्टी और पुनरावृत्तियों = 20 के भू-कार्यान्वयन के साथ, विफलता दर 82.8 प्रति 1000000 है। पुनरावृत्तियों = 200 के साथ, विफलता दर 21.2 प्रति 1000000 है।

भले ही ये दरें छोटी हैं, लेकिन विफलताएं काफी सामान्य हो सकती हैं। उदाहरण के लिए 1000 यादृच्छिक बिंदुओं के डेटासेट में (दुनिया के हवाई अड्डे, शायद), पूर्ण दूरी मैट्रिक्स की गणना औसतन 16 बार (पुनरावृत्तियों = 20 के साथ) विफल होगी।


2

ऐसा प्रतीत होता है कि geopy.distance पैकेज एक फ़ंक्शन "डिस्टेंस ()" प्रदान करता है, जो विन्सेन्टी () को डिफॉल्ट करता है। मैं सिद्धांत पर दूरी () का उपयोग करने की सलाह दूंगा, क्योंकि यह पैकेज की सिफारिश है, अगर भविष्य में कभी भी विंसेंटी () से विचलन किया गया हो (जैसा कि यह संभव नहीं है)। पढ़ना जारी रखें:

यह प्रलेखन नोट विन्सेटी () आपके द्वारा निर्दिष्ट फ़ंक्शन के स्रोत कोड में शामिल है:

नोट: विन्सेंटी दूरी का यह कार्यान्वयन कुछ वैध बिंदुओं के लिए अभिसरण करने में विफल है। कुछ मामलों में, पुनरावृत्तियों की संख्या में वृद्धि करके परिणाम प्राप्त किया जा सकता है ( iterationsकीवर्ड तर्क, कक्षा में दिए गए __init__, 20 के डिफ़ॉल्ट के साथ)। यह उपयोग करने के लिए बेहतर हो सकता है: वर्ग:, .great_circleजो मामूली कम सटीक है, लेकिन हमेशा एक परिणाम पैदा करता है।

Th ऊपर टिप्पणी / नोट के साथ स्रोत कोड https://github.com/geopy/geopy/blob/master/geopy/distance.py पर प्राप्त कर सकते हैं। विन्सेन्ट () के लिए परिभाषा तक स्क्रॉल करें।

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

अद्यतन: जैसा कि "cffk" द्वारा उल्लेख किया गया है, विन्सेन्ट्री () फ़ंक्शन स्पष्ट रूप से एक वैल्यूएयर अपवाद को फेंक देता है जब एल्गोरिथ्म में कनवर्ट नहीं होता है - हालांकि यह फ़ंक्शन विवरण में दर्ज़ नहीं है। इसलिए, दस्तावेज छोटी गाड़ी है।


नहीं, विन्सेंटी () विधि एक अपवाद उत्पन्न कर सकती है। यह अक्सर दावा किया जाता है कि यह कोई फर्क नहीं पड़ता क्योंकि यह केवल लगभग एंटीपोडल बिंदुओं के बीच की दूरी की गणना को प्रभावित करता है। हालाँकि ऐसी विफलताओं का अर्थ है कि त्रिभुज असमानता विफल हो जाती है और इसलिए विन्सेन्टी दूरी का उपयोग किसी निकट-बिंदु पेड़ (जो आपको निर्धारित करने की अनुमति देगा, उदाहरण के लिए, निकटतम हवाई अड्डे का स्थान कुशलतापूर्वक) का उपयोग करके निकटतम-पड़ोसी खोज को लागू करने के लिए नहीं किया जा सकता है। इस समस्या को हल करने के लिए, आप इस जियोफाई पुल अनुरोध github.com/geopy/geopy/pull/144 का उपयोग कर सकते हैं जो दूरी के लिए जियोग्राफिकलिब का उपयोग करता है।
cffk

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

@cffk - उस स्थिति में जहां यह उपलब्ध नहीं है: सबसे पहले, दस्तावेज मुख्य रूप से छोटी गाड़ी है क्योंकि इसमें नियोजित अपवाद का विवरण शामिल नहीं है (मान बढ़ाएं ("विन्सेन्टी फॉर्मूला अभिसरण करने में विफल!"), लेकिन इसलिए भी क्योंकि यह लगभग एंटीपोडल के बिंदुओं की माप के रूप में अस्थिरता का वर्णन नहीं करता है। मैं विन्सेन्टी वर्ग को एक vincenty_noexcpt फ़ंक्शन जोड़ने की सलाह दूंगा जो आंतरिक रूप से अपवाद को पकड़ता है और इसके बजाय एक महान सर्कल मान देता है, और यह तय करता है कि डिफ़ॉल्ट सेटिंग: दूरी = vincenty_noexcep।
क्रेग हिक्स

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

1
@ क्रेग-हिक्स - नहीं, "पुल अनुरोध" एक बेहतर एल्गोरिदम का विकल्प देता है (मेरे द्वारा!) दूरी को मापने के लिए, doi.org/10.1007/s00190-012-0578-z देखें यह विन्सेन्ट की तुलना में अधिक सटीक है, हमेशा एक परिणाम देता है , और एक ही समय के बारे में लेता है। मैं भूगर्भ का अनुचर नहीं हूं और यह पुल अनुरोध पिछले अगस्त से निष्क्रिय है। अगर मेरे पास मेरे शराबी थे, तो इसे जियोफाई में बदल दिया जाएगा (और विन्सेंटी () विन्सेन्ट के बजाय नए एल्गोरिदम को कॉल करेगा) और यह चर्चा का अंत होगा।
cffk

1

चाहे विन्सेन्टी या हैवरसाइन या कोसाइन के गोलाकार कानून का उपयोग कर रहे हों, किसी भी संभावित मुद्दों के बारे में जागरूक हो जाना चाहिए, जिस कोड के साथ आप उपयोग करने की योजना बना रहे हैं, चीजों को देखने और कम करने के लिए, और विन्सेंटी बनाम केविन्स के साथ कैसे डील करता है? भिन्न होगा क्योंकि प्रत्येक व्यक्ति के गुप्त मुद्दों / edgecases के बारे में पता चलता है, जो लोकप्रिय रूप से ज्ञात हो भी सकता है और नहीं भी। अनुभवी प्रोग्रामर यह जानता है। Newbies नहीं हो सकता है। मुझे आशा है कि उनमें से कुछ लोगों को निराशा होती है जब एक मंच से एक स्निपेट कुछ मामलों में कुछ अप्रत्याशित करता है। यदि कोई गंभीरता से इनमें से किसी भी संस्करण का उपयोग करने जा रहा है, विन्सेन्टी, हैवरसाइन, स्लोक, तो एसई, एसओ, रेडिट, क्वोरा, इत्यादि, किसी समाधान के कुछ प्रारंभिक कोडिंग में सीमित मदद प्रदान कर सकते हैं, लेकिन इसका मतलब यह नहीं है कि उनका समाधान या स्वीकृत 'उत्तर' मुद्दों से मुक्त है। यदि कोई परियोजना पर्याप्त महत्वपूर्ण है, तो यह उचित उचित मात्रा में अनुसंधान के योग्य है। मैन्युअल पढ़ें, डॉक्स पढ़ें, और यदि उस कोड की कोड समीक्षा मौजूद है, तो पढ़ें। एक स्निपेट या जिप को कॉपी करना और चिपकाना जो सौ या अधिक बार अपवित्र किया गया था, इसका मतलब यह नहीं है कि इसकी सुरक्षा व्यापक और आश्वस्त है।

Cffk द्वारा पोस्ट किया गया पेचीदा जवाब, पैकेज्ड सॉल्यूशंस में लुकिंग एडगैसेस के बारे में जागरूक होने के बिंदु को बढ़ाता है, जो अपवाद या अन्य कठिनाइयों का उत्पादन कर सकता है । उस पद पर किए गए विशिष्ट दावे वर्तमान में आगे बढ़ाने के लिए मेरे समय के बजट से परे हैं, लेकिन मैं इससे दूर हूं कि वास्तव में कुछ पैकेजों में गुप्त मुद्दे हैं, जिनमें कम से कम एक विनियोगी कार्यान्वयन शामिल है, जिसके बारे में कम से कम एक व्यक्ति ने सुधार करने का प्रस्ताव दिया है एक तरह से या किसी अन्य, उन कठिनाइयों का सामना करने के जोखिम को कम करने या समाप्त करने के लिए। मैं विन्सेन्टी के विषय में उस विषय को आगे नहीं जोड़ूंगा (अब तक इससे बहुत अनभिज्ञ होने के नाते), लेकिन ओवर्स के साथ कम से कम आंशिक रूप से विषय पर हावरसीन के बजाय बदल जाएगा।

लोकप्रिय रूप से प्रकाशित हैवरसाइन फार्मूला, चाहे अजगर या किसी अन्य भाषा में, क्योंकि यह आज सबसे अधिक सभी इंटेल और इंटेल जैसी प्रणालियों पर IEEE 754 फ्लोटिंग पॉइंट कल्पना का उपयोग करने वाला है, और एआरएम प्रोसेसर, पावरपीसी, आदि, यह जा रहा है। फ्लोटिंग पॉइंट सन्निकटन और गोलाई के कारण 180 डिग्री आर्क दूरी, एंटीपोडल बिंदुओं पर बहुत कम या वास्तविक और दोहरावदार अपवाद त्रुटियों के लिए भी अतिसंवेदनशील हो सकते हैं। हो सकता है कि इस स्थिति से कुछ नए लोगों को अभी तक काट नहीं लिया गया हो। चूँकि यह fp स्पेकट और राउंड का अनुमान लगाता है, इसका मतलब यह नहीं है कि fp64 पर कॉल करने वाला कोई भी कोड अपवाद त्रुटियों का कारण हो सकता है, नहीं। लेकिन कुछ कोड, कुछ फार्मूले इतने स्पष्ट edgecases नहीं हो सकते हैं जहां IEEE 754 fp64 के सन्निकटन और गोलाई एक मान को गणित विधि के डोमेन से थोड़ा बाहर भटकने का कारण हो सकता है जो इस तरह के मूल्य का त्रुटिपूर्ण मूल्यांकन करने की उम्मीद करता है। एक उदाहरण ... sqrt ()। यदि एक नकारात्मक मान एक sqrt (), जैसे sqrt (-0.00000000000000000122739) में अपना रास्ता खोजता है, तो एक अपवाद त्रुटि होगी। हावरसाइन सूत्र में, जिस तरह से यह एक समाधान की ओर बढ़ता है, एटान 2 () में दो sqrt () विधियां हैं। एक कि गणना की जाती है और फिर sqrt () में इस्तेमाल किया जा सकता है, दुनिया में एंटीपोडल बिंदुओं पर, 0.0 से नीचे या 1.0 से थोड़ा ऊपर, fp64 सन्निकटन और गोलाई के कारण बहुत कम, शायद ही कभी, लेकिन बार-बार। इस संदर्भ में लगातार विश्वसनीय पुनरावृत्ति, इसे एक अपवाद यादृच्छिक जोखिम के बजाय, एक अपवाद जोखिम, रक्षा करने के लिए, मिटाने के लिए एक edgecase बनाता है। यहां आवश्यक सुरक्षा के बिना, हावरसिन के एक छोटे अजगर 3 स्निपेट का एक उदाहरण दिया गया है:

import math as m

a = m.sin(dlat / 2)**2 + m.cos(lat1) * m.cos(lat2) * m.sin(dlon / 2)**2
c = 2 * m.atan2(m.sqrt(a), m.sqrt(1 - a))
distance = Radius * c

बहुत निकट या प्रतिमुख बिंदुओं पर, एक सूत्र की पहली पंक्ति में गणना की नकारात्मक भटक सकता है, शायद ही कभी, लेकिन repeatably उन्हीं अक्षां देशांतर निर्देशांकों के साथ। उन दुर्लभ घटनाओं की रक्षा / सुधार करने के लिए, एक गणना के बाद, बस जोड़ सकते हैं , जैसा कि नीचे देखा गया है:

import math as m

note = ''

a = m.sin(dlat / 2)**2 + m.cos(lat1) * m.cos(lat2) * m.sin(dlon / 2)**2
if a < 0.0: a = 0.0 ; note = '*'
if a > 1.0: a = 1.0 ; note = '**'
c = 2 * m.atan2(m.sqrt(a), m.sqrt(1 - a))
distance = Radius * c

# note = '*'  # a went below 0.0 and was normalized back to 0.0
# note = '**' # a went above 1.0 and was normalized back to max of 1.0

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

इस सरल परिवर्तन के साथ, दो को जोड़ने का एक परीक्षण, sqrt () फ़ंक्शन खुश हो जाएगा, और कोड अब एक अतिरिक्त है टिप्पणी है कि कोड बुला, चेतावनी है कि एक परिणाम के थोड़ा सामान्य कर दिया गया है, और क्यों करने के लिए वापस आ जा सकता है। कुछ देखभाल कर सकते हैं, कुछ नहीं कर सकते हैं, लेकिन वहाँ, एक अपवाद त्रुटि को रोकने, कि 'अन्यथा' हो सकता है। ब्लॉक को छोड़कर एक प्रयास अपवाद को पकड़ सकता है, लेकिन इसे ठीक न करें, जब तक कि स्पष्ट रूप से ऐसा करने के लिए नहीं लिखा गया हो। यह कोड सुधार लाइन (रों) के तुरंत बाद के लिए आसान लगता है एक गणना लाइन। पूरी तरह से रगड़ने वाले इनपुट को तब ब्लॉक की आवश्यकता नहीं होनी चाहिए, यहां ब्लॉक को छोड़कर।

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

अनुभव: दुनिया भर में पूरी तरह से परीक्षण के दौरान, 0.001 डिग्री वेतन वृद्धि में, मैंने लेट लोन संयोजनों के साथ एक हार्ड ड्राइव को भर दिया है, जो एक अपवाद के कारण, एक विश्वसनीय सुसंगत दोहराए जाने वाले अपवाद, एक महीने के दौरान सीपीयू शीतलन की विश्वसनीयता का परीक्षण करने के लिए। प्रशंसक, और मेरा धैर्य। हां, मैंने तब से अधिकांश लॉग को हटा दिया है, क्योंकि उनका उद्देश्य ज्यादातर बिंदु को साबित करने के लिए था (यदि सजा की अनुमति है)। लेकिन मेरे पास परीक्षण के उद्देश्यों के लिए रखे गए 'समस्या लाट लोन मूल्यों' के कुछ छोटे लॉग हैं।

शुद्धता: विल एक और पूरे haversine परिणाम यह है कि डोमेन में छोटे बिट वापस सामान्य से कुछ सटीकता खो? बहुत अधिक नहीं, शायद fp64 सन्निकटन और गोलाई से अधिक पहले से ही शुरू नहीं किया गया था, जिससे डोमेन से थोड़ा सा बहाव हुआ। यदि आपको पहले से ही विन्सेंटी के ऊपर हावरसीन स्वीकार्य है - सरल, तेज, अनुकूलित करना, समस्या निवारण और बनाए रखना आसान है, तो हैवरसाइन आपके प्रोजेक्ट के लिए एक अच्छा समाधान हो सकता है।

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

असुरक्षित haversine पूरे इंटरनेट पर है, और मैंने केवल एक पुरानी usenet पोस्ट देखी है जिसमें कुछ सुरक्षा दिखाई गई है, मुझे लगता है कि JPL में किसी से, और यह 1985 से पहले का हो सकता है, पूर्व IEEE 754 फ़्लोटिंग पॉइंट कल्पना। दो अन्य पृष्ठों में एंटीपोडल बिंदुओं के पास संभावित मुद्दों का उल्लेख किया गया है, लेकिन उन मुद्दों का वर्णन नहीं किया गया है, या कोई उन्हें कैसे कम कर सकता है। तो नए लोगों के लिए चिंता है (मेरे जैसे) जो हमेशा अच्छे अभ्यास को आगे के शोध के लिए अच्छी तरह से समझ नहीं सकते हैं, और edgecases का परीक्षण कर सकते हैं, कुछ कोड की उन्होंने ट्रस्ट में एक परियोजना में कॉपी और पेस्ट किया है। cffk का पेचीदा पोस्ट इस बात से ताज़ा था कि यह इस प्रकार के मुद्दों के साथ सार्वजनिक था, जिन्हें अक्सर उल्लेख नहीं किया जाता है, शायद ही कभी स्निपेट्स में सुरक्षा के लिए कोडित किया जाता है, और शायद ही कभी इस तरह से चर्चा की जाती है, जो कि पोस्ट किए गए असुरक्षित और अनदेखे संस्करणों की तुलना में है।

20190923 के अनुसार, हाइवराइन फॉर्मूला के लिए विकी पेज वास्तव में एंटीपोडल बिंदुओं पर समस्या का उल्लेख करता है, कंप्यूटिंग डिवाइसेस में फ्लोटिंग पॉइंट इश्यू के कारण ... उत्साहजनक ...

https://en.wikipedia.org/wiki/Haversine_formula

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

और इस अन्य साइट में इसका बहुत संक्षिप्त उल्लेख भी है:

https://www.movable-type.co.uk/scripts/latlong.html

यदि कोई उस पृष्ठ पर 'राउंडिंग त्रुटियों के विरुद्ध सुरक्षा सहित' के लिए खोज करता है, तो यह है ...

यदि atan2 उपलब्ध नहीं है, तो c की गणना 2 (asin (min (1, )a)) से की जा सकती है (गोलाई त्रुटियों के विरुद्ध सुरक्षा सहित)।

अब एक दुर्लभ उदाहरण है जहां राउंडिंग त्रुटियों का उल्लेख किया गया है, और असिन () संस्करण के लिए दिखाया गया संरक्षण, अभी तक उल्लेख नहीं किया गया है या एटैन 2 () संस्करण के लिए दिखाया गया है। लेकिन गोलाई त्रुटियों का कम से कम जोखिम का उल्लेख किया गया है।

Imho, किसी भी 24/7/365 आवेदन का उपयोग कर haversine, एक महत्वपूर्ण और सरल विस्तार के रूप में एंटीपोडल बिंदुओं के पास इस सुरक्षा की आवश्यकता है।

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

IOW, चाहे विन्सेंटी या हैवरसाइन या स्लोक का उपयोग कर रहा हो, किसी को कोड के साथ किसी भी मुद्दे के बारे में पता होना चाहिए, चीजों को देखने और कम करने के लिए, और विन्सेंटी बनाम हैवरसिन बनाम धीमे मुद्दों के साथ कैसे अलग होगा, यह एक-एक के बारे में पता चलेगा। गुप्त मुद्दों / edgecases, जो लोकप्रिय रूप से ज्ञात हो भी सकता है और नहीं भी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.