1pub fn distance(mut lat1: f64, mut lon1: f64, mut lat2: f64, mut lon2: f64, unit: &str) -> f64 {
9 let earth_radius = 6371.0;
10 fn convert_degrees_to_radians(degrees: f64) -> f64
11 {
12 degrees * std::f64::consts::PI / 180.0
13 }
14 lat1 = convert_degrees_to_radians(lat1);
15 lon1 = convert_degrees_to_radians(lon1);
16 lat2 = convert_degrees_to_radians(lat2);
17 lon2 = convert_degrees_to_radians(lon2);
18 let v_lon = (lon1 - lon2).abs();
19 let v_lat = (lat1 - lat2).abs();
20 fn haver_sin(theta: f64) -> f64 {
21 let v = (theta / 2.0).sin();
22 v * v
23 }
24 let h = haver_sin(v_lat) + lat1.cos() * lat2.cos() * haver_sin(v_lon);
25 let distance = 2.0 * earth_radius * h.sqrt().asin();match unit {
27 "m" => {
28 distance * 1000.0
29 }
30 "km" => {
31 distance
32 }
33 _ => {
34 distance
35 }
36 }
37}