已知两点经纬度,求两点之间绝对距离(Java)

本文介绍了使用Haversine formula和Vincenty formula两种算法计算地球上两点间距离的方法。Haversine公式适用于快速估算,而Vincenty公式考虑了地球的椭球形状,精度更高。此外,还提供了坐标系转换的参考方法。
摘要由CSDN通过智能技术生成

本文给出两种距离算法(Haversine formula;Vincenty formula)

1.Haversine formula

本计算式选取地球模型为球模型,以赤道半径为基准,故计算时纬度越高误差会越大,但胜在快速,具体推导公式可自行Google或参考美团技术文档(引:https://tech.meituan.com/lucene-distance.html

package com.segment.position.calculate;


import com.segment.position.entity.Circle;
import com.segment.position.entity.Point;

import java.text.DecimalFormat;

/**
 * Haversine计算式,速度快误差较小,球模型
 */
public class DistanceCalculate
{
   
    private static final double EARTH_RADIUS = 6371e3;
    //private static final Logger logger = LoggerFactory.getLogger(DistanceCalculate.class);

    /**
     * 根据提供的两点经纬度获取两点间距离
     *
     * @param lat_one
     * @param lon_one
     * @param lat_two
     * @param lon_two
     * @return 两点距离
     */
    public static double getDistance(Double lat_one, Double lon_one, Double lat_two, Double lon_two)
    {
        double latOne = RadiansAngleCalculate.toRadians(lat_one);
        double latTwo = RadiansAngleCalculate.toRadians(lat_two);
        double latDiff = RadiansAngleCalculate.toRadians(lat_two - lat_one);
        double lonDiff = RadiansAngleCalculate.toRadians(lon_two - lon_one);

        double a = Math.sin(latDiff / 2) * Math.sin(latDiff / 2) + Math.cos(latOne) * Math.cos(latTwo) * Math.sin(lonDiff / 2) * Math.sin(lonDiff / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        DecimalFormat format = new DecimalFormat("0.00");
        //logger.info("两点间距离:{" + format.format(EARTH_RADIUS * c) + "米}");
        return Double.parseDouble(format.format(EARTH_RADIUS * c));
    }

    /**
     * 计算两点间距离
     *
     * @param point_one
     * @param point_two
     * @return
     */
    public static double getDistance(Point point_one, Point point_two)
    {
        //获取点内信息,计算两点距离
        return getDistance(point_one.getLatitude(), point_one.getLongitude(), point_two.getLatitude(), point_two.getLongitude());
    }

    public static double getDistance(Circle circle, Point point)
    {
        //计算点到圆心的距离
        double point_to_center = getDistance(circle.getCenter(), point);
        //返回点距圆环的距离(圆内则为负,圆外则为正)
        return point_to_center - circle.getRadius();
    }

    /**
     * 根据提供的圆和点信息判断点是否在圆内
     *
     * @param circle
     * @param point
     * @return
     */
    public static boolean isPointInCircle(Circle circle, Point point)
    {
        return getDistance(circle, point) < 0;
    }

}


package com.segment.position.calculate;

public class RadiansAngleCalculate
{
   

    /**
     * 根据提供的角度值,将其转化为弧度
     *
     * @param angle 角度值
     * @return 结果
     */
    public static double toRadians(Double angle)
    {
        double result = 0L;
        if (angle != null) {
            result = angle * Math.PI / 180;
        }
        return result;
    }

    /**
     * 根据提供的经纬度,转化为弧度
     *
     * @param latitude  纬度
     * @param longitude 经度
     * @return 结果集
     */
    public static double[] latitudeLongitudeToRadians(Double latitude, Double longitude)
    {
        double[] result = new double[
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值