위치기반 서비스를 위해서 만들기 위해서 반경 내에 있는 것들을 검색해야 하는 일이 생겼다.
구현하기 위해서 두 점 사이의 거리를 구해볼까 했는데 이미 반경을 구하는 쿼리가 있어서 기존의 것을 사용하기로 했다.
자바 기준
public double distanceByMeter(double lat1, double lng1, double lat2, double lng2) {
double theta = lng1 - lng2;
double dist = Math.sin(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lat2)) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(theta));
dist = Math.acos(dist);
dist = Math.toDegrees(dist);
dist = dist * 60 * 1.1515;
dist = dist * 1609.344;
return Math.round(dist/10)*10;
}
현재 위치의 위도 경도와 측정하고자 하는 대상의 위도 경도를 입력하면 m 단위로 결과값을 알려준다.
SELECT
*,
(6371*acos(cos(radians(<사용자의 lat>))*cos(radians(<TABLE.lat(대상 lat)>))*cos(radians(<TABLE.lng(대상 lng)>)
-radians(사용자의의 lng))+sin(radians(사용자의 lat))*sin(radians(<TABLE.lat(대상 lat)>)))
AS distance
FROM <TABLE>
HAVING distance <= 1
ORDER BY distance
sql 에서 query로 구하는 방법이다. 이때 distance대비 거리는 1 : 1km 이다.
추후 공부할 것들
1. 수학에 대한 지식이 있어야 겠다.