레이블이 대권항로인 게시물을 표시합니다. 모든 게시물 표시
레이블이 대권항로인 게시물을 표시합니다. 모든 게시물 표시

2009년 11월 7일 토요일

메르카토르 도법 지도 위에 최단경로를 그리는 프로그램 1.1 업데이트

메르카토르 도법 지도 위에 최단경로를 그리는 프로그램에서 발견된 사소한(?) 문제점을 해결한 프로그램임.

아래와 같은 수정이 적용되었다.

1. 가끔 죽는 문제 해결. 선의 범위가 화면을 벗어나는 경우 가끔 죽는 문제가 있었음.
2. 선과 문자의 색상 지정 가능. (INI 등으로 저장하는 기능은 안 만들었음. ㅋㅋ)
3. 위도 범위를 북반구/남반구 각각 지정 가능. (남극 대륙을 제거한 메르카토르 지도가 종종 있음)
4. 좌표 입력시 순서를 위도-경도에서 경도-위도로 바꿈.
5. 실행시 실행파일과 같은 폴더에 있는 PNG 파일을 자동으로 지정함.

화면은 이런 식으로 바뀌었다. 수정된 내용이 적용된 화면은 아래와 같다.

사용자 삽입 이미지

이런 기능을 적용한 덕분에 아래와 같은 결과를 볼 수 있다.
아래 표시된 코스는 앞의 포스트와 동일한 괌-칠레(발파라이소 항) 항로임.

사용자 삽입 이미지

수정된 프로그램을 사용하려면 아래 파일을 다운받으면 된다.


2009년 11월 5일 목요일

메르카토르 도법 지도 위에 최단경로를 그리는 프로그램

지구 타원체에서 두 점간의 방위와 최단거리 계산하기에서 언급한 내용을 눈으로 보여주는 프로그램을 만들어봤다.

잘 알려져있듯이, 메르카토르 도법 지도의 장점은 항해시 등각 항법을 쉽게 쓸 수 있다는 점이다.
하지만, 이 항로는 최단거리가 아니기 때문에 장거리 항해에 있어서는 비효율적이다.

이 프로그램은 메르카토르 해도에 두 지점 간 등각항로와 최단경로를 그려주고, 거리 정보를 표시해준다.
(메르카토르 해도는 별도의 PNG 파일로 지정해줘야 함)

사용자 삽입 이미지

본초자오선과 최대위도를 입력받을 수 있어 어떠한 메르카토르 지도와도 함께 사용 가능함


아래의 압축 파일을 풀면 실행파일과 메르카토르 도법 해도가 나오며, 눈치껏(응?) 사용하면 된다.
참고로, 계산이 끝나면 경로가 표시된 이미지 파일을 화면에 표시해준다.


실행 결과는 아래와 같다.

사용자 삽입 이미지

이 캡쳐 화면에 표시된 경로는 괌-칠레(발파라이소 항) 임


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