IT Study/데이터베이스

MySQL에서 위도,경도 활용하여 거리 계산하기

ComputerScientist 2020. 11. 6. 18:33


순서

  1. 거리 계산 하기
  2. 하버사인 공식
  3. MySQL 하버사인 공식 적용 (내용이 궁금하지 않으면, 바로 3번으로!)

 

1. 거리 계산하기

사실 이 내용에 대해서는 상당히 많은 부분의 설명이 필요하다.

  • 위도와 경도가 무엇인지 알아야 하며,
  • 지구의 반지름에 대해서도 알아야 하고..
  • sin, cos에 대해서도 알아야 한다.

상당히 많은 부분을 알아야 하므로 이 부분에 대해서 간단히 넘어가려 한다.

(그래도 궁금한 건 못 참는다 하시는 분들은 여기를 참조하세요.)

 

56. 이걸 알아야 하나? 위도, 경도, 거리 계산

이번 공간에서는 지도의 위도( latitude, 래티튜드 ), 경도 ( longitude, 란져튜드 )에 알아보려고 해요. ...

blog.naver.com

 

 

 

 

2-D ( x-y ) 좌표에서 두 점 사이의 거리를 게산해 본 적이 있다면, 기억을 더듬어서 어떻게 했는지 기억해보자.

 

A(3, 9)

B(6, 13)

위도-경도로 표시된 좌표도 두 점 사이의 거리를 구하는 것처럼,

  • 두 점간의 위도 차이
  • 두 점간의 경도 차이

의 합에 루트(2)를 씌우면 된다. 

그러면 두 점 사이의 거리가 나온다.

 

 

 

하지만 여기서 우리는 간과한 게 하나 있다. 바로 저 두 점 사이의 거리는 사실 "최단"거리이다.

무슨 말이냐 하면, 호의 길이를 구한 게 아니라 현의 길이를 구했다는 얘기이다.

 

현과 호가 무엇인지는 여기를 보면 알 수 있다. (여기!)

 

원과 부채꼴, 호, 현, 활꼴, 중심각

다각형에 이어 이번에는 원이에요. 다각형은 여러 개의 선분으로 둘러싸인 평면도형이었어요. 이번에는 선분이 아닌 것들로 둘러싸인 도형을 공부할 거예요. 바로 원과 그 친구들이죠. 원은 초

mathbang.net

 

 

 

 

 

 

2. 하버사인 공식

그럼 구의 형태인 지구에서 두 지점 사이의 거리는 어떻게 구할까?

바로 하버 사인 공식을 활용하면 된다. (Haversine Formula)

 

Calculate distance and bearing between two Latitude/Longitude points using haversine formula in JavaScript

This page presents a variety of calculations for lati­tude/longi­tude points, with the formulas and code fragments for implementing them. All these formulas are for calculations on the basis of a spherical earth (ignoring ellipsoidal effects) – which i

www.movable-type.co.uk

하버 사인에 대해서는 궁금한 사람은 링크로 들어가서 확인해보길 바란다. (영어..)

 

하버사인 공식은 이렇다 (해당 웹사이트에 나와있는 걸 보면, 공식, 자바스크립트, 엑셀로 다 정리되어있다) 

이미지는 여기서 추출되었습니다 :  http://www.movable-type.co.uk/scripts/latlong.html?from=48.619,-120.412&to=48.59617,-120.4020

그렇다면 허버사인 공식을 MySQL 식으로 바꾸면?

 

 

 

 

 

 

 

3. MySQL 하버사인 공식 적용

-- KM : 6371
-- MILES : 3959

SELECT
    (
      6371 * acos (
      cos ( radians(source_lat) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(source_lon) )
      + sin ( radians(source_lat) )
      * sin( radians( lat ) )
    )
) AS distance
FROM some_geo_locations;

위에 나와있는 것 처럼 cos, sin, acos, radians 를 사용하여 나타낼 수 있다.

 

그렇다면 예시로, 우리가 흔하게 사용하는 내 주변검색 등의 기능을 위의 MySQL 계산을 활용하여 찾아보자.

-- KM : 6371
-- MILES : 3959

SELECT
    id, (
      6371 * acos (
      cos ( radians(source_lat) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(source_lon) )
      + sin ( radians(source_lat) )
      * sin( radians( lat ) )
    )
) AS distance
FROM toilets
HAVING distance < 2
ORDER BY distance
LIMIT 0 , 20;

위의 공식은 toilets 이라는 table 에서 2km 반경의 toilet 을 검색한 것이다. HAVING 을 사용하여 distance 를 2km 내로 필터링 하였으며, distance 로 ORDERING 하여, 가까운 toilet 을 먼저 보여주게 Query 가 작성됨을 알 수 있다.

 

 

 

 

 

 

References:
m.blog.naver.com/jinohpark79/221170630625

mathbang.net/98

www.movable-type.co.uk/scripts/latlong.html?from=48.619,-120.412&to=48.59617,-120.4020