C 프로그래밍 : 두 GPS 좌표간 거리(distance) 구하기
- 프로그래밍/C 프로그래밍
- 2020. 4. 29.
반응형
C 프로그래밍 : 두 GPS 좌표간 거리(distance) 구하기
본 글에서는 C 언어를 이용하여 두 GPS 좌표간의 거리를 구하는 방법에 대해 설명한다.
GPS 좌표 정보 중 도 단위 위도(latitude) 값과 경도(longitude) 값을 이용하여 두 좌표 사이의 거리(distance)를 계산할 수 있다.
본 방법에서는 거리 계산을 위해 삼각함수가 사용되므로 math 헤더파일을 인클루드해야 한다.
두 좌표 간 거리를 구하는 함수는 다음과 같이 구현할 수 있다.
#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 두 좌표간의 거리(미터단위)를 계산하여 반환한다.
*
* @param[in] lat1 좌표1의 위도(도단위)
* @param[in] lon1 좌표1의 경도(도단위)
* @param[in] lat2 좌표2의 위도(도단위)
* @param[in] lon2 좌표2의 경도(도단위)
* @return 두 좌표간 거리(미터 단위)
*/
double GetDistanceBetweenPoints(double lat1, double lon1, double lat2, double lon2)
{
double theta, dist;
if ((lat1 == lat2) && (lon1 == lon2)) {
return 0;
}
else {
theta = lon1 - lon2;
dist = sin(ConvertDecimalDegreesToRadians(lat1)) * sin(ConvertDecimalDegreesToRadians(lat2)) +
cos(ConvertDecimalDegreesToRadians(lat1)) * cos(ConvertDecimalDegreesToRadians(lat2)) *
cos(ConvertDecimalDegreesToRadians(theta));
dist = acos(dist);
dist = ConvertRadiansToDecimalDegrees(dist);
dist = dist * 60 * 1.1515;
dist = dist * 1.609344 * 1000; // 미터 단위로 변환
return dist;
}
}
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'프로그래밍 > C 프로그래밍' 카테고리의 다른 글
실행 에러 - free(): invalid size (0) | 2021.03.24 |
---|---|
빌드 에러 - undefined reference to log10f (0) | 2021.03.22 |
Object Identifier asn.1 인코딩 방법 (0) | 2021.02.11 |
C 프로그래밍 : 두 GPS 좌표간 목적지 방위각(bearing) 계산하기 (0) | 2020.04.29 |
C 프로그래밍 : 네트워크 인터페이스 MAC 주소 문자열을 바이트열로 변환 (2) | 2020.02.13 |
C 프로그래밍 : MAC 주소 출력 매크로 - MAC 주소 출력문을 간단하게. (0) | 2020.02.12 |
C 프로그래밍 : 배열 데이터를 16진수 형식으로 출력하기(Hex dump) (0) | 2020.02.09 |
C 프로그래밍 : 16진수 문자열을 바이트열로 변환하는 함수 (0) | 2020.02.08 |