2010-07-14 61 views
13

En una parte de mi código que convertir de coordenadas decimales a grados/minutos/segundos y utilizo este:grados convertir/minutos/segundos a decimal Coordenadas

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; 

¿cómo iba a convertir de nuevo a partir de grados/minutos/segundos a coordenadas decimales?

+0

Pregunta rápida, ¿no asigna 'sec/3600' a' deg' lo mismo que asignarle 'coord'? – jlafay

+12

Decir hola está totalmente bien, no escuches eso. Eso fue bastante grosero. – jlafay

+2

¡Gracias! Casi todos han sido agradables aquí, pero los MVP se convirtieron en eso por una razón, están en foros todo el día cuando deberían estar trabajando y toman sus títulos demasiado en serio ... – Justin

Respuesta

32

Prueba esto:

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); 
} 
+1

¡Gracias, eso funcionó! – Justin

+5

Esto no tiene en cuenta el hemisferio. –

+2

Una cosa que me confundió al usar google maps fue cuando estaba tratando de convertir MinDec a Datum decimal WGS84. Es bastante obvio ahora, que está en grados y minutos solamente. Mi formulario termina siendo similar a: return degrees + (minutes/60) + (seconds/6000); – Dessus

4

Desde grados dotados cada uno con 1 coordenada total y minutos valen 1/60 de un total de coordenadas, y el segundo valen 1/3600 de un total de coordenadas, debe haber capaz de volver a ponerlos juntos con:

new_coord = deg + min/60 + sec/3600 

Ten en cuenta que no será exactamente el mismo que el original, sin embargo, debido al redondeo de punto flotante.

5

Solo para ahorrarle tiempo a otros, quería agregar la respuesta de Byron. Si usted tiene el punto en forma de cadena (por ejemplo, "17.21.18S"), puede utilizar este método:

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; 
} 
+0

Gracias por el código fácil de usar :) – Pooran

+0

Me alegro de que te haya ayudado! –

2

A menudo los hemisferios occidental y meridional se expresan en grados negativos, y segundo contienen decimales de precisión: - 86: 44: 52.892 Recuerda que la longitud es la coordenada X y la latitud es la coordenada Y. Esto a menudo se confunde porque las personas a menudo se refieren a ellos lat/lon y X/Y. Modifiqué el código a continuación para el formato anterior.

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; 
} 
0

La respuesta aceptada hasta la fecha es incorrecta y no tiene en cuenta lo que sucede cuando se agregan números negativos a números positivos. El siguiente código aborda el problema y se convertirá correctamente.

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; 
    } 
0

CoordinateSharp está disponible como un paquete Nuget y puede manejar conversiones de coordenadas para usted. Incluso realiza la conversión UTM/MGRS y proporciona tiempos solares/lunares relativos a la ubicación de entrada. ¡Es realmente fácil de usar!

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 

Las propiedades de coordenadas son iObservable también. Por lo tanto, si cambia un valor de latitud por minuto, todo lo demás se actualizará.

Cuestiones relacionadas