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
반응형