feiyu02
2025-03-28 7d74f3fd087d4a8192ed556a6c2e3a2ea3c81cff
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
package cn.flightfeather.supervision.business.location
 
import kotlin.math.*
 
object CoordinateUtil {
 
    private const val Ea = 6378137 //赤道半径
    private const val Eb = 6356725 //极半径
 
    /**
     * 根据坐标点、距离和角度,获取另一个坐标
     * @param pos 坐标点
     * @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)
    }
 
    /**
     * 纬度相同时
     * 距离转换为经度
     */
    fun disToLng(distance: Double): Double {
        return distance * 0.00001
    }
 
    fun calculateDistance(lon1: Double, lat1: Double, lon2: Double, lat2: Double): Double {
        val R = 6371; // 地球平均半径,单位公里
        val dLat = (lat2 - lat1) * Math.PI / 180;
        val dLon = (lon2 - lon1) * Math.PI / 180;
        val a = sin(dLat / 2) * sin(dLat / 2) +
                cos(lat1 * Math.PI / 180) * cos(lat2 * Math.PI / 180) *
                sin(dLon / 2) * sin(dLon / 2);
        val c = 2 * atan2(sqrt(a), sqrt(1 - a));
        val distance = R * c;
        return distance;
    }
 
}