Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for Earth Distances by tom-tom
from re import match
from math import sin, cos, acos, radians
from operator import mul
R = 6371
def distance(first, second):
def angle(coord):
res = radians(int(coord[0]) + int(coord[1]) / 60 + int(coord[2]) / 3600)
return res if coord[3] in 'NE' else -res
def cartesian(coords):
m = match('(\d+)°(\d+)′(\d+)″(N|S)[ ,]+(\d+)°(\d+)′(\d+)″(E|W)', coords)
latitude = angle(m.group(1, 2, 3, 4))
longitude = angle(m.group(5, 6, 7, 8))
return (cos(latitude) * cos(longitude),
cos(latitude) * sin(longitude),
sin(latitude))
return R * acos(sum(map(mul, cartesian(first), cartesian(second))))
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
def almost_equal(checked, correct, significant_digits=1):
precision = 0.1 ** significant_digits
return correct - precision < checked < correct + precision
assert almost_equal(
distance(u"51°28′48″N 0°0′0″E", u"46°12′0″N, 6°9′0″E"), 739.2), "From Greenwich to Geneva"
assert almost_equal(
distance(u"90°0′0″N 0°0′0″E", u"90°0′0″S, 0°0′0″W"), 20015.1), "From South to North"
assert almost_equal(
distance(u"33°51′31″S, 151°12′51″E", u"40°46′22″N 73°59′3″W"), 15990.2), "Opera Night"
Oct. 9, 2016