根据经纬度计算两点之间的直线距离(算法)

 

Talk is cheap, show me the code.

 

import lombok.extern.slf4j.Slf4j;

/**
 * 根据经纬度,计算2点之间的直线距离。
 * 距离较近的场景,可以使用,误差较小。
 * 距离较远的场景,要考虑具体的业务场景。
 * 因为这个只是计算直线距离,和实际的路线不同,所以要结合场景,看是否适用
 */
@Slf4j
public class CalCulateDistanceUtils {

    /**
     * 地球半径(这里取的是平均半径)
     */
    private static final double EARTH_RADIUS = 6.371229 * 1e6;

    /**
     * @param lng1 地点A的经度
     * @param lat1 地点A的纬度
     * @param lng2 地点B的经度
     * @param lat2 地点B的纬度
     * @return 返参 double 单位千米(km)
     */
    public static double calculateDistance(double lng1, double lat1, double lng2, double lat2) {

        double x = (lng2 - lng1) * Math.PI * EARTH_RADIUS * Math.cos(((lat1 + lat2) / 2) * Math.PI / 180) / 180;
        double y = (lat1 - lat2) * Math.PI * EARTH_RADIUS / 180;

        // 默认是米,除以1000,返回千米
        return Math.hypot(x, y) / 1000;
    }

    public static void main(String[] args) {

        // 信阳的经度
        Double lng1 = 114.097708;
        // 信阳的纬度
        Double lat1 = 32.167521;

        // 佳木斯的经度
        Double lng2 = 130.324123;
        // 佳木斯的纬度
        Double lat2 = 46.812022;

        // 运行后,控制台打印:佳木斯到信阳的距离:2142.6376176855483千米
        log.info("佳木斯到信阳的距离:{}千米", calculateDistance(lng1, lat1, lng2, lat2));
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值