지구에서 두 점 사이의 방위각 구하기
지구에서 두 점 사이의 방위각을 구하는 방법을 알아보자.
이 글은 원본인 Calculate distance, bearing and more between Latitude/Longitude points의 Bearing 항목을 번역한 글이다.
시리즈
2020/08/25 - [Programming/Algorithm] - [Alogrithm] 지구에서 두 점 사이의 거리 구하기
2020/09/15 - [Programming/Algorithm] - [Algorithm] 지구에서 두 점 사이의 중간지점 구하기
사전 지식
라디안
대원
atan2
방위각
일반적으로, 대원 경로를 따라가면 현재 진행방향이 달라진다. 최종 방향은 거리와 위도에 따라 각도가 달라 초기 방향과 달라지게 되는 것이다.
만약, 바그다드에서 오사카로 이동한다면 초기 방위각 60°으로 시작하여 오사카에 도착했을 땐 최종 방위각 120°으로 끝난다.
이 식은 초기 방위각(전방 방위각, 출발지로부터 도착지까지의 방향)을 구하기 위한 식으로, 대원 호를 따라 시작점에서 끝점까지 직선으로 이동한다.
formula
θ = atan2( sin Δλ ⋅ cos φ₁ , cos φ₁ ⋅ sin φ₂ − sin φ₁ ⋅ cos φ₂ ⋅ cos Δλ )
φ₁,λ₁은 출발 지점, φ₂,λ₂는 도착 지점의 좌표를 나타내며, Δλ는λ₁와 λ₂의 차이다.
source code
// 출발지 (바그다드)
const lat1 = 33.3118;
const lon1 = 44.28586;
// 목적지 (오사카)
const lat2 = 34.67776;
const lon2 = 135.41602;
// 위도, 경도를 라디안 단위로 변환
const φ₁ = lat1 * Math.PI / 180;
const φ₂ = lat2 * Math.PI / 180;
const λ₁ = lon1 * Math.PI / 180;
const λ₂ = lon2 * Math.PI / 180;
const y = Math.sin(λ₂ - λ₁) * Math.cos(φ₂);
const x = Math.cos(φ₁) * Math.sin(φ₂) -
Math.sin(φ₁) * Math.cos(φ₂) * Math.cos(λ₂ - λ₁);
const θ = Math.atan2(y, x); // 방위각 (라디안)
const bearing = (θ * 180 / Math.PI + 360) % 360; // 방위각 (디그리, 정규화 완료)
// θ = 1.038408451477755
// bearing = 59.49642168039071
// 즉, 바그다드에서 오사카까지의 방위각은 약 60°정도 된다.
atan2 함수는 -π ~ +π (-180° ~ +180°) 범위의 값을 반환하므로, 이 값을 나침반 방위로 정규화 해주어야 한다. 라디안 θ를 디그리 θ로 변환하고 (θ + 360) % 360을 취하면 디그리 단위의 초기 방위각 계산이 완료된다.
초기 방위각은 이 처럼 구할 수 있으며, 최종 방위각을 구하는 방법도 어렵지 않다.
최종 방위각은 도착지로부터 출발지까지의 초기 방위각을 구한 뒤 역전시키기만 하면 된다. (θ = (θ + 180) % 360)
원본
'Programming > Algorithm' 카테고리의 다른 글
[Algorithm] 이동 평균 필터 (Moving average filter) (0) | 2021.12.04 |
---|---|
[Algorithm] 선형 보간법 (Linear interpolation) (0) | 2021.04.22 |
[Algorithm] 지구에서 두 점 사이의 중간지점 구하기 (1) | 2020.09.15 |
[Alogrithm] 지구에서 두 점 사이의 거리 구하기 (2) | 2020.08.25 |
[Algorithm] 평면 좌표 경로 압축 알고리즘 (0) | 2020.05.14 |
댓글