سؤال

كيف يمكنك حساب المسافة بين 2 المدن ؟

هل كانت مفيدة؟

المحلول

إذا كنت تحتاج إلى أن تأخذ انحناء الأرض في حساب الدائرة العظمى المسافة هو ما تبحث عنه. مقالة ويكيبيديا ربما يقوم بعمل أفضل من شرح كيف تعمل صيغة من هناك أيضا هذا الطيران الوصفات الصفحة الذي يغطي أن يذهب إلى مزيد من التفاصيل.

الصيغ هي فقط الجزء الأول من اللغز رغم أن, إذا كنت بحاجة إلى جعل هذا العمل التعسفي المدن, سوف تحتاج إلى موقع قاعدة البيانات للحصول على خطوط الطول/العرض من.لحسن الحظ يمكنك الحصول على هذا مجانا من Geonames.org, على الرغم من أن هناك التجارية db المتاحة (تطلب من google).لذلك ، في عام ، ابحث عن المدينتين تريد الحصول على خطوط الطول/العرض المشارك orinates وتوصيلها إلى الصيغة كما في ويكيبيديا عملت سبيل المثال.

اقتراحات أخرى:

  • كامل التجاري الحل ، هناك PC ميلر والذي يستخدم من قبل العديد من شركات النقل بالشاحنات حساب أسعار الشحن.
  • إجراء مكالمات إلى خرائط Google (أو غيرها) api.إذا كنت بحاجة إلى القيام بالعديد من طلبات في اليوم الواحد ، النظر في التخزين المؤقت النتائج على الملقم.
  • أيضا مهم جدا هو النظر في بناء معادلة قاعدة بيانات المدن الضواحي والبلدات.... الخإذا كنت تعتقد أنك سوف تحتاج من أي وقت مضى إلى مجموعة البيانات الخاصة بك.هذا يحصل حقا معقدة على الرغم من أنك قد لا تجد مقاس واحد يناسب الجميع الحل لمشكلتك.

أخيرا وليس آخرا, جويل كتب مقالا حول هذه المشكلة حين يعود, حتى هنا تذهب: ميزة جديدة:البحث عن وظيفة

نصائح أخرى

يمكنك استخدام Haversine الصيغة.

هذا من السهل جدا القيام به مع الجغرافيا اكتب في SQL Server 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 هو SRID على WGS84 elipsoidal نموذج الأرض

Ca يمكنك استخدام A* خوارزمية لإيجاد أقصر طريق بين هاتين المدينتين و بهذه الطريقة سيكون لديك المسافة.

إذا كنت تتحدث عن أقصر مسافة بين اثنين من المدن الحقيقية في كروية كوكب مثل الأرض, تريد الدائرة الكبرى المسافة.

إذا كنت تعمل في الطائرة و تريد المسافة الإقليدية "تيجي":

// 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);

لا علم المثلثات حاجة!فقط نظرية فيثاغورس وحقيقة أن الساحات هي دائما إيجابية بحيث لا تحتاج dx = abs(x1 - x0) ، الخ.للحصول على رقم موجب لتمرير sqrt().

لاحظ أنه ربما يمكن أن تفعل هذا في سطر واحد و أن المترجم ربما خفض ما يعادل البرمجية أعلاه:

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

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

يمكنك الحصول على المسافة بين المدينتين من خريطة جوجل api.هنا هو تنفيذ ذلك في بايثون

#!/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

تجد Lat/Lon المدينة ، ثم استخدم المسافة تقدير خوارزمية خطوط الطول/العرض الإحداثيات.

إذا كنت في حاجة الى رمز سبيل المثال أعتقد أنا واحد أنا يمكن أن حفر في المنزل ، ولكن مثل العديد من الإجابات السابقة ، تحتاج طويل / lat db أن تفعل الحساب

فمن الأفضل استخدام البحث في الجدول للحصول على المسافة بين المدينتين.

هذا منطقي لأن * الصيغة لحساب المسافة ais جدا حسابيا المركزة..* المسافة بين المدن من غير المرجح أن تتغير.

لذلك إلا إذا كنت احتياجات محددة للغاية (مثل رسم خرائط التضاريس من الأقمار الصناعية أو بعض أو تضاريس خوارزمية أو أي شيء آخر) ، عليك أن حفظ قائمة المدن والمسافات بينهما ، إلى طاولة البحث عنه حسب الحاجة.

لقد تم القيام بالكثير من العمل مع هذا مؤخرا.أنا وجدت SQL2008 الميزات الجديدة حقا جعل هذا سهل.لا يمكن العثور على جميع النقاط التي withing Xkm من 100 ألف سجل في الجدول الفرعي مرة ثانية...لا رث جدا.

دائرة كبيرة (كروية افتراض) طريقة في اختبار نحو 2.5 ميلا قبالة بالمقارنة مع vincenty صيغة (elipsoidal الافتراض ، وهو ما الأرض).

الخدعة الحقيقية هي الحصول على اللات و طويلة..لذلك أنا باستخدام جوجل.

@جاريد - قاصر تصحيح التعليمات البرمجية الخاصة بك على سبيل المثال.السطر الأخير من أول المثال التعليمات البرمجية كما يلي:

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

وأنا أتفق أنه بمجرد أن يكون لديك معلومات, إذا انها لن تتغير ، تخزينه بطريقة أو بأخرى.@ماركو تينتو شكرا على T-SQL العينة.بالنسبة لأولئك الذين لا يستطيعون الوصول إلى SQL Server أو يفضلون طريقة أخرى:إذا كنت تحتاج إلى دقة عالية ، تحقق ويكيبيديا الدخول على Vincenty الخوارزمية للحصول على مزيد من المعلومات.أعتقد أن هناك شبيبة التنفيذ ، التي من شأنها أن (إن لم يكن بالفعل) أن استدار بسهولة إلى لغات أخرى.أيضا في الجزء السفلي من هذه الصفحة هو رابط geographicLib, الذي يهدف إلى 1000 مرة أكثر دقة من Vincenty خوارزمية (إذا كان لديك بيانات جيدة ، قد يهم).

لماذا تستخدم شيئا مثل Vincenty الأسلوب ؟ لأن الأرض ليست كرة مثالية و أساليب مثل التي تتيح إدخال أكثر دقة الرئيسية والثانوية محور لنمذجة الأرض.

يمكنني استخدام distancy لذا بسيطة ونظيفة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top