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