반응형
지구에서 두 점 사이의 중간지점 구하기
지구에서 두 점 사이의 중간지점을 구하는 방법을 알아보자.
이 글은 원본인 Calculate distance, bearing and more between Latitude/Longitude points의 Midpoint 항목을 번역한 글이다.
시리즈
2020/08/25 - [Programming/Algorithm] - [Alogrithm] 지구에서 두 점 사이의 거리 구하기
2020/09/07 - [Programming/Algorithm] - [Algorithm] 지구에서 두 점 사이의 방위각 구하기
사전 지식
라디안
대원
중간지점
이 식은 대원(great circle)에서 두 점 사이의 중간지점을 찾아내는 식이다.
formula
Bx = cos φ2 ⋅ cos Δλ
By = cos φ2 ⋅ sin Δλ
φm = atan2( sin φ1 + sin φ2, √(cos φ1 + Bx)² + By² )
λm = λ1 + atan2(By, cos(φ1)+Bx)
source code
// 출발지 (서울)
const lat1 = 37.56654;
const lon1 = 126.97796;
// 목적지 (뉴욕)
const lat2 = 40.71295;
const lon2 = -74.00607;
// 위도, 경도를 라디안 단위로 변환
const φ₁ = lat1 * Math.PI / 180;
const φ₂ = lat2 * Math.PI / 180;
const λ₁ = lon1 * Math.PI / 180;
const λ₂ = lon2 * Math.PI / 180;
const Bx = Math.cos(φ₂) * Math.cos(λ₂ - λ₁);
const By = Math.cos(φ₂) * Math.sin(λ₂ - λ₁);
const φ₃ = Math.atan2(Math.sin(φ₁) + Math.sin(φ₂),
Math.sqrt((Math.cos(φ₁) + Bx) * (Math.cos(φ₁) + Bx) + By * By));
const λ₃ = λ₁ + Math.atan2(By, Math.cos(φ₁) + Bx);
// 라디안을 디그리로 변환
const lat3 = φ₃ * 180 / Math.PI;
let lon3 = λ₃ * 180 / Math.PI;
// lat3 = 77.2989712658764
// lon3 = 199.60411612492646
// 경도는 −180 ~ +180 사이의 값으로 정규화 할 수 있다.
lon3 = (lon3 + 540) % 360 - 180;
// 정규화된 lon3 = -160.39588387507354
초기 방위각이 최종 방위각과 일치하지 않는 것 처럼, 중간 지점은 위도/경도 사이의 중간 지점에 위치하지 않을 수 있다. (위도에 따라 왜곡률이 달라지기 때문)
35°N,45°E와 35°N,135°E 사이의 중간 지점은 약 45°N,90°E이다.
원본
반응형
'Programming > Algorithm' 카테고리의 다른 글
[Algorithm] 이동 평균 필터 (Moving average filter) (0) | 2021.12.04 |
---|---|
[Algorithm] 선형 보간법 (Linear interpolation) (0) | 2021.04.22 |
[Algorithm] 지구에서 두 점 사이의 방위각 구하기 (0) | 2020.09.07 |
[Alogrithm] 지구에서 두 점 사이의 거리 구하기 (2) | 2020.08.25 |
[Algorithm] 평면 좌표 경로 압축 알고리즘 (0) | 2020.05.14 |
댓글