solverforge_maps/routing/
geo.rs

1//! Geographic utility functions.
2
3use super::coord::Coord;
4
5pub fn coord_key(lat: f64, lng: f64) -> (i64, i64) {
6    ((lat * 1e7).round() as i64, (lng * 1e7).round() as i64)
7}
8
9pub fn haversine_distance(a: Coord, b: Coord) -> f64 {
10    const R: f64 = 6_371_000.0;
11
12    let lat1_rad = a.lat.to_radians();
13    let lat2_rad = b.lat.to_radians();
14    let dlat = (b.lat - a.lat).to_radians();
15    let dlng = (b.lng - a.lng).to_radians();
16
17    let h =
18        (dlat / 2.0).sin().powi(2) + lat1_rad.cos() * lat2_rad.cos() * (dlng / 2.0).sin().powi(2);
19    let c = 2.0 * h.sqrt().asin();
20
21    R * c
22}