본문 바로가기

Database/mariaDB administrator

MySQL을 이용해서 위경도 지점간 거리 구하기

MySQL을 이용해서 위경도 지점 간 거리 구하기

 

안녕하세요.

 

SQL을 이용해서 위경도 좌표간 거리를 구하는 방법에 대해서 알아보겠습니다.

 

일전에 파이썬에서 haversine 라이브러리를 이용해서 두 위경도 지점 사이의 거리를 알아내는 방법을 공부해 봤었는데요. 이번엔 SQL을 이용해서 두 지점 간의 거리를 파악하는 방법을 포스팅하겠습니다.

 

# 파이썬을 이용해서 두 지점 사이의 거래 알아내는 방법 #

https://stricky.tistory.com/283

 

파이썬으로 GPS 두 위경도 좌표간 거리 구하기

파이썬으로 GPS 두 위경도 좌표 간 거리 구하기 안녕하세요. 어느 두 지점간의 거리를 계산을 해야 할 때가 있습니다. 두 지점간을 직선거리로 이었을 때의 그 거리가 얼마나 나오는지, 확인이 필

stricky.tistory.com

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