[mysql] 위도 경도를 이용한 직선거리 구하기

김주경·2021년 9월 5일
0


이전 플젝에서 현 위치에서 검색대상 위치까지 거리를 구해야 하는 상황이 있었다. 첨엔 자바로 구현하려했지만, 동작마다 서블릿에 왔다갔다 하는 것이 굉장히 거슬렸다. 근데 찾아보니 쿼리로 계산할 수 있어서 한번 정리 해봄.

하버사인 공식

사실 2차원에서 거리를 구하는 공식은 그다지 어렵지 않다. 아무리 수포자여도 이 정도는 계산할 수 있어...
대충 이런 공식으로 두 지점의 x좌표와 y좌표를 구해서 계산을 하면 된다. 하지만 이것은 어디까지나 평면에서의 계산식. 우리의 지구는 둥글기에 이대로 구하면 당연히 틀린다.

이걸 계산하기 위한 천재 선조분들이 만든 식이 하버사인 공식이다. 하지만 나는 수포자 문과출신이고 게중에서도 미적분이 교육과정에서 아예 제외가 됐던 그런 세대이기에 ^^ 자세한 원리는 이 분의 포스팅으로 대체한다.

최단거리 구하기, 하버사인 공식(Haversine Formula) -https://kayuse88.github.io/haversine/

하버사인 공식 적용 쿼리

그리하여 하버사인 공식을 적용한 쿼리를 풀어보자면 다음과 같다.

SELECT *,

	(6371*ACOS(COS(RADIANS('대상 위도값'))
    	*COS(RADIANS('위도 컬럼'))
        *COS(radians('경도 컬럼')-RADIANS('대상 경도값'))
        +SIN(RADIANS('대상 위도값'))*SIN(RADIANS('위도 컬럼'))))
	AS DISTANCE

FROM MAP

대상위도, 대상경도 값에 클라이언트 단 혹은 구하고자 하는 위치의 좌표 값을 넣고, 컬럼 이라고 되어있는 부분에는 Table에 저장된 각각의 위도, 경도 컬럼의 값을 넣어주면된다 .

마무으리

우선 확실히 짚고 넘어가야 할 것은, 이것은 어디까지나 두 좌표사이의 직선거리다. 뭐 길찾기, 도로, 도보 등으로 생겨난 거리를 계산하는 공식이 아니다. 우선 간단한 테스트를 해봤을 때 성능상의 큰 이슈는 없었다. 나의 경우 최대 10개에서 최대 50개 단위로 페이징을 해서 저렇게 쿼리로 구현을 해도 크게 상관은 없었다. (한 1000개까지도 괜찮은거 같다.)

근데 그 이상의 몇십만 몇백만 단위의 데이터를 불러올때는 얼마나 걸릴지 테스트를 안해봤다. (근데 애초에 그렇게 많이 불러오면 지도 그리는 것도 엄청 오래걸리겠다... 보는 사람 눈도 겁나 아플듯)

무튼 잘 활용해서 담에는 자바로도 한번 구현해 봐야겠다.

profile
안냐세온

0개의 댓글