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