C 프로그래밍 : 두 GPS 좌표간 목적지 방위각(bearing) 계산하기

반응형

 

C 프로그래밍 : 두 GPS 좌표간 목적지 방위각(bearing) 계산하기

본 글에서는 C 언어를 이용하여 하나의 GPS 좌표에서 다른 GPS 좌표로의 목적지 방위각(bearing)을 계산하는 방법에 대해 설명한다.

 

GPS 좌표 중 도 단위 위도(latitude) 값과 경도(longitude) 값을 이용하여 특정 좌표로부터 또 다른 좌표로의 목적지 방위각(bearing)을 계산할 수 있다.

 

목적지 방위각(bearing)은 "특정 객체의 진행방향과 또다른 객체 사이의 각도" 또는 "정북(True North)와 타겟좌표 사이의 각도"를 의미하며, 본 글에서의 의미는 후자이다.

 

본 방법에서는 계산을 위해 삼각함수가 사용되므로 math 헤더파일을 인클루드해야 한다.

 

목적지 방위각(bearing)을 구한는 함수는 다음과 같이 구현할 수 있다.

// 시스템 헤더 파일
#include <math.h>


/// 계산에 사용되는 파이 값
#define PI 3.14159265358979323846


/**
 * @brief 소수점 도(decimal degree)를 라디언(radian)으로 변환한다.
 * @param[in] deg 변환할 도 값
 * @return 변환된 라디언 값
 */
double ConvertDecimalDegreesToRadians(double deg)
{
  return (deg * PI / 180);
}


/**
 * @brief 라디언(radian)을 소수점 도(decimal degree)로 변환한다.
 * @param[in] rad 변환할 라디언 값
 * @return 변환된 도 값
 */
double ConvertRadiansToDecimalDegrees(double rad)
{
  return (rad * 180 / PI);
}


/**
 * @brief 두 좌표간의 도 단위 bearing 을 계산한다.
 *
 * @param[in] lat1 좌표1의 위도(도단위)
 * @param[in] lon1 좌표1의 경도(도단위)
 * @param[in] lat2 좌표2의 위도(도단위)
 * @param[in] lon2 좌표2의 경도(도단위)
 * @return 두 좌표간 bearing (도 단위)
 */
double GetBearingBetweenPoints(double lat1, double lon1, double lat2, double lon2)
{
  double lat1_rad = ConvertDecimalDegreesToRadians(lat1);
  double lat2_rad = ConvertDecimalDegreesToRadians(lat2);
  double lon_diff_rad = ConvertDecimalDegreesToRadians(lon2-lon1);
  double y = sin(lon_diff_rad) * cos(lat2_rad);
  double x = cos(lat1_rad) * sin(lat2_rad) - sin(lat1_rad) * cos(lat2_rad) * cos(lon_diff_rad);

  return ((int)ConvertRadiansToDecimalDegrees(atan2(y, x)) + 360) % 360;
}

 

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

댓글

Designed by JB FACTORY