传入经纬度用mybatis查询附近的人按照距离由近到远排序
时间: 2024-04-30 13:21:05 浏览: 132
首先,需要根据传入的经纬度计算出每个人与传入位置的距离。可以使用Haversine公式进行计算,该公式可以计算出两点之间的球面距离。具体实现可以参考以下代码:
```java
public class DistanceUtil {
private static final double EARTH_RADIUS = 6371.393;
public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
double radLat1 = Math.toRadians(lat1);
double radLng1 = Math.toRadians(lng1);
double radLat2 = Math.toRadians(lat2);
double radLng2 = Math.toRadians(lng2);
double a = radLat1 - radLat2;
double b = radLng1 - radLng2;
double distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))) * EARTH_RADIUS;
distance = Math.round(distance * 1000) / 1000.0; // 保留三位小数
return distance;
}
}
```
然后,在MyBatis的Mapper中使用该工具类计算出每个人与传入位置的距离,并按照距离由近到远排序,可以使用以下语句:
```xml
<select id="getNearbyUsers" parameterType="map" resultType="User">
SELECT *, ROUND(6371.393 * 2 * ASIN(SQRT(POW(SIN((#{lat} - latitude) * PI() / 180 / 2), 2) + COS(#{lat} * PI() / 180) * COS(latitude * PI() / 180) * POW(SIN((#{lng} - longitude) * PI() / 180 / 2), 2))) * 1000) AS distance
FROM user
WHERE ROUND(6371.393 * 2 * ASIN(SQRT(POW(SIN((#{lat} - latitude) * PI() / 180 / 2), 2) + COS(#{lat} * PI() / 180) * COS(latitude * PI() / 180) * POW(SIN((#{lng} - longitude) * PI() / 180 / 2), 2))) * 1000) < #{distance}
ORDER BY distance ASC
</select>
```
其中,`#{lat}`和`#{lng}`分别表示传入的纬度和经度,`#{distance}`表示要查询的范围(单位为米)。查询结果按照距离由近到远排序,距离保存在`distance`字段中。返回的结果类型为`User`,可以根据实际情况进行修改。
阅读全文