guomengjiao 3 днів тому
батько
коміт
ca487008e9

+ 8 - 0
pom.xml

@@ -50,6 +50,7 @@
         <aliyun.green.version>2.2.8</aliyun.green.version>
         <eaeasypoi.version>4.3.0</eaeasypoi.version>
         <wechatpay-java.version>0.2.17</wechatpay-java.version>
+        <geodesy.version>1.1.3</geodesy.version>
         <!-- jdk11 缺失依赖 jaxb-->
         <jaxb.version>3.0.1</jaxb.version>
 
@@ -300,6 +301,13 @@
                 <version>${thumbnailator.version}</version>
             </dependency>
 
+            <!-- 地图 -->
+            <dependency>
+                <groupId>org.gavaghan</groupId>
+                <artifactId>geodesy</artifactId>
+                <version>${geodesy.version}</version>
+            </dependency>
+
             <!-- 定时任务 -->
             <dependency>
                 <groupId>com.ruoyi</groupId>

+ 5 - 0
ruoyi-common/pom.xml

@@ -245,6 +245,11 @@
             <groupId>com.belerweb</groupId>
             <artifactId>pinyin4j</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.gavaghan</groupId>
+            <artifactId>geodesy</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 72 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/MapTools.java

@@ -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;
+    }
+
+
+
+
+}