1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/// 经纬度坐标计算距离的方法
/// 经纬度距离计算 Haversine 公式
/// * lat1 纬度 起点 0-90
/// * lon1 经度 起点 0-180
/// * lat2 纬度 终点 0-90
/// * lon2 经度 终点 0-180
/// * unit m 米 km 公里
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();// km
    match unit {
        "m" => {
            return distance * 1000.0;
        }
        "km" => {
            return distance;
        }
        _ => {
            return distance;
        }
    }
}