Конвертировать градусы/минуты/секунды в десятичные координаты

В одной части моего кода я конвертирую из десятичных координат в градусы/минуты/секунды, и я использую это:

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

Попробуйте следующее:

public double ConvertDegreeAngleToDouble( double degrees, double minutes, double seconds )
{
    //Decimal degrees = 
    //   whole number of degrees, 
    //   plus minutes divided by 60, 
    //   plus seconds divided by 3600

    return degrees + (minutes/60) + (seconds/3600);
}

Ответ 2

Чтобы сэкономить время, я хотел добавить к Байрону ответ. Если у вас есть точка в строковой форме (например, "17.21.18S" ), вы можете использовать этот метод:

public double ConvertDegreeAngleToDouble(string point)
{
    //Example: 17.21.18S

    var multiplier = (point.Contains("S") || point.Contains("W")) ? -1 : 1; //handle south and west

    point = Regex.Replace(point, "[^0-9.]", ""); //remove the characters

    var pointArray = point.Split('.'); //split the string.

    //Decimal degrees = 
    //   whole number of degrees, 
    //   plus minutes divided by 60, 
    //   plus seconds divided by 3600

    var degrees = Double.Parse(pointArray[0]);
    var minutes = Double.Parse(pointArray[1]) / 60;
    var seconds = Double.Parse(pointArray[2]) / 3600;

    return (degrees + minutes + seconds) * multiplier;
}

Ответ 3

Поскольку каждый градус равен 1 координате, а минуты стоят 1/60 от общей суммы координат, а секунды стоят 1/3600 от общей суммы координат, вы должны иметь возможность вернуть их вместе с:

new_coord = deg + min/60 + sec/3600

Остерегайтесь того, что он не будет таким же, как оригинал, из-за округления с плавающей запятой.

Ответ 4

Часто западное и южное полушария выражаются как отрицательные степени, а секунды содержат десятичные значения для точности: -86: 44: 52.892. Помните, что долгота - это координата X, а широта - координата Y. Это часто путается, потому что люди часто ссылаются на них lat/lon и X/Y. Я изменил код ниже для вышеуказанного формата.

private double ConvertDegreesToDecimal(string coordinate)
{
    double decimalCoordinate;
    string[] coordinateArray = coordinate.Split(':');
    if (3 == coordinateArray.Length)
    {
        double degrees = Double.Parse(coordinateArray[0]);
        double minutes = Double.Parse(coordinateArray[1]) / 60;
        double seconds = Double.Parse(coordinateArray[2]) / 3600;

        if (degrees > 0)
        {
            decimalCoordinate = (degrees + minutes + seconds);
        }
        else
        {
            decimalCoordinate = (degrees - minutes - seconds);
        }
    }
    return decimalCoordinate;
}

Ответ 5

Принятый ответ на сегодняшний день является неточным и не учитывает, что происходит, когда вы добавляете отрицательные числа в положительные числа. В приведенном ниже коде рассматривается проблема и будет правильно конвертировать.

    public double ConvertDegreeAngleToDouble(double degrees, double minutes, double seconds)
    {
        var multiplier = (degrees < 0 ? -1 : 1);
        var _deg = (double)Math.Abs(degrees);
        var result = _deg + (minutes / 60) + (seconds / 3600);
        return result * multiplier;
    }

Ответ 6

CoordinateSharp доступен как пакет Nuget и может обрабатывать преобразования координат для вас. Он даже конвертирует UTM/MGRS и обеспечивает солнечное/лунное время относительно местоположения входа. Это действительно удобно!

Coordinate c = new Coordinate(40.465, -75.089);

//Display DMS Format
c.FormatOptions.Format = CoordinateFormatType.Degree_Minutes_Seconds;
c.ToString();//N 40º 27' 54" W 75º 5' 20.4"
c.Latitude.ToString();//N 40º 27' 54"
c.Latitude.ToDouble();//40.465

Свойства координаты также iObservable. Поэтому, если вы измените значение значения широты, например, все остальное будет обновляться.