2008-09-19 20 views

Respuesta

11

Si se refiere a C# código para hacer esto:

resultado = 25 + (36/60) + (55,57/3600)

En primer lugar tendrá que analizar la expresión con Regex o algún otro mecanismo y divídalo en las partes individuales. Entonces:

String hour = "25"; 
String minute = "36"; 
String second = "55.57"; 
Double result = (hour) + (minute)/60 + (second)/3600; 

Y, por supuesto, un interruptor para cambiar el signo dependiendo de N/S o E/S. Wikipedia tiene un poco sobre eso:

Para los cálculos, el sufijo Oeste/Este se reemplaza por un signo negativo en el hemisferio occidental. Confusamente, la convención de negativo para Oriente también se ve a veces. La convención preferida - que este sea positivo - es consistente con un sistema de coordenadas cartesianas diestro con el Polo Norte arriba. Una longitud específica puede luego combinarse con una latitud específica (generalmente positiva en el hemisferio norte) para dar una posición precisa en la superficie de la Tierra. (http://en.wikipedia.org/wiki/Longitude)

+0

Tienes error menor en código - segunda división (de segundo) debe ser por 3600. –

+0

La fórmula correcta es: resultado = deg + (min/60) + (seg/3600); – holiveira

+0

¿No es eso lo que tengo? orden de las operaciones dicta que la división se hará antes de la suma. – ine

0

¿Qué estás esperando para representarlo como? Arc segundos? Luego 60 minutos en cada grado, 60 segundos en cada minuto. Tendría que mantener E y N usted solo.

Aunque no es así como se hace generalmente.

La representación más fácil con la que he trabajado es un punto tramado en el globo sobre un sistema de cuadrícula que tiene su origen en el centro de la tierra. [Así, un buen vector de posición.] El problema es que Si bien es fácil utilizar los datos, entrar y salir del sistema correctamente puede ser difícil, porque la tierra no es redonda, o para el caso, uniforme.

7

Gracias por todas las respuestas rápidas. Basado en la respuesta de amdfan, puse este código en conjunto que hace el trabajo en C#.

/// <summary>The regular expression parser used to parse the lat/long</summary> 
private static Regex Parser = new Regex("^(?<deg>[-+0-9]+)[^0-9]+(?<min>[0-9]+)[^0-9]+(?<sec>[0-9.,]+)[^0-9.,ENSW]+(?<pos>[ENSW]*)$"); 

/// <summary>Parses the lat lon value.</summary> 
/// <param name="value">The value.</param> 
/// <remarks>It must have at least 3 parts 'degrees' 'minutes' 'seconds'. If it 
/// has E/W and N/S this is used to change the sign.</remarks> 
/// <returns></returns> 
public static double ParseLatLonValue(string value) 
{ 
    // If it starts and finishes with a quote, strip them off 
    if (value.StartsWith("\"") && value.EndsWith("\"")) 
    { 
     value = value.Substring(1, value.Length - 2).Replace("\"\"", "\""); 
    } 

    // Now parse using the regex parser 
    Match match = Parser.Match(value); 
    if (!match.Success) 
    { 
     throw new ArgumentException(string.Format(CultureInfo.CurrentUICulture, "Lat/long value of '{0}' is not recognised", value)); 
    } 

    // Convert - adjust the sign if necessary 
    double deg = double.Parse(match.Groups["deg"].Value); 
    double min = double.Parse(match.Groups["min"].Value); 
    double sec = double.Parse(match.Groups["sec"].Value); 
    double result = deg + (min/60) + (sec/3600); 
    if (match.Groups["pos"].Success) 
    { 
     char ch = match.Groups["pos"].Value[0]; 
     result = ((ch == 'S') || (ch == 'W')) ? -result : result; 
    } 
    return result; 
} 
+0

¡Ese código es perfecto! Solo tengo una pequeña mejora: privado estático Regex Parser = new Regex ("^ (? [- + 0-9] {2}) [^ 0-9] + (? [0-9] { 2}) [^ 0-9] + (? [0-9.,] +) [^ 0-9., ENSW]? (? [ENSW] *) $); –

+0

Configuración 'InvariantCulture' para' double.Parse' sería mejor. –

Cuestiones relacionadas