java如何计算两个地点之间的距离

要解决这个问题,首先得熟悉一下Haversine公式。

Haversine 公式是一种用于计算球面上两个点之间最短距离(大圆距离)的数学公式。这个公式通常用于地球表面的距离计算,特别是在导航和地理信息系统 (GIS) 中。

两点间的大圆距离可以通过球面三角形的边和角来计算。在 Haversine 公式中,给定两个点的纬度和经度,可以使用以下公式计算它们之间的距离:

a = sin⁡²(Δlat/2) + cos⁡(lat1) · cos⁡(lat2) · sin⁡²(Δlon/2)

c = 2 · atan2(√a​,√(1−a)​)

distance = radius · c

其中:

  • lat1​ 和 lon1​ 是第一个点的纬度和经度,lat2​ 和 lon2​ 是第二个点的纬度和经度。
  • Δlat = lat2 ​− lat1​,Δlon = lon2 ​− lon1​。
  • sin 和 ⁡cos 是正弦和余弦函数。
  • atan2 是反正切函数,它返回给定两个参数的反正切值。
  • a 是球面三角形的一边,c 是球面上的弧长,distance 是两点之间的球面距离。
  • radius 是球体的半径,通常取地球的平均Haversine 公式的优点在于它适用于小距离的球面距离计算,并且不涉及复杂的三角函数。在实际应用中,这个公式通常被用于计算地球上两个地点之间的距离。

知晓了原理,就可以开始行动了,下面是java代码实现:

    /**
     * 地球半径
     */
    private static final double EARTH_RADIUS_KM = 6371.0;

    /**
     * Haversine公式计算距离
     *
     * @param lat1  纬度1
     * @param lon1  经度1
     * @param lat2  纬度2
     * @param lon2  经度2
     * @return 两点之间的距离(km)
     */
    public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) {
        //将经纬度转换为弧度
        double lat1Rad = Math.toRadians(lat1);
        double lon1Rad = Math.toRadians(lon1);
        double lat2Rad = Math.toRadians(lat2);
        double lon2Rad = Math.toRadians(lon2);

        //计算经纬度的差值
        double deltaLat = lat2Rad - lat1Rad;
        double deltaLon = lon2Rad - lon1Rad;

        //用Haversine公式计算
        double a = Math.pow(Math.sin(deltaLat / 2), 2)
                + Math.cos(lat1Rad)
                * Math.cos(lat2Rad)
                * Math.pow(Math.sin(deltaLon / 2), 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        double distance = EARTH_RADIUS_KM * c;

        //四舍五入取小数点后两位
        return CurrencyUtil.roundToTwoDecimalPlaces(distance);
    }

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向阳不像羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值