In this post, I would like to share some simple code to calculate geographical distances by using latitude and longitude points from some third-party services. This is particular useful when we wish to compute the average distances users travel from the check-in or geo-tagging information from Twitter, for instance. The code is straightforward and simple.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | import math import sys import os ## Convert a location into 3d Corordinates ## location is a list of [latitude,longtidue] ## return: a list of [x,y,z] def convert_location_cor(location): x_n = math.cos(math.radians(location[0])) * math.cos(math.radians(location[1])) y_n = math.cos(math.radians(location[0])) * math.sin(math.radians(location[1])) z_n = math.sin(math.radians(location[0])) return [x_n,y_n,z_n] ## Convert a 3d Corordinates into a location ## cor is a list of [x,y,z] ## return: a list of [latitude, longtitude] def convert_cor_location(cor): r = math.sqrt(cor[0] * cor[0] + cor[1] * cor[1]+ cor[2] * cor[2]) lat = math.asin(cor[2] / r) log = math.atan2(cor[1], cor[0]) return [math.degrees(lat),math.degrees(log),math.degrees(r)] ## Compute the geographical midpoint of a set of locations ## location_list is a list of locations [locaiton 0, location 1, location 2] ## return: the location of midpoint def geo_midpoint(location_list): x_list = [] y_list = [] z_list = [] for i in range(len(location_list)): m = convert_location_cor(location_list[i]) x_list.append(m[0]) y_list.append(m[1]) z_list.append(m[2]) x_mean = sum(x_list) / float(len(location_list)) y_mean = sum(y_list) / float(len(location_list)) z_mean = sum(z_list) / float(len(location_list)) return convert_cor_location([x_mean,y_mean,z_mean]) ## Compute the distance between two locations ## a and b are two locations: [lat 1, lon 1] [lat 2, lon 2] ## return: the distance in KM def geo_distance(a,b): theta = a[1] - b[1] dist = math.sin(math.radians(a[0])) * math.sin(math.radians(b[0])) \ + math.cos(math.radians(a[0])) * math.cos(math.radians(b[0])) * math.cos(math.radians(theta)) dist = math.acos(dist) dist = math.degrees(dist) distance = dist * 60 * 1.1515 * 1.609344 return distance ## main program if __name__ == '__main__': l_list = [] l_list.append([-8.70934,115.173695]) l_list.append([-8.70934,115.235514]) l_list.append([-8.591728,115.235514]) l_list.append([-8.591728,115.173695]) midpoint = geo_midpoint(l_list) print geo_distance([-8.70934,115.173695],[-8.70934,115.235514]) |