如何利用经纬度计算两地距离并查找两点间的地点
经纬度计算两点距离及查找中间地点的方案
一、计算两点间距离的方法
常用Haversine公式计算球面上两点的大圆最短距离,步骤如下:
- 将两点的纬度、经度从十进制角度转换为弧度
- 计算纬度差、经度差的半值
- 代入公式计算中心角,再乘以地球半径得到距离
简化后的公式:distance = 2 * R * arcsin( sqrt( sin²((lat2-lat1)/2) + cos(lat1)*cos(lat2)*sin²((lon2-lon1)/2) ) )
其中R为地球半径,通常取6371千米(平均半径)或6378千米(赤道半径)。
二、查找两点间所有地点的思路
核心是确定覆盖连线范围的查询边界,或生成连线上的采样点再查询:
- 方法1:生成边界框
取两点的最小/最大纬度、经度作为矩形边界,查询数据库中落在该范围内的地点,再筛选出距离连线一定阈值内的点。 - 方法2:沿连线生成采样点
先计算两点总距离,按固定步长(如50米)生成连线上的一系列中间坐标,查询每个采样点附近的地点,去重后得到结果。你提供的代码就是生成距离偏移后坐标的工具,适合这种采样场景。
三、给定Kotlin代码解析
原代码存在Kotlin语法错误,修正后并逐行解释如下:
fun getNewLatLongs(latitude: Double, longitude: Double, distance: Float): Pair<Double, Double> { val earthRadius = 6378.137 // 地球赤道半径(单位:千米) val pi = Math.PI // 计算1米对应的角度值:先求每度对应的米数,再取倒数得到每米对应的度数 val metersPerDegree = 2 * pi * earthRadius / 360 * 1000 val degreesPerMeter = 1 / metersPerDegree // 向北移动指定距离后的纬度:纬度方向每度距离固定,直接累加 val newLatitude = "%.4f".format(latitude + distance * degreesPerMeter).toDouble() // 向东移动指定距离后的经度:经度方向每度距离随纬度变化,需用cos(lat弧度)修正 val newLongitude = "%.4f".format( longitude + distance * degreesPerMeter / kotlin.math.cos(latitude * pi / 180) ).toDouble() return Pair(newLatitude, newLongitude) }
代码说明:
- 地球半径取赤道半径,适合低纬度区域计算,通用场景可改用平均半径6371千米
degreesPerMeter是1米对应的经纬度度数,经度方向因地球球面特性,越靠近极点每度距离越短,因此用cos(lat弧度)调整- 用
"%.4f"保留4位小数,避免精度冗余
若要生成两点间的中间点,短距离场景可直接对经纬度做线性插值;长距离场景需先计算两点间的方位角,再按步长逐步移动生成坐标。
内容的提问来源于stack exchange,提问作者Guru Mohish
相关产品推荐
相关产品推荐

