एक अनुमानित समाधान (एक समकक्ष प्रक्षेपण के आधार पर), बहुत तेज़ (इसमें केवल 1 ट्रिगर और 1 वर्ग रूट की आवश्यकता है)।
यह अनुमान प्रासंगिक है यदि आपके अंक बहुत दूर नहीं हैं। वास्तविक हावर्सिन दूरी की तुलना में यह हमेशा से अधिक अनुमान लगाएगा। उदाहरण के लिए यह को 0.05382% से अधिक वास्तविक दूरी पर जोड़ देगा यदि आपके दो बिंदु के बीच डेल्टा अक्षांश या देशांतर 4 दशमलव डिग्री से अधिक नहीं है।
मानक सूत्र (Haversine) सटीक एक (जो है, यह पृथ्वी पर देशांतर/अक्षांश के किसी भी जोड़ी के लिए काम करता है), लेकिन है बहुत धीमी के रूप में यह 7 त्रिकोणमितीय और 2 वर्ग जड़ों की जरूरत है। यदि आपके कुछ बिंदु बहुत दूर नहीं हैं, और पूर्ण परिशुद्धता सर्वोपरि नहीं है, तो आप इस अनुमानित संस्करण (इक्वायरैंगुलर) का उपयोग कर सकते हैं, जो कि बहुत तेज है क्योंकि यह केवल एक त्रिकोणमितीय और एक वर्ग रूट का उपयोग करता है।
// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2)
int R = 6371; // km
double x = (lon2 - lon1) * Math.cos((lat1 + lat2)/2);
double y = (lat2 - lat1);
double distance = Math.sqrt(x * x + y * y) * R;
आप का अनुकूलन इस आगे या तो द्वारा कर सकते हैं:
- वर्गमूल निकाला जा रहा है अगर आप बस एक और करने के लिए दूरी की तुलना (उस मामले में दोनों वर्ग दूरी की तुलना);
- कोसाइन फैक्टरिंग आउट करें यदि आप एक मास्टर पॉइंट से कई अन्य लोगों की दूरी की गणना करते हैं (उस स्थिति में आप मास्टर पॉइंट पर केंद्रित समेकित प्रक्षेपण करते हैं, तो आप सभी तुलनाओं के लिए एक बार कोसाइन की गणना कर सकते हैं)।
अधिक जानकारी के लिए देखें: http://www.movable-type.co.uk/scripts/latlong.html
एक अच्छा संदर्भ में कई भाषाओं में Haversine सूत्र के कार्यान्वयन है: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe
स्रोत
2010-12-02 20:39:10
की तलाश में था, स्थान का उपयोग करने से शायद धीमा। डिस्टेंसबेटवीन() क्योंकि यह स्थान ऑब्जेक्ट्स का उपयोग कर रहा है लेकिन मेरे उद्देश्यों के लिए बहुत अच्छा काम करता है। – ZoltanF
@praveen धन्यवाद आदमी इसका काम करता है .. –
मुझे किस वर्ग को स्थान 'आयात android.location.Location;' या –