feiyu02
2025-01-08 cf4a07510de9b954c3f7393d54206eece7d6ad4a
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.flightfeather.uav.common.utils
 
import kotlin.math.PI
import kotlin.math.asin
import kotlin.math.cos
import kotlin.math.sin
 
object MapUtil {
 
    private const val Ea = 6378137 //赤道半径
    private const val Eb = 6356725 //极半径
 
    /**
     * 根据坐标点、距离和角度,获取另一个坐标
     * @param pos 坐标点(GPS系)
     * @param len 距离(米)
     * @param radian 弧度
     */
    fun getPointByLen(pos: Pair<Double, Double>, len: Double, radian: Double): Pair<Double, Double> {
        val dx = len * sin(radian)
        val dy = len * cos(radian)
        val ec = Eb + (Ea - Eb) * (90.0 - pos.second) / 90.0
        val ed = ec * cos(pos.second * PI / 180)
        val lng = (dx / ed + pos.first * PI / 180.0) * 180.0 / PI
        val lat = (dy / ec + pos.second * PI / 180.0) * 180.0 / PI
        return Pair(lng, lat)
    }
 
    /**
     * 获取两个经纬度之间的角度(0度-360度)
     */
    fun getAngle(lngA: Double, latA: Double, lngB: Double, latB: Double): Double {
        val a = ((90 - latB) * Math.PI) / 180;
        val b = ((90 - latA) * Math.PI) / 180;
        val AOC_BOC = ((lngB - lngA) * Math.PI) / 180;
        val cosc = cos(a) * Math.cos(b) + Math.sin(a) * Math.sin(b) * Math.cos(AOC_BOC);
        val sinc = Math.sqrt(1 - cosc * cosc);
        val sinA = (Math.sin(a) * Math.sin(AOC_BOC)) / sinc;
        val A = (Math.asin(sinA) * 180) / Math.PI;
        var res = 0.0;
        if (lngB > lngA && latB > latA) res = A;
        else if (lngB > lngA && latB < latA) res = 180 - A;
        else if (lngB < lngA && latB < latA) res = 180 - A;
        else if (lngB < lngA && latB > latA) res = 360 + A;
        else if (lngB > lngA && latB == latA) res = 90.0;
        else if (lngB < lngA && latB == latA) res = 270.0;
        else if (lngB == lngA && latB > latA) res = 0.0;
        else if (lngB == lngA && latB < latA) res = 180.0;
        return res;
    }
 
    /**
     * 获取两经纬度间的距离
     */
    fun getDistance(lng1: Double, lat1: Double, lng2: Double, lat2: Double): Double {
//        lat1 = lat1 || 0;
//        lng1 = lng1 || 0;
//        lat2 = lat2 || 0;
//        lng2 = lng2 || 0;
 
        val rad1 = (lat1 * Math.PI) / 180.0;
        val rad2 = (lat2 * Math.PI) / 180.0;
        val a = rad1 - rad2;
        val b = (lng1 * Math.PI) / 180.0 - (lng2 * Math.PI) / 180.0;
        val distance =
            Ea * 2 * asin(
                Math.sqrt(
                    Math.pow(
                        Math.sin(a / 2),
                        2.0
                    ) + Math.cos(rad1) * Math.cos(rad2) * Math.pow(Math.sin(b / 2), 2.0)
                )
            );
 
        return distance;
    }
 
    /**
     * 角度增减,确保角度处于0 - 360度之间
     * @param angle 原角度
     * @param offset 偏移量
     */
    fun plusAngle(angle: Double, offset: Double): Double {
        val result = angle + offset;
        return if (result > 360) {
            result - 360;
        } else if (result < 0) {
            result + 360;
        } else {
            result;
        }
    }
}