DB/SQL
[MySQL] 위도 경도 값으로 반경(거리) 구하기
꼬바리
2021. 10. 21. 17:53
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
반응형