pub fn distance(mut lat1: f64, mut lon1: f64, mut lat2: f64, mut lon2: f64, unit: &str) -> f64 {
let earth_radius = 6371.0;
fn convert_degrees_to_radians(degrees: f64) -> f64
{
return degrees * std::f64::consts::PI / 180.0;
}
lat1 = convert_degrees_to_radians(lat1);
lon1 = convert_degrees_to_radians(lon1);
lat2 = convert_degrees_to_radians(lat2);
lon2 = convert_degrees_to_radians(lon2);
let v_lon = (lon1 - lon2).abs();
let v_lat = (lat1 - lat2).abs();
fn haver_sin(theta: f64) -> f64 {
let v = (theta / 2.0).sin();
return v * v;
}
let h = haver_sin(v_lat) + lat1.cos() * lat2.cos() * haver_sin(v_lon);
let distance = 2.0 * earth_radius * h.sqrt().asin();match unit {
"m" => {
return distance * 1000.0;
}
"km" => {
return distance;
}
_ => {
return distance;
}
}
}