지구 타원체에서 두 점간의 방위와 최단거리 계산하기

1. 등각항법 vs 대권항법

항해를 할 때는 메르카토르 해도에 일직선으로 항로를 표시하여 항로를 따라 항해하는데, 이를 등각항법이라고 한다.
이는 지표면 상에서 최단거리를 긋는 대권항법과 비교 된다.

등각항법은 항로가 직선으로 표시되어 쉽게 작도하고 항해할 수 있으나, 원양항해시 멀리 돌아가므로 효율이 낮다.
반면, 대권항법은 효율성이 높지만, 매순간 침로를 변경해줘야 하기 때문에 사람이 작도하기 보다는 항해용 컴퓨터를 이용해서 자동으로 침로를 지정해야 효용성을 발휘할 수 있다.

사용자 삽입 이미지

제주도-하와이 구간 등각항로. 직선이지만, 최단거리는 아니다.


항해를 할 때는 지구본이 아닌 해도를 놓고 항로를 표시하게 되는데, 해도에 등각항로를 쉽게 작도하는 방법은 없다.


2. 방위와 거리를 평면으로 근사해서 계산하는 법

가까운 거리 즉, 대한민국의 영토와 영해 및 주변 해역에서는 대권항로와 등각항로의 차이가 사실상 없다.
(엄밀히 말하면 있기는 하지만, 실제 항해에 미칠 수 있는 영향은 전혀 없다)
물 위에서 배가 몇 미터 단위까지 정확하게 항해할 수는 없기 때문이다.

평면으로 근사하여 해를 계산할 때는 2차원 Cartesian좌표계에 영역을 투영하여 침로를 계산한다.
이 방식은 연안에서는 굉장히 정확하여, 방위와 거리에 대한 정확한 계산결과를 얻을 수 있다.

사용자 삽입 이미지

대략 이런 식으로 투영하는데, 연안에서는 의외로 정확하다.


하지만, 원양으로 가면 얘기는 달라진다.
원양에서는 대권항로를 계산해야 효율적인 항해가 가능해진다.


3. 대권항로를 계산하는 법

대권항로를 계산하는 방법은 WGS84 좌표계가 나오기 무려 9년 전인 1975년에 발표되었다.
당시는 Bessel 타원체를 사용하던 시절이었는데, 당시 발표된 한 논문에 항로를 정확히 계산하는 방법이 연구되어 있었다.

타원체 상의 한 지점에서 일정한 방위와 거리에 있는 다른 점의 좌표를 계산(주문제[Direct Problem]라고 함)하거나, 두 지점 간의 방위와 거리를 계산(역문제[Inverse Problem]라고 함)하는 방법을 단 6 페이지의 논문에 명료하게 적은 것이다.

이 논문 및 관련 설명은 아래 링크들에서 볼 수 있다.


이 방법은 당시에 사용되던 느린 컴퓨터 상에서도 Fortran으로도 최대한 효율적으로 계산할 수 있도록 만들어졌는데, 지금의 빠른 컴퓨터에서는 (무려) JavaScript를 사용해도 굉장히 빠르고 정확한 계산이 가능하다.
게다가, Bessel 타원체의 상수(장반경, 단반경 및 편평률) 대신 WGS84 타원체의 상수를 적용하는 것만으로 WGS84 좌표계에서 그대로 사용이 가능하다.
또한, 이 식의 오차는 무려 0.5mm 이하이다.

사용자 삽입 이미지

제주도-하와이 구간 최단거리의 방위/거리 계산 결과


이 식을 Visual C++ 2005로 구현해서 계산해본 결과 최대 0.25μs의 시간에 계산이 가능하다.
Cartesian 좌표계에서 계산했을 때는 최대 0.172μs의 시간에 계산을 할 수 있으니 충분히 빠른 알고리즘이다.
(계산환경: Intel Core2 Duo E6550, 2.33GHz, 2GB RAM)

참고로, 메르카토르 도법상에서는 0.04μs에 계산했는데, 워낙 단순한 알고리즘이니 이것과 비교할 수는 없을 것 같다.