Преобразование из десятичных градусов в градусы минуты секунды десятые. - PullRequest
7 голосов
/ 28 июля 2011

Есть ли какой-нибудь пример кода преобразования в C # для перехода от десятичных градусов к градусам, минутам, секундам, десятым?

Ответы [ 4 ]

30 голосов
/ 28 июля 2011

Вот класс, который я сделал недавно.

public class GeoAngle
{
    public bool IsNegative { get; set; }
    public int Degrees { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }
    public int Milliseconds { get; set; }



    public static GeoAngle FromDouble(double angleInDegrees)
    {
        //ensure the value will fall within the primary range [-180.0..+180.0]
        while (angleInDegrees < -180.0)
            angleInDegrees += 360.0;

        while (angleInDegrees > 180.0)
            angleInDegrees -= 360.0;

        var result = new GeoAngle();

        //switch the value to positive
        result.IsNegative = angleInDegrees < 0;
        angleInDegrees = Math.Abs(angleInDegrees);

        //gets the degree
        result.Degrees = (int)Math.Floor(angleInDegrees);
        var delta = angleInDegrees - result.Degrees;

        //gets minutes and seconds
        var seconds = (int)Math.Floor(3600.0 * delta);
        result.Seconds = seconds % 60;
        result.Minutes = (int)Math.Floor(seconds / 60.0);
        delta = delta * 3600.0 - seconds;

        //gets fractions
        result.Milliseconds = (int)(1000.0 * delta);

        return result;
    }



    public override string ToString()
    {
        var degrees = this.IsNegative
            ? -this.Degrees
            : this.Degrees;

        return string.Format(
            "{0}° {1:00}' {2:00}\"",
            degrees,
            this.Minutes,
            this.Seconds);
    }



    public string ToString(string format)
    {
        switch (format)
        {
            case "NS":
                return string.Format(
                    "{0}° {1:00}' {2:00}\".{3:000} {4}",
                    this.Degrees,
                    this.Minutes,
                    this.Seconds,
                    this.Milliseconds,
                    this.IsNegative ? 'S' : 'N');

            case "WE":
                return string.Format(
                    "{0}° {1:00}' {2:00}\".{3:000} {4}",
                    this.Degrees,
                    this.Minutes,
                    this.Seconds,
                    this.Milliseconds,
                    this.IsNegative ? 'W' : 'E');

            default:
                throw new NotImplementedException();
        }
    }
}
10 голосов
/ 28 июля 2011

Я думаю, что это должно сделать это.

double decimal_degrees; 

// set decimal_degrees value here

double minutes = (decimal_degrees - Math.Floor(decimal_degrees)) * 60.0; 
double seconds = (minutes - Math.Floor(minutes)) * 60.0;
double tenths = (seconds - Math.Floor(seconds)) * 10.0;
// get rid of fractional part
minutes = Math.Floor(minutes);
seconds = Math.Floor(seconds);
tenths = Math.Floor(tenths);
5 голосов
/ 28 июля 2011

Решение здесь имеет преобразование в обе стороны.

double coord = 59.345235;
int sec = (int)Math.Round(coord * 3600);
int deg = sec / 3600;
sec = Math.Abs(sec % 3600);
int min = sec / 60;
sec %= 60;

** От Преобразование градусов / минут / секунд в десятичные координаты

1 голос
/ 23 декабря 2014

Вы можете просто использовать эти 2 функции:

public Tuple<int,int,int> DecimalToDegrees(decimal decimalValue)
{
 return Tuple.Create(Convert.ToInt32( decimal.Truncate(decimalValue)),Convert.ToInt32( (decimal.Truncate(Math.Abs(decimalValue)*60))%60),Convert.ToInt32( (Math.Abs(decimalValue)*3600)%60));
}

И:

public decimal DecimalToDegrees(int deg , int min , int sec)
{ //~2.3825224324453 Meters error due to accuracy
  return deg+(min/60m)+(sec/3600m);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...