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;
|
}
|
}
|
}
|