diff --git a/src/distance.rs b/src/distance.rs new file mode 100644 index 0000000..17eeefe --- /dev/null +++ b/src/distance.rs @@ -0,0 +1,17 @@ +const EARTH_RAD_METERS: f64 = 6371e3; + +type LatLon = (f64, f64); + +pub fn haversine(a: LatLon, b: LatLon) -> f64 { + let a_latitude = a.0.to_radians(); + let b_latitude = b.0.to_radians(); + + let delta_latitude = (b.0 - a.0).to_radians(); + let delta_longitude = (b.1 - a.1).to_radians(); + + let central_angle_inner = (delta_latitude / 2.0).sin().powi(2) + + a_latitude.cos() * b_latitude.cos() * (delta_longitude / 2.0).sin().powi(2); + let central_angle = 2.0 * central_angle_inner.sqrt().asin(); + + EARTH_RAD_METERS * central_angle +}