Search code examples
pythongeocodinggeogeography

Getting distance between two points based on latitude/longitude


I tried implementing the formula in Finding distances based on Latitude and Longitude. The applet does good for the two points I am testing:

Enter image description here

Yet my code is not working.

from math import sin, cos, sqrt, atan2

R = 6373.0

lat1 = 52.2296756
lon1 = 21.0122287
lat2 = 52.406374
lon2 = 16.9251681

dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))**2 + cos(lat1) * cos(lat2) * (sin(dlon/2))**2
c = 2 * atan2(sqrt(a), sqrt(1-a))
distance = R * c

print "Result", distance
print "Should be", 278.546

It returns the distance 5447.05546147. Why?


Solution

  • Just as a note, if you just need a quick and easy way of finding the distance between two points, I strongly recommend using the approach described in Kurt's answer below instead of reimplementing Haversine—see his post for rationale.

    This answer focuses just on answering the specific bug the OP ran into.


    It's because in Python, all the trigonometry functions use radians, not degrees.

    You can either convert the numbers manually to radians, or use the radians function from the math module:

    from math import sin, cos, sqrt, atan2, radians
    
    # Approximate radius of earth in km
    R = 6373.0
    
    lat1 = radians(52.2296756)
    lon1 = radians(21.0122287)
    lat2 = radians(52.406374)
    lon2 = radians(16.9251681)
    
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    
    a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
    c = 2 * atan2(sqrt(a), sqrt(1 - a))
    
    distance = R * c
    
    print("Result: ", distance)
    print("Should be: ", 278.546, "km")
    

    The distance is now returning the correct value of 278.545589351 km.