# ------------------------------------------------------------
# Convert degrees to radians
# ------------------------------------------------------------
def deg_to_rad(deg)
deg * Math::PI / 180.0
end
# ------------------------------------------------------------
# Compute the great-circle distance between two points on Earth
# using the Haversine formula.
# lat1, lon1, lat2, lon2 are in degrees.
# The result is returned in kilometers.
# ------------------------------------------------------------
def haversine(lat1, lon1, lat2, lon2)
# Earth's mean radius in kilometers
r = 6371.0
# Convert all angles to radians
rlat1 = deg_to_rad(lat1)
rlon1 = deg_to_rad(lon1)
rlat2 = deg_to_rad(lat2)
rlon2 = deg_to_rad(lon2)
# Differences
dlat = rlat2 - rlat1
dlon = rlon2 - rlon1
# Haversine formula
# a is the Haversine of the central angle between the two points.
a =
Math.sin(dlat / 2)**2 +
Math.cos(rlat1) * Math.cos(rlat2) *
Math.sin(dlon / 2)**2
# Central angle
# c is the central angle between the two points on the Earth’s surface.
c = 2 * Math.asin(Math.sqrt(a))
# Final distance
r * c
end
# ------------------------------------------------------------
# Main
# ------------------------------------------------------------
# Example coordinates:
# Austin, Texas
lat1 = 30.2672
lon1 = -97.7431
# Houston, Texas
lat2 = 29.7604
lon2 = -95.3698
distance_km = haversine(lat1, lon1, lat2, lon2)
# Convert kilometers to miles
distance_miles = distance_km * 0.621371
puts "Distance: #{format('%.3f', distance_km)} km"
puts "Distance: #{format('%.3f', distance_miles)} miles"
=begin
run:
Distance: 235.352 km
Distance: 146.241 miles
=end