2008-08-22 20 views
16

आप 2 शहरों के बीच की दूरी की गणना कैसे करते हैं?2 शहरों के बीच दूरी की गणना

+0

इस [संबंधित StackOverflow सवाल] (देखें http://stackoverflow.com/questions/27928/how-do-i-calculate -डिस्टेंस-बीच-दो-अक्षांश-देशांतर-बिंदु) –

उत्तर

32

यदि आपको पृथ्वी के वक्रता को ध्यान में रखना है, तो ग्रेट-सर्किल दूरी वह है जिसे आप ढूंढ रहे हैं। The Wikipedia article शायद यह बताए जाने का बेहतर काम करता है कि फ़ॉर्मूला मेरे से कैसे काम करता है, और this aviation formulary page भी है जो कवर करता है जो अधिक विस्तार से जाता है।

सूत्र केवल पहेली का पहला हिस्सा हैं, अगर आपको मनमाने ढंग से शहरों के लिए यह काम करने की आवश्यकता है, तो आपको लेट/लम्बाई प्राप्त करने के लिए एक स्थान डेटाबेस की आवश्यकता होगी। सौभाग्य से आप इसे Geonames.org से मुक्त कर सकते हैं, हालांकि वाणिज्यिक डीबी उपलब्ध है (Google से पूछें)। इसलिए, सामान्य रूप से, अपने इच्छित दो शहरों को देखें, लेट/लांग सह-ऑरनेट्स प्राप्त करें और the Wikipedia Worked Example में फॉर्मूला में प्लग करें।

अन्य सुझाव:

  • एक पूर्ण वाणिज्यिक समाधान के लिए, वहाँ PC Miler जो calculate शिपिंग दरों के लिए कई ट्रकिंग कंपनियों द्वारा प्रयोग किया जाता है है।
  • Google मानचित्र (या अन्य) एपीआई पर कॉल करें। यदि आपको प्रति दिन कई अनुरोध करने की आवश्यकता है, तो सर्वर पर परिणामों को कैशिंग करने पर विचार करें।
  • भी बहुत महत्वपूर्ण शहरों, उपनगरों, कस्बों आदि के लिए समकक्ष डेटाबेस बनाने पर विचार करना है यदि आपको लगता है कि आपको कभी भी अपना डेटा समूहित करने की आवश्यकता होगी। हालांकि यह वास्तव में जटिल हो जाता है, और आपको अपनी समस्या के लिए एक-आकार-फिट-सभी समाधान नहीं मिल सकता है।

इतना ही नहीं बल्कि, जोएल एक समय पहले इस समस्या के बारे में एक लेख लिखा था, इसलिए यहाँ तुम जाओ: New Feature: Job Search

+0

आपका जोएस लिंक पुराना है (लिंक पर क्लिक करने से आपको अब एक त्रुटि पृष्ठ पर ले जाता है)। मेरा मानना ​​है कि यह अब सही लिंक है: http://www.joelonsoftware.com/items/2006/10/09.html – AgentConundrum

+0

मैंने लिंक अपडेट किया है और कुछ और जानकारी जोड़ दी है। –

0

आपको शहर का लेट/लॉन मिलता है, फिर लेट/लॉन निर्देशांक के लिए दूरी अनुमान एल्गोरिदम का उपयोग करें।

1

आप उन दो शहरों के बीच सबसे छोटा रास्ता खोजने के लिए A* एल्गोरिदम का उपयोग करते हैं और इस तरह आपके पास दूरी होगी।

0

यदि आप एक कोड उदाहरण की जरूरत है मुझे लगता है कि मैं एक है मैं घर पर की खुदाई सकता है, लेकिन पिछले जवाब से कई की तरह, आप एक देशांतर/अक्षांश db जरूरत गणना

0

यह उपयोग करने के लिए बेहतर है क्या करने के लिए दो शहरों के बीच दूरी प्राप्त करने के लिए एक लुकअप टेबल।

यह समझ में आता है क्योंकि * दूरी एआई की गणना करने के लिए फॉर्मूला काफी कम्प्यूटेशनल गहन है .. * शहरों के बीच की दूरी बदलने की संभावना नहीं है।

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

1

आप हवाई जहाज में काम कर रहे हैं रहे हैं और आप Euclidean distance चाहते हैं "के रूप में कौवा मक्खियों":

// Cities are points x0,y0 and x1,y1 in kilometers or miles or Smoots[1] 
dx = x1 - x0; 
dy = y1 - y0; 
dist = sqrt(dx*dx + dy*y); 

नहीं त्रिकोणमिति की जरूरत! बस Pythagorean theorem और तथ्य यह है कि वर्ग हमेशा सकारात्मक होते हैं इसलिए आपको sqrt() को पास करने के लिए सकारात्मक संख्या प्राप्त करने के लिए dx = abs (x1 - x0) आदि की आवश्यकता नहीं होती है।

नोट आप शायद एक पंक्ति में ऐसा कर सकता है और एक संकलक शायद यह कोड ऊपर बराबर कम करेगा कि:

dist = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); 

