IT/Database

[PostgreSQL] 특정 위치에서 가까운 거리순 정렬하기 쿼리로만(위도,경도)

JJo 2018. 12. 3. 12:11

-특정 위치에서 가까운 거리순 정렬하기 쿼리로만(위도,경도)



이번 포스팅은

내 자신으로부터 특정 건물들을 가까운거리순으로 정렬하여 보여주기 위함이다


단, 코딩은 들어가지 않고

Postgresql을 사용하는 경우 쿼리내에서 위도/경도를 활용하여 처리 하는방법으로!




1. Postgresql-contrib 설치



Postgresql을 Ubuntu에서 돌리고 있는데

먼저 Postgresql-contrib를 설치 해 준다.

Postgresql의 추가 라이브러리라고 생각하면된다


1
sudo apt-get install postgresql-contrib 
cs



2. 추가된 라이브러리 중 cube와 earthdistance설치



이 두개를 사용할 수 있게 하는 방법을 찾는데 시간이 걸렸다..

postgresql의 버전에 따라 조금 차이가 있지만

9버전 이상부터는 아래의 쿼리를 sql상에서 돌려주면 된다

(이 전 버전에서는 .sql파일을 어디 폴더 들어가서 뭐해라 뭐해라..있는데 

간단하게 아래 2개의 쿼리 돌려주면 된다)


1
2
CREATE EXTENSION cube; 
CREATE EXTENSION earthdistance; 
cs




3. earth_distance, ll_to_earth 함수 활용



아래 쿼리 실행

select earth_distance(ll_to_earth(37.4839901,126.9014494), ll_to_earth(37.482325, 126.881754));

출발지(구디)의 위도경도와 도착지(가디)의 위도경도를 입력하고 쿼리를 실행해주면

결과값이 1749.65973028176 나오는데 단위는 M이다.

구디에서 가디까지 약 1.7키로 라는것이다




4. 쿼리 



위에 SELECT절까지 사용할 수 있다면

거리순 정렬은 문제가 되지 않는다.

사용자로부터 입력받은 위치의 데이터와

디비에 저장되어있는 특정 위치의 데이터를 조회 후 

Order by 정렬만 오름차순으로 해주면 되기 때문!




생각해 볼 부분



거리순으로 정렬을 하는 것 까진 문제가 되지 않지만

안드로이드에서 페이징처리까지 생각한다면

조금 더 신경써야할 부분이 많아진다... 이 건 추후에 다루기로 하고,


이번에도 내가 필요한 기능을 사용하는데 있어(거리 구하기)

처음에는 단순 히 자바단에서 코드로 처리를 하려고 했었는데

내가 사용하는 DB에서 'earth_distance' 함수를 제공해 쉽게 처리할 수 있었다.

만약 제공하지 않았더라면...


그리고 'earth_distance'함수가 있는지 몰랐더라면

2시간이면 작업할 것을 몇일이 걸렸을지 모른다.


어떤일을 하는데 있어

지금 나의 생각만 가지고 진행을 하기보다는

조금 더 넓게 다른 방법이 있는지 확인해보고

처음에 조금 시간이 걸리더라도

넓게 생각하면 좋겠다 라고 다시 한번 느꼈다.


물론.. 상황에 따라 다르겠지만...........