mysql創(chuàng)建函數(shù)
CREATE FUNCTION `lat_lng_distance` ( lat1 FLOAT, lng1 FLOAT, lat2 FLOAT, lng2 FLOAT ) RETURNS FLOAT DETERMINISTIC BEGIN
RETURN 6371 * 2 * ASIN(
SQRT(
POWER( SIN(( lat1 - abs( lat2 )) * pi()/ 180 / 2 ), 2 )+ COS( lat1 * pi()/ 180 ) * COS( abs( lat2 ) * pi()/ 180 ) * POWER( SIN(( lng1 - lng2 ) * pi()/ 180 / 2 ), 2 )
));
END
數(shù)據(jù)表

數(shù)據(jù)表.jpg
java代碼
/**
* 根據(jù)經(jīng)緯度和半徑 計(jì)算
*
* @param longitude 經(jīng)度
* @param latitude 緯度
* @param radius 搜索半徑 米
* @return
*/
public static Map<String, String> lonLatCalculation(double longitude, double latitude, Integer radius) {
Map<String, String> map = new HashMap<>();
// 赤道周長24901英里 1609是轉(zhuǎn)換成米的系數(shù)
double degree = (24901 * 1609) / 360.0;
double radiusMile = radius;
double dpmLat = 1 / degree;
double radiusLat = dpmLat * radiusMile;
double minLat = latitude - radiusLat;
double maxLat = latitude + radiusLat;
double mpdLng = degree * Math.cos(latitude * (Math.PI / 180));
double dpmLng = 1 / mpdLng;
double radiusLng = dpmLng * radiusMile;
double minLng = longitude - radiusLng;
double maxLng = longitude + radiusLng;
map.put("minLat", Double.toString(minLat));
map.put("maxLat", Double.toString(maxLat));
map.put("minLng", Double.toString(minLng));
map.put("maxLng", Double.toString(maxLng));
return map;
}
Impl
public ApiResult getStoreAddress(GetStoreAddressRequest request) {
//當(dāng)前經(jīng)度
String longitude = request.getLongitude();
//當(dāng)前緯度
String latitude = request.getLatitude();
//搜索范圍
String radius = request.getRadius();
Map<String, String> map;
map = CalculateUtil.lonLatCalculation(Double.valueOf(longitude), Double.valueOf(latitude), Integer.valueOf(radius));
map.put("longitude", longitude);
map.put("latitude", latitude);
//分頁
PageMethod.startPage(request.getPageNum(), request.getPageSize());
List<StoreInfo> test = storeInfoMapper.listStoreAddress(map.get("longitude"), map.get("latitude"), map.get("minLat"),
map.get("maxLat"), map.get("minLng"), map.get("maxLng"));
PageInfo<StoreInfo> pageInfo = new PageInfo<>(test);
return ApiResultUtil.success(pageInfo);
}
mapper(distance是當(dāng)前位置到店鋪的距離)
/**
* 查詢最近的店鋪
*
* @param longitude
* @param latitude
* @param minLat
* @param maxLat
* @param minLng
* @param maxLng
* @return
*/
List<StoreInfo> listStoreAddress(@Param("longitude") String longitude,
@Param("latitude") String latitude,
@Param("minLat") String minLat,
@Param("maxLat") String maxLat,
@Param("minLng") String minLng,
@Param("maxLng") String maxLng);
<select id="listStoreAddress" resultMap="BaseResultMap">
select
id,
store_name,
address,
create_time,
update_time,
lat,
lon,
ROUND(lat_lng_distance(#{latitude}, #{longitude}, lat, lon), 2) AS distance
from store_info
where
and lat > #{minLat} and lat < #{maxLat}
and lon > #{minLng} and lon < #{maxLng}
order by distance asc
</select>