MySQL을 이용해서 위경도 지점 간 거리 구하기
안녕하세요.
SQL을 이용해서 위경도 좌표간 거리를 구하는 방법에 대해서 알아보겠습니다.
일전에 파이썬에서 haversine 라이브러리를 이용해서 두 위경도 지점 사이의 거리를 알아내는 방법을 공부해 봤었는데요. 이번엔 SQL을 이용해서 두 지점 간의 거리를 파악하는 방법을 포스팅하겠습니다.
# 파이썬을 이용해서 두 지점 사이의 거래 알아내는 방법 #
https://stricky.tistory.com/283
SQL과 파이썬에서 활 요하는 haversine 값 사이에 조금은 오차를 가지고 있습니다. 물론, SQL이 되었던지 haversine이 되었던지 각각의 오차는 있는 것이 기에 크게 의미를 두진 않겠습니다.
SQL을 이용해서 위경도 좌표 사이의 거리를 구할 수 있다는 것이 좀 신기 하긴 합니다.
물론 수식만 있으면 SQL에서 뭘 못할까 싶기도 하지만요 ^^
위에 링크한 포스팅을 보시면 "정부 서울청사" 에서부터 "정부 세종청사"까지의 거리를 구해보았었거든요. 아래와 같이요.
이렇게 결과가 나왔었습니다.
SQL을 이용하면 두 지점 간의 거리는 어떻게 될까요? 한번 구해보았습니다.
SELECT 6371 * 2 * ASIN(
SQRT(
POWER(SIN((37.5748605596214 - 36.504703602) * PI()/180 / 2), 2)
+
COS(52.2296756 * PI()/180)
* COS(52.406374 * PI()/180)
* POWER(SIN((126.97544482817 - 127.265039773) * PI()/180 / 2), 2)
)
) as distance1
위와 같은 식을 만들었습니다. MySQL을 이용한 결과입니다.
결과는 아래와 같습니다.
약 120.6 km의 결과가 나왔습니다.
파이썬의 haversine과 SQL수식 간의 차이는 약 1km 정도입니다.
사실 120km에서 1km의 오차라면.. 음 생각보단 크게 느껴집니다. 어느 편이 실제 거리와 더 가까운지는 알 수 없지만, 일단 구글 맵을 기준으로 하자면 파이썬의 haversine 라이브러리가 더 실제 거리와 가깝게 느껴집니다.
그럼 위 SQL을 이용해서 MySQL에 function을 생성해서 이용해도 될 것 같네요.
그럼 간단하게 답을 구해낼 수 있으닌깐요!
아래와 같이 구문을 이용해서 MySQL Function을 생성해보도록 하겠습니다.
create or replace function class.haversine(s_lat decimal(20,8), s_long decimal(20,8), g_lat decimal(20,8), g_long decimal(20,8)) returns float
BEGIN
declare v_dis float;
-- 위경도값을 이용한 거리 구하기
SELECT 6371 * 2 * ASIN(
SQRT(
POWER(SIN((s_lat - g_lat) * PI() / 180 / 2), 2)
+
COS(52.2296756 * PI() / 180)
* COS(52.406374 * PI() / 180)
* POWER(SIN((s_long - g_long) * PI() / 180 / 2), 2)
)) as distance1
into v_dis
from dual;
return v_dis;
END;
사용 방법은 아래와 같습니다.
select class.haversine(37.5748605596214,126.97544482817,36.504703602,127.265039773);
출발지의 위도, 경도, 도착지의 위도, 경도 값을 차례대로 넣어주시면 됩니다.
그러면 아래와 같이 결과가 나옵니다.
어떤가요? 간단하죠?
오늘은 이렇게 MySQL을 이용해서 두 지점 사이의 거리를 알아보는 SQL 문 및 Function을 작성하는 방법을 구해봤습니다.
감사합니다.
다음번에 더 재미있는 걸로 찾아오겠습니다!!
by.sTricky
'Database > mariaDB administrator' 카테고리의 다른 글
slow_query_log general_log 테이블 설정 방법 (0) | 2020.06.03 |
---|---|
MariaDB server PID file could not be found! 에러 조치 방법 (0) | 2020.06.03 |
Power BI 에서 mysql 데이터베이스 연결 하기 (3) | 2020.05.12 |
mysql show 명령어 완벽 정리 (3) | 2020.04.24 |
mariadb 제곱 함수 power , 반올림 round, 나머지 mod, ceil, floor 사용법 (5) | 2020.04.13 |