|
@@ -0,0 +1,72 @@
|
|
|
|
+package com.ruoyi.common.utils;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+import org.gavaghan.geodesy.Ellipsoid;
|
|
|
|
+import org.gavaghan.geodesy.GeodeticCalculator;
|
|
|
|
+import org.gavaghan.geodesy.GeodeticCurve;
|
|
|
|
+import org.gavaghan.geodesy.GlobalCoordinates;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 地图工具类
|
|
|
|
+ */
|
|
|
|
+public class MapTools {
|
|
|
|
+
|
|
|
|
+ private static final double EARTH_RADIUS = 6371000; // 地球半径,单位:米
|
|
|
|
+ /**
|
|
|
|
+ * 计算经纬度
|
|
|
|
+ */
|
|
|
|
+ public static double calculate(String lon1, String lat1, String lon2, String lat2) {
|
|
|
|
+
|
|
|
|
+ double meter1 = 0D;
|
|
|
|
+ try {
|
|
|
|
+ // //121.717594,31.12055 121.817629,31.090867
|
|
|
|
+ GlobalCoordinates source = new GlobalCoordinates(Double.parseDouble(lat1), Double.parseDouble(lon1));
|
|
|
|
+ GlobalCoordinates target = new GlobalCoordinates(Double.parseDouble(lat2), Double.parseDouble(lon2));
|
|
|
|
+ meter1 = getDistanceMeter(source, target, Ellipsoid.Sphere);
|
|
|
|
+ return meter1;
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ return meter1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+// public static double calculate(String lon1, String lat1, String lon2, String lat2) {
|
|
|
|
+//
|
|
|
|
+// double distance = getDistance(Double.parseDouble(lat1), Double.parseDouble(lon1), Double.parseDouble(lat2), Double.parseDouble(lon2));
|
|
|
|
+// return distance;
|
|
|
|
+//
|
|
|
|
+// }
|
|
|
|
+
|
|
|
|
+ private static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo,
|
|
|
|
+ Ellipsoid ellipsoid) {
|
|
|
|
+ //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离
|
|
|
|
+ GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);
|
|
|
|
+ return geoCurve.getEllipsoidalDistance();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static double getDistance(double lat1, double lon1, double lat2, double lon2) {
|
|
|
|
+ double lat1Rad = toRadians(lat1);
|
|
|
|
+ double lon1Rad = toRadians(lon1);
|
|
|
|
+ double lat2Rad = toRadians(lat2);
|
|
|
|
+ double lon2Rad = toRadians(lon2);
|
|
|
|
+
|
|
|
|
+ double a = Math.sin((lat2Rad - lat1Rad) / 2) *
|
|
|
|
+ Math.sin((lat2Rad - lat1Rad) / 2) +
|
|
|
|
+ Math.cos(lat1Rad) *
|
|
|
|
+ Math.cos(lat2Rad) *
|
|
|
|
+ Math.sin((lon2Rad - lon1Rad) / 2) *
|
|
|
|
+ Math.sin((lon2Rad - lon1Rad) / 2);
|
|
|
|
+
|
|
|
|
+ double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
|
|
+
|
|
|
|
+ return EARTH_RADIUS * c;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static double toRadians(double degree) {
|
|
|
|
+ return degree * Math.PI / 180;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}
|