| | |
| | | package com.flightfeather.uav.common.utils |
| | | |
| | | import kotlin.math.PI |
| | | import kotlin.math.asin |
| | | import kotlin.math.cos |
| | | import kotlin.math.sin |
| | | |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |