Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
great circle distance in python
"""Distance helpers."""
import math
EARTH_CIRCUMFERENCE = 6378137 # earth circumference in meters
def great_circle_distance(latlong_a, latlong_b):
"""
>>> coord_pairs = [
... # between eighth and 31st and eighth and 30th
... [(40.750307,-73.994819), (40.749641,-73.99527)],
... # sanfran to NYC ~2568 miles
... [(37.784750,-122.421180), (40.714585,-74.007202)],
... # about 10 feet apart
... [(40.714732,-74.008091), (40.714753,-74.008074)],
... # inches apart
... [(40.754850,-73.975560), (40.754851,-73.975561)],
... ]
>>> for pair in coord_pairs:
... great_circle_distance(pair[0], pair[1]) # doctest: +ELLIPSIS
83.325362855055...
4133342.6554530...
2.7426970360283...
0.1396525521278...
"""
lat1, lon1 = latlong_a
lat2, lon2 = latlong_b
dLat = math.radians(lat2 - lat1)
dLon = math.radians(lon2 - lon1)
a = (math.sin(dLat / 2) * math.sin(dLat / 2) +
math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) *
math.sin(dLon / 2) * math.sin(dLon / 2))
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
d = EARTH_CIRCUMFERENCE * c
return d
@gardiner

This comment has been minimized.

Copy link

gardiner commented Oct 19, 2012

EARTH_CIRCUMFERENCE should be EARTH_RADIUS. At least that's what the number is.

@joeatbayes

This comment has been minimized.

Copy link

joeatbayes commented Jul 1, 2015

Your code returns the wrong answer for the test ((47.64828, -122.52963), (47.61168, -122.33326)) compare it to google and several others. Your code understates the distance. Your code returns 15.284 km while other libraries returned 21.944km and google returned 12.7 miles which converts to 20.43km

@kannes

This comment has been minimized.

Copy link

kannes commented Apr 12, 2017

joeatbayes, that is to be expected. There are different formulas based on different earth models with different accuracies.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.