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)
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
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:
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.
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.
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.