In this tutorial, we will show you how to calculate the distance between two locations geolocated by using latitude and longitude in Ruby. This distance calculation uses the Spherical Law of Cosines, which uses trigonometry to measure the curvature of the earth, to accurately measure the distances on the Earth.
def distance(lat1, lon1, lat2, lon2, unit)
if (lat1 == lat2) && (lon1 == lon2)
return 0
else
theta = lon1 - lon2
dist = Math.sin(lat1 * Math::PI / 180) * Math.sin(lat2 * Math::PI / 180) + Math.cos(lat1 * Math::PI / 180) * Math.cos(lat2 * Math::PI / 180) * Math.cos(theta * Math::PI / 180)
dist = Math.acos(dist)
dist = dist * 180 / Math::PI
miles = dist * 60 * 1.1515
unit = unit.upcase
if unit == 'K'
return miles * 1.609344
elsif unit == 'N'
return miles * 0.8684
else
return miles
end
end
end
puts distance(32.9697, -96.80322, 29.46786, -98.53506, "M").to_s + " Miles";
puts distance(32.9697, -96.80322, 29.46786, -98.53506, "K").to_s + " Kilometers";
puts distance(32.9697, -96.80322, 29.46786, -98.53506, "N").to_s + " Nautical Miles";
The code above creates the function named distance to calculate the distance between two locations. It implies the simple spherical law of cosines that gives well-conditioned results down to distances as small as a few meters on the Earth’s surface. The distance function makes use of the spherical law of cosines formula cos c = cos a cos b + sin a sin b cos C
and derived into the distance calculation.
Parameters that are passed to the distance function are:
lat1, lon1 = Latitude and Longitude of point 1 in decimal degrees
lat2, lon2 = Latitude and Longitude of point 2 in decimal degrees
unit = the unit you desire for results where ‘M’ is the statute miles (default), ‘K’ is kilometers and ‘N’ is nautical miles