본문 바로가기
.NET C#

c# 자전거 라이딩 거리 계산 관련 Utils

by 태디 2023. 1. 13.
728x90

 

1. 거리 계산 (GPS  좌표 변환 공식 / 지구의 곡률 적용) 

        /// <summary>
        /// 거리 계산
        /// </summary>
        /// <param name="lat1"></param>
        /// <param name="lng1"></param>
        /// <param name="lat2"></param>
        /// <param name="lng2"></param>
        /// <returns></returns>
        public double Distance(double lat1, double lng1, double lat2, double lng2)
        {
            double theta = 0.0d;
            double dist = 0.0d;
            theta = lng1 - lng2;

            dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + Math.Cos(deg2rad(lat1))
                         * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
            dist = Math.Acos(dist);
            dist = rad2deg(dist);
            dist = dist * 60 * 1.1515; // statute miles. 단위는 기본 마일.
            dist = dist * 1.609344;

            return dist;
        }

 

 

 

2. 주어진 도 값을 라디언으로 변환

/// <summary>
/// 주어진 도(degree) 값을 라디언으로 변환
/// </summary>
/// <param name="deg"></param>
/// <returns></returns>
private double deg2rad(double deg)
{
    if (!double.IsInfinity((double)(deg * (double)180d / Math.PI)))
        return (double)(deg * Math.PI / (double)180d);
    else
        return 0;
}

/// <summary>
/// 주어진 라디언(radian) 값을 도(degree) 값으로 변환
/// </summary>
/// <param name="rad"></param>
/// <returns></returns>
private double rad2deg(double rad)
{
    if (!double.IsInfinity((double)(rad * (double)180d / Math.PI)))
        return (double)(rad * (double)180d / Math.PI);
    else
        return 0;
}

 

 

3. 좌표 생성 시간을 기준으로 속도(km/h) 계산

/// <summary>
/// 좌표 생성 시간을 기준으로 속도(km/h) 계산
/// </summary>
/// <param name="km"></param>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
public static double GetKph(double km, string startDate, string endDate)
{
    double velocity = 0.0d;
    double totalTime = Utils.DateTimeHelper.GetTimeSpan(startDate, endDate).TotalSeconds;

    if (!double.IsInfinity(((km / totalTime) * 3600)))
        velocity = ((km / totalTime) * 3600);

    return velocity;
}​

 

 

 

댓글