[Java] Use latitude and longitude to calculate the distance between two points

Java programming uses latitude and longitude to calculate the distance between two points

闲聊一句
    如果说是使用springboot之类的框架做项目的话,建议使用方式一

method one

  • Import dependencies
<dependency>
  <groupId>org.gavaghan</groupId>
  <artifactId>geodesy</artifactId>
  <version>1.1.3</version>
</dependency>
  • Writing tools
package cn.tjut.utils;

import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;

public class distance {
    
    
    public static double getDistance(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){
    
    

        //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离
        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);
        return geoCurve.getEllipsoidalDistance();
    }
    public static boolean isTrue(double lon1,double lat1,double lon2,double lat2,String radius){
    
    
        //我需要传入的经度 维度都小数点后保留6位
        //lat1,lon1为第一个人的维度和经度;lat2,lon2为第一个人的维度和经度
        GlobalCoordinates source = new GlobalCoordinates(lat1, lon1);
        GlobalCoordinates target = new GlobalCoordinates(lat2, lon2);
        //Sphere坐标系计算结果
        double distance = getDistance(source, target, Ellipsoid.Sphere);
        double r=Double.parseDouble(radius);
        System.out.print("2:");
        System.out.println(distance);
        if(distance>r){
    
    
            return false;
        }
        return true;
    }
}
  • Writing test class calls

    • Give a chestnut spring blossoms
    //person1的经纬度是[109.231111,20.986543];person2的经纬度是[109.231112,20.986544]
    System.out.println(distance.isTrue(109.231111,20.986543,109.231112,20.986544,"20"));
    //远算结果  2:0.15212707523052652
    //运算结果  true
    

Way two

  • Directly write tool class implementation
package cn.tjut.utils;

public class distance2 {
    
    
    private static double rad(double d) {
    
    
        return d * Math.PI / 180.0;
    }
    public static boolean isInCircle(double lon1,double lat1,double lon2,double lat2,String radius){
    
    
        final double EARTH_RADIUS = 6378.137;
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double radLon1 = rad(lon1);
        double radLon2 = rad(lon2);
        double jdDistance = radLat1 - radLat2;
        double wdDistance = radLon1 - radLon2;
        double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(jdDistance / 2), 2) +
                Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(wdDistance / 2), 2)));
        distance = distance * EARTH_RADIUS;
        distance = Math.round(distance * 10000d) / 10000d;
        distance = distance*1000;//将计算出来的距离千米转为米
        System.out.print("1:");
        System.out.println(distance);
        double r = Double.parseDouble(radius);
        //判断一个点是否在圆形区域内
        if (distance > r) {
    
    
            return false;
        }
        return true;
    }
}
  • Writing test class calls

    • Give a chestnut spring blossoms
    //person1的经纬度是[109.231111,20.986543];person2的经纬度是[109.231112,20.986544]
    System.out.println(distance2.isInCircle(109.231111,20.986543,109.231112,20.986544,"20"));
    //远算结果  1:0.2
    //运算结果  true
    

Guess you like

Origin blog.csdn.net/kieson_uabc/article/details/107869612