I thought I would post some of the bite-sized coding pieces I've done recently. To lead off, here's Ruby function to find the distance between two points given their latitude and longitude.
Latitude is given in degrees north of the equator (use negatives for the Southern Hemisphere) and longitude is given in degrees east of the Prime Meridian (optionally use negatives for the Western Hemisphere).
include Math DEG2RAD = PI/180.0 def lldist(lat1, lon1, lat2, lon2) rho = 3960.0 theta1 = lon1*DEG2RAD phi1 = (90.0-lat1)*DEG2RAD theta2 = lon2*DEG2RAD phi2 = (90.0-lat2)*DEG2RAD val = sin(phi1)*sin(phi2)*cos(theta1-theta2)+cos(phi1)*cos(phi2) val = [-1.0, val].max val = [ val, 1.0].min psi = acos(val) return psi*rho end
A couple of notes:
- Everything with
valat the bottom is to deal with an edge case that can crop up when you try to get the distance between a point and itself. In that case
valshould be equal to 1.0, but on my systems some floating-point errors creep in and I get 1.0000000000000002, which is out of range for the
- This returns the distance in miles. If you want some other unit, redefine
rhowith the appropriate value for the radius of the earth in your desired unit (6371 km, 1137 leagues, 4304730 passus, or what have you).
- This assumes the Earth is spherical, which is a decent first approximation, but is still just that: a first approximation. 1
I am currently writing a second version to account for the difference between geographic and geocentric latitude which should do a good job of accounting for the Earth's eccentricity. The math is not hard, but finding ground truth to validate my results against is, since the online calculators I've tried to check against do not make their assumptions clear. I did find a promising suite of tools for pilots, and I'd hope if you're doing something as fraught with consequences as flying that you've accounted for these sorts of things.