import Foundation
// ------------------------------------------------------------
// Convert degrees to radians
// ------------------------------------------------------------
func degToRad(_ deg: Double) -> Double {
return deg * Double.pi / 180.0
}
// ------------------------------------------------------------
// 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.
// ------------------------------------------------------------
func haversine(lat1: Double, lon1: Double,
lat2: Double, lon2: Double) -> Double {
// Earth's mean radius in kilometers
let R: Double = 6371.0
// Convert all angles to radians
let rlat1 = degToRad(lat1)
let rlon1 = degToRad(lon1)
let rlat2 = degToRad(lat2)
let rlon2 = degToRad(lon2)
// Differences
let dlat = rlat2 - rlat1
let dlon = rlon2 - rlon1
// Haversine formula
// a is the Haversine of the central angle between the two points.
let a =
pow(sin(dlat / 2), 2) +
cos(rlat1) * cos(rlat2) *
pow(sin(dlon / 2), 2)
// Central angle
// c is the central angle between the two points on the Earth’s surface.
let c = 2 * asin(sqrt(a))
// Final distance
return R * c
}
// ------------------------------------------------------------
// Main
// ------------------------------------------------------------
// Example coordinates:
// Austin, Texas
let lat1: Double = 30.2672
let lon1: Double = -97.7431
// Houston, Texas
let lat2: Double = 29.7604
let lon2: Double = -95.3698
let distanceKm: Double = haversine(lat1: lat1, lon1: lon1,
lat2: lat2, lon2: lon2)
// Convert kilometers to miles
let distanceMiles: Double = distanceKm * 0.621371
print(String(format: "Distance: %.3f km", distanceKm))
print(String(format: "Distance: %.3f miles", distanceMiles))
/*
run:
Distance: 235.352 km
Distance: 146.241 miles
*/