2012-01-13 29 views
8

Kullanıcıdan 2 coğrafi koordinat almak için küçük bir program ayarlıyorum ve daha sonra bunların arasındaki mesafeyi hesaplayın (dünyanın eğriliğini dikkate alarak). Bu yüzden formülün here şeklini inceledim.Coğrafi uzaklığını hesaplama konusunda yardıma mı ihtiyacınız var

Ben temelde buna dayanarak benim piton fonksiyonunu kurmak ve bu ile geldi budur: Sorun sonuçları gerçekten hatalı çıkmasıdır

def geocalc(start_lat, start_long, end_lat, end_long): 
    start_lat = math.radians(start_lat) 
    start_long = math.radians(start_long) 
    end_lat = math.radians(end_long) 
    end_long = math.radians(end_long) 

    d_lat = start_lat - end_lat 
    d_long = start_long - end_long 

    EARTH_R = 6372.8 

    c = math.atan((math.sqrt((math.cos(end_lat)*d_long)**2 +((math.cos(start_lat)*math.sin(end_lat)) - (math.sin(start_lat)*math.cos(end_lat)*math.cos(d_long)))**2))/((math.sin(start_lat)*math.sin(end_lat)) + (math.cos(start_lat)*math.cos(end_lat)*math.cos(d_long)))) 

    return EARTH_R*c 

. Python için yeniyim, bu yüzden bazı yardım ya da tavsiyeler büyük ölçüde takdir edilecektir! I (d_long) Bir Math.sin cevapsız düşünüyorum https://pypi.python.org/pypi/geopy

+2

somut bir örnek (giriş, beklenen çıktı, gerçek çıktı) elde edin. –

+0

Bu koordinatları (-6.508, 55.071) ve (-8.886, 51.622) girdim. Beklenen çıktı 414 KM idi. Asıl sonuç 6473Km – Darkphenom

+0

idi. Bunun yanlış olduğunu söyleyebilirim, bu yanlış>. hochl

cevap

10

zaten büyük olasılıkla, söz çünkü

(3) kodunuzu okunaksız olduğu (hat çok uzun, gereksiz parantez 17 anlamsız örnekleri, "matematik".)

(4) atan2() kullanma hakkında Wikipedia makalesinde açıklama fark etmedi

(5) koordinatlarınızı girerken enlem ve boylam takas olabilir

(6) delta(latitude) gereksiz yere hesaplanır; Bu Bunu araya getirme formül

görünmez:

from math import radians, sqrt, sin, cos, atan2 

def geocalc(lat1, lon1, lat2, lon2): 
    lat1 = radians(lat1) 
    lon1 = radians(lon1) 
    lat2 = radians(lat2) 
    lon2 = radians(lon2) 

    dlon = lon1 - lon2 

    EARTH_R = 6372.8 

    y = sqrt(
     (cos(lat2) * sin(dlon)) ** 2 
     + (cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dlon)) ** 2 
     ) 
    x = sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(dlon) 
    c = atan2(y, x) 
    return EARTH_R * c 



>>> geocalc(36.12, -86.67, 33.94, -118.40) 
2887.2599506071115 
>>> geocalc(-6.508, 55.071, -8.886, 51.622) 
463.09798886300376 
>>> geocalc(55.071, -6.508, 51.622, -8.886) 
414.7830891822618 
+0

Tüm bu sorunlara dikkat ettiğiniz için teşekkür ederiz. Yaptığımdan kesinlikle çok daha temiz görünüyor ve işe yarıyor! – Darkphenom

4

Aşağıdaki linkte "hesaplanması Mesafeler" na inin, mesafe hesaplamaları için yerleşik bir işlevi vardır geopy modülünü kullanabilirsiniz

Bu işleri
c = math.atan((math.sqrt((math.cos(end_lat)*math.sin(d_long))**2 +((math.cos(start_lat)*math.sin(end_lat)) - (math.sin(start_lat)*math.cos(end_lat)*math.cos(d_long)))**2))/((math.sin(start_lat)*math.sin(end_lat)) + (math.cos(start_lat)*math.cos(end_lat)*math.cos(d_long)))) 
+0

Bu iyi bir öneri olabilir, ancak OP'in hedefine nasıl ulaşacağınıza dair bir kod ekleyebiliyorsanız cevabınız daha iyi olur. . – MERose

3

:

+0

Orada haklısınız. Ancak, hala tamamen yanlış cevaplar alıyorum. – Darkphenom

4

(baskı f http://en.wikipedia.org/wiki/Great-circle_distance @ çalışılmış örnek uyarınca 2.887,26 km döndürür):

import math 

def geocalc(start_lat, start_long, end_lat, end_long): 

    start_lat = math.radians(start_lat) 
    start_long = math.radians(start_long) 
    end_lat = math.radians(end_lat) 
    end_long = math.radians(end_long) 

    d_lat = math.fabs(start_lat - end_lat) 
    d_long = math.fabs(start_long - end_long) 

    EARTH_R = 6372.8 

    y = ((math.sin(start_lat)*math.sin(end_lat)) + (math.cos(start_lat)*math.cos(end_lat)*math.cos(d_long))) 

    x = math.sqrt((math.cos(end_lat)*math.sin(d_long))**2 + ((math.cos(start_lat)*math.sin(end_lat)) - (math.sin(start_lat)*math.cos(end_lat)*math.cos(d_long)))**2) 

    c = math.atan(x/y) 

    return EARTH_R*c 

f = geocalc(36.12, -86.67, 33.94, -118.40) 
print f 
başında doğru, belki bu olmalı

Bildirim Gönderiminizde bu satırı:

(1) end_lat = math.radians(end_long) biri olarak end_lat = math.radians(end_lat)

(2) Eğer eksik bazı şeyler olmalıdır: Sen 4 ya da 5 veya 6 sorunlarımız var end_lat = math.radians(end_long)

+0

'fabs()' 'a ihtiyaç duymazsınız, çünkü 'cos (-x) == cos (x)' –

+0

-1 Bu,' atan2' yerine 'atan' kullandığınız için olağanüstü yanlış gidebilir. Örnekler: güneyden 45 dereceden -45 dereceye kadar olan mesafe 10010 km'dir (OK), ancak 45.1 ila -45.1 derece arası (biraz daha uzun mesafe) MINUS 9988 km üretir. Kuzey kutbundan güney kutbuna bir yolculuk SIFIR km! –

+0

@JohnMachin, bu özel uygulama için doğru olan fabs() yorumuna ilişkin olarak, ancak delta kavramını öğretirken mutlak değerlerin kullanımı basit bir çıkarma değil doğrudur. – sgallen