近段时间的学习碎片整理(31)

一、最近有需要地图坐标的计算,主要有

(1)当前位置到另外两个坐标连成线距离的计算

(2)两个坐标点连成线形成的方位角的计算

  1. 点到直线距离的计算

原理及解释可参考文章: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))
    }
  1. 两个坐标点连成线形成的方位角的计算

同样的,原理及解释参考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、重点重点重点----记得排查结束后去掉这两行代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值