두 지점의 좌표 (x1, y1)과 (x2, y2)가 주어질 때 보통 피타고라스의 정리를 이용해서 거리를 구할 수 있다.
하지만 지구는 타원체이기 때문에 두 지점의 위경도가 주어진 경우 거리를 간단하게 구할 수 없다.
위도와 경도
위 사진을 보면 위도(latitude)는 가로선을, 경도(longitude)는 세로선을 나타낸다.
위도와 경도는 타원체에서 특정 지점이 기준점 대비 얼마나 떨어져있는지를 나타내며, 각도가 몇도 떨어진지를 나타낸다.
여기서 위도는 경도의 위치와 상관없이 1도 변화에 의한 거리가 일정하다 (위도 1도 변화는 대략 111km).
하지만 경도는 위도가 어디에 위치했는지에 따라 1도 변화에 의한 거리가 달라진다.
(적도에서 경도 1도의 변화는 111km이지만, 남극과 북극같은 극지방의 1도 변화는 0km이다.)
이는 가로선(위도)이 어디에 위치했는지에 따라 좌우로의 지구의 둘레가 달라지기 때문이다.
위 사진을 보면, 적도 지방에서 극지방으로 올라갈수록 지구의 가로 둘레가 짧아지는 것을 볼 수 있다.
따라서 경도 값이 동일하게 변화하더라도 위도의 위치에 따라 변화하는 거리는 달라질 수 있는 것이다.
한편 경도가 어디에 위치하든 상하의 둘레는 변화가 없다. 따라서 위도 1도 변화에 따른 거리는 거의 일정하다.
이런 특성으로 두 지점의 위경도 값을 가지고 있을 때는 다른 방법을 이용하여 거리를 계산해야 한다.
하버사인 (haversine) 공식
이렇게 두 지점의 위경도 값을 가지고 있을 때에는 하버사인(haversine)을 이용해서 거리를 구할 수 있다.
먼저 두 지점 A와 B가 있을 때, 구의 중심 O를 이용해서 부채꼴 OAB를 아래와 같이 나타낼 수 있다.
그림처럼 반지름 OA와 부채꼴의 호 AB의 길이가 r로 동일한 경우, 부채꼴의 각도를 1 라디안(radian)으로 부를 수 있다.
(우리가 일반적으로 생각하는 각도(degree)는 그림에서 a° 로 나타나있다.)
1. 라디안 단위의 각도를 계산하는 공식은 아래와 같다.
- Θ: 부채꼴 OAB의 중심각 (라디안 단위)
- r: 구의 반지름
- d: 호 AB의 길이 (두 지점 AB의 거리)
2. 라디안 각도를 이용한 하버사인 공식은 아래와 같다.
- φA, φB 두 지점 A, B의 경도(latitude)
- λA, λB: 두 지점 A, B의 위도(longitude)
여기서 위경도의 각도는 라디안 단위이다
(일반 위경도 값은 degree 단위라서 라디안으로 변환이 필요하다).
3. 한편 haversine 함수는 versin 함수의 절반으로 정의된다.
위 그림에서 반지름 OD는 1이고,
이다.
따라서 versin은
임을 알 수 있으며,
4. 이를 통해 haversine 함수는 아래와 같이 변환될 수 있다.
5. 여기서 haversine의 역함수인 arc haversine (archav) 함수를 이용해서 Θ를 구하고, Θ의 정의(식 1)를 이용하여 두 점의 거리 d를 구할 수 있다. 한편
로 변환될 수 있다. 이는 이 문서에 자세히 설명되어 있다.
6. 여기서 hav(Θ)에 관한 식 2와 식 3을 이용하여 아래와 같이 변환할 수 있다.
이를 통해 hav(Θ) 식을 삼각함수로 변환할 수 있다.
이 식을 이용해서 두 지점 A, B의 위경도가 주어졌을 때 거리를 계산할 수 있다.
유의할 점은 haversine은 완벽한 구를 가정하고 거리를 계산하는데, 지구는 타원체이기 때문에 거리에 약간의 오차가 발생할 수 있다.
(하지만 두 지점이 장거리가 아닌 경우는 오차를 무시해도 될 정도로 보인다.)
파이썬 코드
파이썬 코드로 haversine을 구현하는 방법은 아래 글에서 소개한다.
https://jost-do-it.tistory.com/59
참조
'Study > etc' 카테고리의 다른 글
간편하게 수식 입력이 가능한 사이트 (0) | 2022.09.20 |
---|