GPS를 이용한 거리 및 반경을 구하는 경우 MySQL을 이용하여 쿼리문의 정보를 가져오기 편하다.
예제 테이블 명 : MAP_INFO
예제 Lat 컬럼명 : P_LAT
예제 Lon 컬럼명 : P_LON
예제 예시 좌표값 : 37.4685225, 126.8943311 [WGS84 좌표계]
SELECT *,
(6371*acos(cos(radians(37.4685225))*cos(radians(P_LAT))*cos(radians(P_LON)
-radians(126.8943311))+sin(radians(37.4685225))*sin(radians(P_LAT))))
AS distance
FROM MAP_INFO
HAVING distance <= 0.3
ORDER BY distance
LIMIT 0,300
검색할 Lat 값 : 37.4685225 (을 수정)
검색할 Lon 값 : 126.8943311 (을 수정)
→ 위 Lat 값과 Lon 값은 문자열로 정상적으로 넣어주더라도 정상적으로 읽어옵니다.
'37.4685225' & '126.8943311'
데이터상 보유중인 Lat 컬럼 : P_LAT (을 수정)
데이터상 보유중인 Lon 컬럼 : P_LON (을 수정)
데이터를 검색할 테이블 명 : MAP_INFO (을 수정)
데이터를 검색할 거리(반경) : 0.3 = 300m와 동일 (1km = 1)
빨간색 값과 파란색 값을 본인이 원하는 값과 셋팅된 값으로 변경해주면 바로 이용 가능한 쿼리문입니다.
실제 mybatis에서 이용한 예제 첨부합니다.
SELECT *,
(6371*acos(cos(radians(#{lat}))*cos(radians(LAT))*cos(radians(LNG)
-radians(#{lng}))+sin(radians(#{lat}))*sin(radians(LAT))))
AS distance
FROM TB_CCTV
HAVING distance <= #{searchRange}/1000
ORDER BY distance
쿼리에 DB컬럼명 적어줘야합니다.
서칭후 쿼리문에서 문자열쪽에 #{lat}이런식으로 넣어줫다가 오류가 떠서 고생했습니다.
쿼리 마지막인 Limit 지워도 잘 작동합니다.
참고 하시기 바랍니다.
위 쿼리면 쉽게 위도경도 반경으로 데이터 조회가능
728x90
반응형
'DB > SQL' 카테고리의 다른 글
[MySQL] WITH 재귀(RECURSIVE) 쿼리 계층 구조 (0) | 2022.06.03 |
---|---|
[오라클(Oracle)] 그룹 함수 (ROLLUP, CUBE, GROUPING 등) (0) | 2021.09.06 |
[Oracle] 오라클 고급쿼리 – 계층적 쿼리 (level) (0) | 2021.09.06 |
오라클 NL Join, Sort Merge Join, Hash Join 특징 총정리 (0) | 2021.08.31 |
[ORACLE]오라클_제약조건( CHECK ) (0) | 2021.08.31 |
댓글