Python haversine formülü

Merhaba. Python’da haversine formülünü kullanmaya çalışıyorum. Vikipediden bakarak formülü aşağıdaki gibi yazmaya çalıştım. Ancak program benim beklediğim sonuçlardan çok farklı sonuçlar veriyor. Örneğin

python haversine.py 0,0 0,1

Çıktısı normalde 111 km olması gerekirken 6371 çıkıyor. Kodlar:

import math
import sys

def getargs(num):
    xy = ["e","b"]
    argv1 = [float(i) for i in sys.argv[num].split(",")]
    val1 = list(zip(xy,argv1))
    return {k:v for k, v in val1}

def hav(arg):
    return math.sin(arg/2)**2

def formula(loc1, loc2, r):
    degree = hav(loc2["e"]-loc1["e"]) + (1-hav(loc1["e"]-loc2["e"])-hav(loc1["e"]+loc2["e"])) * hav(loc2["b"]+loc1["e"])
    result = 2*r*math.asin(degree**(1/2))
    return result

formula(getargs(1),getargs(2),6371)

Fast Haversine distance with NumPY · GitHub

Bunu denediniz mi?

Her zaman biri daha önce denemiş mi diye bakarım.

3 Beğeni

Haversine Formula in Python benim için çalıştı

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

def haversine(lon1, lat1, lon2, lat2):
    """
    Calculate the great circle distance in kilometers 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)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles. Determines return value units.
    return c * r
1 Beğeni

Kaynak da vereyim:

Haversine Formula in Python (Bearing and Distance between two GPS points) - Stack Overflow

1 Beğeni

Merhaba Python’daki kullandığınız trigonometrik fonksiyonlar derece yerine radyan kabul ediyor, dolayısıyla {k: v ...} yerine {k: math.radians(v) ...} yapabilirsiniz. Bir de formülde şu kısımda bir hata var:

5 Beğeni

Teşekkürler hocam. Dediğiniz yeri düzelttim ve doğru çalışıyor. Dediğiniz kısımdaki hata nedir anlayamadım?

Bakmıştım ama problem çok kompleks olmadığı olmadığı sürece öğretici olsun diye hazır kod kullanmamaya çalışıyorum hocam.

1 Beğeni

Zevk meselesi saygı duyarım.

KISS prensibi “Keep it Simple and Stupid”…

Kodu hep basit yazana bakarım…

Adamların yaklaşımı hoşuma gitti.

1 Beğeni

Merhaba. Farklı örneklerde denediğim zaman kodlar yanlış sonuç çıkarıyor.

python haversine.py 39,32 41,28

Normalde 350 km çıktısı vermesi gerekirken 6000 gibi bir sonuç çıkarıyor.

Burada boylamların farkını almanız gerekiyor; Wikipedia’daki “λ₂ - λ₁” kısmı oluyor. Yanıt 400 küsur geliyor, 350 olması gerektiği kısmını bilemiyorum.

Sağolun hocam. Gözümden kaçmış. Niye 350 olması gerektiği halde 400 geldiğini ben de anlamadım.

350 olması gerektiğini nereden hesaplamıştınız

Normalde İstanbul-Ankara arası kuş uçuşu mesafe 350 km olması gerekirken formülde İstanbul ve Ankara’nın koordinatlarını koyduğum zaman sonuç 480 küsür çıktı.

Anladım; Ankara ve İstanbul’un biraz daha kesin enlem ve boylam değerleriyle programınızı denediğimde 350.36 kilometre elde ettim. Sağladığım enlem ve boylam değerleri şunlar:

  • Ankara:  39.925533, 32.866287
  • İstanbul: 41.015137, 28.979530

Şu siteden. Öncesinde “39, 32” ve “41, 28” şeklinde deniyorduk; ama aslında mesela İstanbul’un boylamı neredeyse 29. Dört değerden üçü bir üstlerindeki tam sayıya daha yakın, yani “40, 33” ve “41, 29” yuvarlamaları ile de 350’ye yakın bir değer elde ediyoruz.

2 Beğeni

Yardımlarınız için teşekkür ederim hocam. Küsürat kısmının o kadar önemli olduğunu bilmiyordum. Dediğiniz düzeltmelerle program tam istediğim gibi çalışıyor.

1 Beğeni