br_maths/
maths.rs

1/// 经纬度坐标计算距离的方法
2/// 经纬度距离计算 Haversine 公式
3/// * lat1 纬度 起点 0-90
4/// * lon1 经度 起点 0-180
5/// * lat2 纬度 终点 0-90
6/// * lon2 经度 终点 0-180
7/// * unit m 米 km 公里
8pub 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();// km
26    match unit {
27        "m" => {
28            distance * 1000.0
29        }
30        "km" => {
31            distance
32        }
33        _ => {
34            distance
35        }
36    }
37}