레이블이 WGS84인 게시물을 표시합니다. 모든 게시물 표시
레이블이 WGS84인 게시물을 표시합니다. 모든 게시물 표시

2009년 7월 25일 토요일

등각항로의 정확한 방위/거리를 구하는 방식 발견

앞에 포스팅했던 지구 타원체에서 두 점간의 방위와 최단거리 계산하기를 쓰면서 프로그램을 하나 만들었다.
지표면 상에서 두 좌표 간의 방위와 거리를 각각 대권항로등각항로로 계산해주는 프로그램이다.

그런데, 문제가... 대권항로는 WGS84 좌표계에서 계산을 하는데, 등각항로는 사실 WGA84 타원체의 평균반지름을 반지름으로 갖는 구체에서 계산한다는 것이었다.
(이렇게 계산하면 최악의 경우 0.55%까지 거리의 오차가 발생한다)

오늘... 드디어... WGS84 타원체 상에서 등각항로의 방위와 거리를 정확하게 구하는 방식을 발견했다.
(아쉽게도 논문 같은 것은 찾지 못했음)

Juhani Kaukoranta님께서 Navigation, Astronavigation, Positioning and Geodesy라는 페이지에 식을 포함한 각종 자료를 올려주셨더라.

역시 수학은 멋지고 위대하다.
이 방식을 공부해야겠다!!!

사용자 삽입 이미지

친절하기 짝이 없는 설명의 일부 ^^;


2009년 7월 21일 화요일

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

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에 계산했는데, 워낙 단순한 알고리즘이니 이것과 비교할 수는 없을 것 같다.


2009년 7월 19일 일요일

Bessel 타원체와 WGS84 좌표계

1. Bessel 타원체와 동경좌표계

1841년, 기술이 발달하면서 지구 전체의 지도를 그리기 위해 지구 전체를 타원체로 모델링하려는 시도가 이루어진다.
Bessel이란 사람이 장반경을 6,377,397.155m로 하는 Bessel 타원체를 제안하게 되는 것이다.

하지만, 지구 전체를 모델링하는 타원체에 대한 표준을 만들고 규정할 수는 있는데, 세부 측량은 그렇지 못했다.
(당시는 GPS란 것은 생각도 못하던 시절임)
그래서, 측량의 구역을 나누고, 각 구역별로 측량 기준을 정해 측량이 이루어졌다.
(따라서, Bessel 타원체는 있어도 Bessel 좌표계는 없다)

우리가 수십년동안 사용해오던 동경좌표계는 바로 동경을 기준으로 측량을 이루어진 좌표계를 말하는 것이다.
우리나라를 측량하는데 동경을 기준으로 측량했다는 얘기이다.
우리나라는 1910년대 일본이 조선토지조사사업이라는 이름으로 측량했다. (이런 제길슨 ㅡㅡ;)

사용자 삽입 이미지


2. WGS84 타원체와 좌표계

1984년 드디어 전세계를 같은 기준에 의해 측량에서 지구 표면 전체를 측량하기 위한 모델링의 시도가 이루어진다.
장반경을 6,378,137.00m로 하는 WGS84 타원체가 제안되고, 이를 기준으로 측량도 하는 것이다.

그리고, 1992년 미군에서 1973년부터 개발해오던 GPS 서비스가 시작되고, WGS84 좌표계로 좌표를 알려주면서 WGS84는 범지구적으로 사용되기 시작한다.

WGS84 좌표계에서는 기존 Bessel 타원체와 다소 다른 기준을 정하고, 이 기준을 전 세계에 대해 똑같이 적용하여 측량을 한다.

우리나라는 2002년에 WGS84와 호환이 가능한 한국측지계 2002를 적용함으로서 본격적으로 WGS84 좌표계를 도입하게 된다.
(그 전까지는 동경좌표계를 WGS84로 변환하는 식만 제공하고 동경좌표계 지도를 그냥 사용했다)
더불어 동경을 기준으로 측량한 수치스런 지도들도 하나씩 제거되게 된다.

WGS84 좌표계를 전세계에서 사용하고 GPS를 활용함에 따라 전세계는 동일한 기준에 의해 측량하는 것이 가능해졌다.

사용자 삽입 이미지

1996년 경에는 이렇게 변환하는 식이 배포되기도 했었다.