You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用经纬度计算两地距离并查找两点间的地点

经纬度计算两点距离及查找中间地点的方案

一、计算两点间距离的方法

常用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:36:34