2013-04-01 9 views
42

मैं दो (अक्षांश, देशांतर) बिंदुओं के बीच की दूरी का अनुमान प्राप्त करने में सक्षम होना चाहता हूं। मैं अंडरशूट करना चाहता हूं, क्योंकि यह ए * ग्राफ खोज के लिए होगा और मैं इसे तेज़ होना चाहता हूं। अंक 800 किमी दूर होंगे।मैं दो (अक्षांश, देशांतर) बिंदुओं के बीच की दूरी का त्वरित अनुमान कैसे लगा सकता हूं?

+1

क्या हमें इन बिंदुओं को * क्षेत्र * पर झूठ बोलना चाहिए? – phs

+1

देखें http://stackoverflow.com/questions/27928/how-do-i-calculate-distance-between-two-latitude-longitude- पॉइंट्स या http://stackoverflow.com/questions/4913349/haversine-formula- इन-पायथन-असर-और-बीच-दो-जीपीएस-पॉइंट्स (पायथन) –

+0

हां, पृथ्वी पर, लेकिन गति। AFAIK जटिल गणित पर्याप्त तेज़ नहीं है। – fread2281

उत्तर

89

Haversine Formula in Python (Bearing and Distance between two GPS points) के उत्तरों पाइथन कार्यान्वयन प्रदान करते हैं जो आपके प्रश्न का उत्तर देते हैं।

नीचे दिए गए कार्यान्वयन का उपयोग करके ने पुराने लैपटॉप पर 1 सेकंड से कम में 100,000 पुनरावृत्तियों का प्रदर्शन किया। मुझे लगता है कि आपके उद्देश्यों के लिए यह पर्याप्त होना चाहिए। हालांकि, प्रदर्शन के लिए अनुकूलित करने से पहले आपको कुछ भी प्रोफ़ाइल देना चाहिए।

from math import radians, cos, sin, asin, sqrt 
def haversine(lon1, lat1, lon2, lat2): 
    """ 
    Calculate the great circle distance between two points 
    on the earth (specified in decimal degrees) 
    """ 
    # convert decimal degrees to radians 
    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) 
    # haversine formula 
    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 
    c = 2 * asin(sqrt(a)) 
    # Radius of earth in kilometers is 6371 
    km = 6371* c 
    return km

haversine(lat1, long1, lat2, long2) * 0.90 या जो भी कारक आप चाहते हैं उसे कम से कम अनुमानित करने के लिए। मैं नहीं देखता कि आपकी कम आकलन में त्रुटि कैसे पेश की जा रही है।

+0

1000s, लेकिन यह पाइथन है और मुझे उदारता से कम अनुमान लगाने की आवश्यकता है। – fread2281

7

गति के लिए एक विचार लंबे/अक्षांश को 3 डी (एक्स, वाई, जेड) निर्देशांक में समन्वयित करना है। अंक को प्रीप्रोसेसिंग करने के बाद, वास्तविक दूरी के त्वरित गणना वाले अंडरशूट के रूप में बिंदुओं के बीच यूक्लिडियन दूरी का उपयोग करें।

3

अधिकतम गति के लिए, आप समन्वय दूरी के लिए rainbow table जैसे कुछ बना सकते हैं। ऐसा लगता है जैसे आप पहले से ही उस क्षेत्र को जानते हैं जिसके साथ आप काम कर रहे हैं, इसलिए ऐसा लगता है कि उन्हें पूर्व-कंप्यूटिंग करना संभव हो सकता है। फिर, आप निकटतम संयोजन लोड कर सकते हैं और बस इसका उपयोग कर सकते हैं।

उदाहरण के लिए, महाद्वीपीय संयुक्त राज्य अमेरिका में, देशांतर 55 डिग्री अवधि है और अक्षांश 20 है, जो 1100 पूर्ण संख्या अंक होगा। सभी संभावित संयोजनों के बीच की दूरी handshake problem है जिसका उत्तर (एन -1) (एन)/2 या लगभग 600 के संयोजनों का उत्तर दिया जाता है। यह स्टोर और पुनर्प्राप्त करने के लिए काफी व्यवहार्य लगता है। यदि आप अपनी आवश्यकताओं के बारे में अधिक जानकारी प्रदान करते हैं, तो मैं और अधिक विशिष्ट हो सकता हूं।

28

चूंकि दूरी अपेक्षाकृत छोटी है, इसलिए आप समकक्ष दूरी अनुमान का उपयोग कर सकते हैं। यह अनुमान Haversine सूत्र का उपयोग करने से तेज़ है। इसलिए, अपने संदर्भ बिंदु (lat1/lon1) से उस बिंदु तक दूरी प्राप्त करने के लिए जिस पर आप परीक्षण कर रहे हैं (lat2/lon2), नीचे दिए गए सूत्र का उपयोग करें। महत्वपूर्ण नोट: आप रेडियंस में सभी अक्षांश/देशांतर अंक बदलने की आवश्यकता:

R = 6371 // radius of the earth in km 
x = (lon2 - lon1) * cos(0.5*(lat2+lat1)) 
y = lat2 - lat1 
d = R * sqrt(x*x + y*y) 

के बाद से 'आर' किमी में है, दूरी 'प' किमी में होगा।

संदर्भ: http://www.movable-type.co.uk/scripts/latlong.html

0

निम्नलिखित कोड का उपयोग करें।

def distance(lat1, lng1, lat2, lng2): 
    #return distance as meter if you want km distance, remove "* 1000" 
    radius = 6371 * 1000 

    dLat = (lat2-lat1) * math.pi/180 
    dLng = (lng2-lng1) * math.pi/180 

    lat1 = lat1 * math.pi/180 
    lat2 = lat2 * math.pi/180 

    val = sin(dLat/2) * sin(dLat/2) + sin(dLng/2) * sin(dLng/2) * cos(lat1) * cos(lat2)  
    ang = 2 * atan2(sqrt(val), sqrt(1-val)) 
    return radius * ang 
+0

मेरे मामले में, अन्य कोड मेरे लिए अच्छा काम नहीं कर रहे हैं। तो, मैं बस इस जवाब में मज़ेदारता को ट्रैनस्ट्लेट करता हूं http://stackoverflow.com/questions/6981916/how-to-calculate-distance-between-two-locations-using-their-longitude-and-latitu – uher

संबंधित मुद्दे