Explorar o código

添加:计算经纬度之间的直线距离工具类

wangzhijun hai 5 días
pai
achega
fc46f955d4

+ 38 - 0
nightFragrance-common/src/main/java/com/ylx/common/utils/DistanceUtil.java

@@ -0,0 +1,38 @@
+package com.ylx.common.utils;
+
+import cn.hutool.core.util.ObjectUtil;
+
+/**
+ * 计算经纬度之间的直线距离
+ */
+public class DistanceUtil {
+
+    /**
+     * @param userLat 用户纬度
+     * @param userLon 用户经度
+     * @param shopLat 门店纬度
+     * @param shopLon 门店经度
+     * @return 返回距离单位为m
+     */
+    public static String formatDistance(Double userLat, Double userLon, Double shopLat, Double shopLon) {
+        // 任意坐标空/0 → 未知
+        if (ObjectUtil.hasNull(userLat, userLon, shopLat, shopLon)
+                || userLat == 0 || userLon == 0 || shopLat == 0 || shopLon == 0) {
+            return "未知";
+        }
+        double meter = getDistance(userLat, userLon, shopLat, shopLon);
+        return String.valueOf(Math.round(meter));
+    }
+
+    // 球面距离:lat1,lon1,lat2,lon2 → 米
+    private static double getDistance(double lat1, double lon1, double lat2, double lon2) {
+        double radLat1 = Math.toRadians(lat1);
+        double radLon1 = Math.toRadians(lon1);
+        double radLat2 = Math.toRadians(lat2);
+        double radLon2 = Math.toRadians(lon2);
+        double r = 6371;
+        double km = r * Math.acos(Math.cos(radLat1) * Math.cos(radLat2) * Math.cos(radLon2 - radLon1) + Math.sin(radLat1) * Math.sin(radLat2));
+        return km * 1000;
+    }
+
+}