业务需求
小程序端有很多门店,需要根据你所在位置就近展示门店信息,并显示距离; 实现方式可以在小程序端,引用地图插件根据坐标展示距离,但就近展示似乎不好处理(前端人员回馈); 这里仅描述在后台如何处理门店就近展示;
后台代码
@Override
public List
<TDept> selectByExampleByPort(TDept dept
) {
List
<TDept> distanceAndResidueSeat
= new ArrayList<>();
List
<TDept> tDepts
= tDeptMapper
.selectByExampleByPort(dept
);
String coordinate
= dept
.getLatitude()+","+dept
.getLongitude();
if(StringUtils
.isNotBlank(dept
.getLatitude()) && StringUtils
.isNotBlank(dept
.getLongitude())){
List
<TDept> tDepts1
= computeDistance(coordinate
, tDepts
);
distanceAndResidueSeat
= getDistanceAndResidueSeat(tDepts1
);
}
return distanceAndResidueSeat
;
}
public List
<TDept> computeDistance(String coordinate
, List
<TDept> tDeptList
){
List
<TDept> tDepts
= new ArrayList<>();
if(tDeptList
.size() > 0){
for (TDept tDept
: tDeptList
) {
String longitude
= tDept
.getLongitude();
String latitude
= tDept
.getLatitude();
if(StringUtils
.isNotBlank(longitude
) && StringUtils
.isNotBlank(latitude
) && StringUtils
.isNotBlank(coordinate
)){
String distanceData
= latitude
+","+longitude
;
double distance
= MapHelper
.GetPointDistance(coordinate
, distanceData
);
Double format
= Double
.parseDouble(String
.format("%.1f", distance
));
tDept
.setDistance(format
);
tDepts
.add(tDept
);
}
}
}
return tDepts
;
}
public static List
<TDept> getDistanceAndResidueSeat(List
<TDept> list
) {
TDept tDept
= null
;
boolean exchange
= false;
for (int i
= 0; i
< list
.size(); i
++) {
for (int j
= list
.size() - 2; j
>= i
; j
--) {
if (list
.get(j
+ 1).getDistance() < list
.get(j
).getDistance()) {
tDept
= list
.get(j
+ 1);
list
.set(j
+ 1, list
.get(j
));
list
.set(j
, tDept
);
exchange
= true;
}
}
if (!exchange
)
break;
}
return list
;
}
通过地图上的两个坐标计算距离(Java版本)
public class MapHelper {
private static double EarthRadius
= 6378.137;
private static double rad(double d
) {
return d
* Math
.PI
/ 180.0;
}
public static double getDistance(double firstLatitude
, double firstLongitude
,
double secondLatitude
, double secondLongitude
) {
double firstRadLat
= rad(firstLatitude
);
double firstRadLng
= rad(firstLongitude
);
double secondRadLat
= rad(secondLatitude
);
double secondRadLng
= rad(secondLongitude
);
double a
= firstRadLat
- secondRadLat
;
double b
= firstRadLng
- secondRadLng
;
double cal
= 2 * Math
.asin(Math
.sqrt(Math
.pow(Math
.sin(a
/ 2), 2) + Math
.cos(firstRadLat
)
* Math
.cos(secondRadLat
) * Math
.pow(Math
.sin(b
/ 2), 2))) * EarthRadius
;
double result
= Math
.round(cal
* 10000d) / 10000d;
return result
;
}
public static double GetPointDistance(String firstPoint
, String secondPoint
) {
String
[] firstArray
= firstPoint
.split(",");
String
[] secondArray
= secondPoint
.split(",");
double firstLatitude
= Double
.valueOf(firstArray
[0].trim());
double firstLongitude
= Double
.valueOf(firstArray
[1].trim());
double secondLatitude
= Double
.valueOf(secondArray
[0].trim());
double secondLongitude
= Double
.valueOf(secondArray
[1].trim());
return getDistance(firstLatitude
, firstLongitude
, secondLatitude
, secondLongitude
);
}
}
转载请注明原文地址: https://yun.8miu.com/read-18087.html