[1] http://en.wikipedia.org/wiki/Smoot

1

आप के बारे में बात कर रहे हैं पृथ्वी जैसे वास्तविक गोलाकार ग्रह पर दो वास्तविक शहरों के बीच सबसे छोटी दूरी, आप great circle distance चाहते हैं।

0

मैं हाल ही में इस के साथ बहुत काम कर रहा हूँ। मुझे लगता है कि SQL2008 की नई विशेषताएं वास्तव में यह आसान बनाती हैं। मैं उन सभी बिंदुओं को पा सकता हूं जो उप-दूसरे समय में 100k रिकॉर्ड तालिका के एक्सकेएम के साथ हैं ... बहुत शर्मीली नहीं।

मेरे परीक्षण में महान सर्कल (गोलाकार धारणा) विधि लगभग 2.5 मील दूर थी, जबकि विन्सेन्टी फॉर्मूला (एलिस्पोसाइड धारणा, जो पृथ्वी है) की तुलना में लगभग 2.5 मील दूर थी।

असली चाल लेट और लम्बी हो रही है .. इसके लिए मैं Google का उपयोग कर रहा हूं।

0

@ जेरेड - आपके कोड उदाहरण में मामूली सुधार। पहले कोड उदाहरण की अंतिम पंक्ति पढ़ना चाहिए:

dist = sqrt(dx*dx + dy*dy); 
2

यह एसक्यूएल सर्वर में भूगोल प्रकार से कोई लेना देना 2008.

SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326)) 
-- computes distance in meters using eliptical model, accurate to the mm 

4326 WGS84 elipsoidal धरती मॉडल के लिए SRID है बहुत आसान है

+0

यह पोस्टजीआईएस में समान रूप से सरल है। – jpmc26

0

मैं मानता हूं कि एक बार आपके पास जानकारी हो जाने पर, यदि यह बदलने वाला नहीं है, तो इसे किसी भी तरह से स्टोर करें। टी-एसक्यूएल नमूना के लिए @ मार्को टिंटो धन्यवाद। उन लोगों के लिए जिनके पास SQL ​​सर्वर तक पहुंच नहीं है या कोई अन्य विधि पसंद नहीं है: यदि आपको उच्च सटीकता की आवश्यकता है, तो अधिक जानकारी के लिए Wikipedia's entry on the Vincenty algorithm देखें। मेरा मानना ​​है कि एक जेएस कार्यान्वयन है, जो (यदि पहले से नहीं है) आसानी से अन्य भाषाओं में पोर्ट किया जाएगा। इसके अलावा, उस पृष्ठ के निचले हिस्से में geographicLib का एक लिंक है, जो विन्सेंटी एल्गोरिदम से 1000 गुना अधिक सटीक होने का अधिकार करता है (यदि आपके पास डेटा अच्छा है, तो इससे कोई फर्क नहीं पड़ता)।

आप विन्सेंट विधि की तरह कुछ क्यों उपयोग करेंगे? क्योंकि पृथ्वी एक आदर्श क्षेत्र नहीं है और इस तरह की विधियां पृथ्वी को मॉडलिंग के लिए एक अधिक सटीक प्रमुख और मामूली धुरी को इनपुट करने की अनुमति देती हैं।

1

आप गूगल मानचित्र एपीआई से दोनों शहरों के बीच दूरी प्राप्त कर सकते हैं। यहाँ पायथन में यह के एक कार्यान्वयन है

#!/usr/bin/python 
import requests 
from sys import argv 
def get_distance(origin,destination): 
    gmap='http://maps.googleapis.com/maps/api/distancematrix/json' 
    payload={"origins":origin,"destinations":destination,"sensor":'false' } 
    try: 
     a=requests.get(gmap,params=payload) 
     data = a.json() 
     origin = str(data['origin_addresses'][0]) 
     destination= str(data['destination_addresses'][0]) 
     distance = data['rows'][0]['elements'][0]['distance']['text'] 
     return distance,origin,destination 
    except Exception,e: 
     print "The %s or %destination does not exists :(" %(origin,destination) 
     exit() 

if __name__=="__main__": 
    if len(argv)<3: 
     print "sorry Check the format" 
    else: 
     origin=argv[1] 
     destination=argv[2] 
     distance,origin,destination=get_distance(origin,destination) 
     print "%s ---> %s : %s" %(origin,destination,distance) 

उदाहरण लिंक: https://gist.github.com/sarathsp06/cf063e47bcc515b51c84

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