一、最近有需要地图坐标的计算,主要有
(1)当前位置到另外两个坐标连成线距离的计算
(2)两个坐标点连成线形成的方位角的计算
点到直线距离的计算
原理及解释可参考文章:https://blog.csdn.net/ufoxiong21/article/details/46487001
代码如下:
private const val EARTH_RADIUS = 6378137
private const val D2R = PI / 180.0
/**
* 经纬坐标中求点到线段的距离的方法
* @param x1 Double 起点lat坐标
* @param y1 Double 起点lon坐标
* @param x2 Double 终点lat坐标
* @param y2 Double 终点lat坐标
* @param x3 Double 当前点lat坐标
* @param y3 Double 当前点lon坐标
* @return Double 点到直线的距离
*/
fun distToLineSegment(x1: Double, y1: Double, x2: Double, y2: Double, x3: Double, y3: Double): Double {
val a = getDistance(y1, x1, y2, x2)//起始点距离
val b = getDistance(y2, x2, y3, x3)
val c = getDistance(y1, x1, y3, x3)
return when {
b * b >= c * c + a * a -> c
c * c >= b * b + a * a -> b
else -> 2 * haLun(a, b, c) / a
}
}
private fun getDistance(lng1: Double, lat1: Double, lng2: Double, lat2: Double): Double {
val radLng1 = lat1 * D2R
val radLng2 = lat2 * D2R
val a = radLng1 - radLng2
val b = (lng1 - lng2) * D2R
return 2 * asin(sqrt(sin(a / 2).pow(2.0) + cos(radLng1) * cos(radLng2) * sin(b / 2).pow(2.0))) * EARTH_RADIUS
}
//海伦公式
private fun haLun(aa: Double, bb: Double, cc: Double): Double {
val pp = (aa + bb + cc) / 2
return sqrt(pp * (pp - aa) * (pp - bb) * (pp - cc))
}
两个坐标点连成线形成的方位角的计算
同样的,原理及解释参考https://blog.csdn.net/weixin_42089228/article/details/120574658这篇文章
代码如下:
/**
* 计算两个坐标连线的方位角
* @param firstLat Double 开始坐标lat
* @param firstLon Double 开始坐标lng
* @param secondLat Double 终点坐标lat
* @param secondLon Double 终点坐标lng
* @return Double 方位角
*/
fun calculateAngel(firstLat: Double, firstLon: Double, secondLat: Double, secondLon: Double): Double {
if (secondLon == firstLon) {
return if (secondLat == firstLat) {
// 横坐标相同、纵坐标相同
-1.0
}else {
// 横坐标相同、纵坐标不同
if (secondLat > firstLat) 0.0 else 180.0
}
}else {
if (secondLat == firstLat) {
// 横坐标不同、纵坐标相同
return if (secondLat > firstLat) 90.0 else -90.0
}else {
val firstSideLength = secondLon - firstLon
val secondSideLength = secondLat - firstLat
val thirdSideLength = sqrt(firstSideLength.pow(2.0) + secondSideLength.pow(2.0))
val cosValue = firstSideLength / thirdSideLength
val radValue = acos(cosValue)
val angleValue = radValue * 180 / PI
return if (angleValue < 90) {
if (secondSideLength > 0) 90 - angleValue else 90 + angleValue
}else {
if (secondSideLength > 0) 90 - angleValue else angleValue - 270
}
}
}
}
二、出现debug包正常运行,安装release包闪退不知道原因如何排查?(参考https://www.jianshu.com/p/758a020dc906)
1、添加配置调试release包,这样的抓取的log日志,这种方式可以知道具体错误,(无法精准到是哪一行)
/在 AndroidManifest.xml 文件的 application 标签中
添加以下配置,即可在release包下的日志了/
android:debuggable="true"
tools:ignore="HardcodedDebugMode"
2、重点重点重点----记得排查结束后去掉这两行代码