JAVA 根据经纬度获取两点之间的距离

前(fei)言(hua):

最近搞“考勤系统”其中有个“考勤打卡不能超过设置打卡地点多少m需求”,查询帖子,参照相关帖子,做个笔记,方便以后使用。

 

先上测试结果吧:

比网上多数看不懂的算法要准确一些,虽然依然跟百度地图上的测量结果稍有出入,不过已经足够应付一般的需求了~

思路:

1. 地球本身是个不规则的球体,这里将其看着一个规制球体

2. 半径取平均值:6371.393千米

3. 计算公式采用“球面距离公式”:S=R·arccos[cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2]

4. 对公式的理解:设需要求距离的两点为A、B,球心为O。可以分解成3步:

    ① cosβ1cosβ2cos(α1-α2)+sinβ1sinβ2——求∠AOB的余弦值,这里是难点,得到这部分公式的推导过程比较复杂;

    ② arccos[∠AOB的余弦值]——求∠AOB的反余弦值,值域为[0,π],本质是 ∠AOB角度 / 180° * π;

    ③ R·∠AOB的反余弦值,等价于 R·∠AOB角度 / 180° * π,这里集合弧长公式很好理解

注意:

1. 经纬度,在本质上是角度

2. Java中的Math类提供的sin和con方法的参数是弧度,而不是角度

3. 公式里面的“arccos”是反余弦算法,在Math类中为acos()方法

package com.chinacoal.microservice.util.tool;

import java.awt.geom.Point2D;
import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @author sc
 * @version V1.0
 * @createTime 2020/6/26 17:21
 * @description
 */
public class LocationUtils {
    // 平均半径,单位:m
    private static final double EARTH_RADIUS = 6371393;

    /**
     * 通过AB点经纬度获取距离 整数
     * @param pointA A点(经,纬)
     * @param pointB B点(经,纬)
     * @return 距离(单位:米)
     
Java中可以使用Haversine公式计算两个坐标点的经纬度之间距离。下面是一个示例代码: ```java import java.lang.Math; public class CoordinateDistance { public static double calculateDistance(double lat1, double lon1, double lat2, double lon2) { final double R = 6371.0; // 地球平均半径(单位:千米) double latDistance = Math.toRadians(lat2 - lat1); double lonDistance = Math.toRadians(lon2 - lon1); double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); double distance = R * c; return distance; } public static void main(String[] args) { double lat1 = 40.7128; // 第一个坐标点的纬度 double lon1 = -74.0060; // 第一个坐标点的经度 double lat2 = 34.0522; // 第二个坐标点的纬度 double lon2 = -118.2437; // 第二个坐标点的经度 double distance = calculateDistance(lat1, lon1, lat2, lon2); System.out.println("两者之间距离:" + distance + "千米"); } } ``` 上述代码中,calculateDistance方法接收四个参数:第一个坐标点的纬度和经度,以及第二个坐标点的纬度和经度。通过Haversine公式计算得到两者之间距离,然后返回该距离。在main方法中,我们可以通过传入具体的经纬度来调用calculateDistance方法,并将结果输出。运行上述代码,会得到输出结果为"两者之间距离:3934.859185020302千米",表示两个坐标点之间距离为3934.859185020302千米。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值