¿Cuál es la forma más sencilla de convertir la latitud y la longitud a valores dobles?

StackOverflow https://stackoverflow.com/questions/103006

  •  01-07-2019
  •  | 
  •  

Pregunta

Tengo un archivo CSV que contiene valores de latitud y longitud, como:

"25°36'55.57""E","45°39'12.52""N"

¿Alguien tiene un código C# rápido y sencillo para convertir esto a valores dobles?

Gracias

¿Fue útil?

Solución

Si te refieres al código C# para hacer esto:

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

Primero deberá analizar la expresión con Regex o algún otro mecanismo y dividirla en partes individuales.Entonces:

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

Y, por supuesto, un cambio para cambiar la señal 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.De manera confusa, a veces también se ve la convención de negativo para Oriente.La convención preferida (que el Este sea positivo) es consistente con un sistema de coordenadas cartesiano diestro con el Polo Norte hacia arriba.Luego se puede combinar una longitud específica 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)

Otros consejos

Gracias por todas las respuestas rápidas.Según la respuesta de amdfan, preparé este código 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;
}

¿Cómo quieres representarlo?¿Segundos de arco?Luego 60 min por cada grado, 60 segundos por cada minuto.Entonces tendrías que quedarte con E y N tú solo.

Sin embargo, no es así como se hace en general.

La representación más fácil con la que he visto trabajar es un punto trazado en el globo en un sistema de cuadrícula que tiene su origen en el centro de la Tierra. [Por lo tanto, es un buen vector de posición.] El problema con esto es que, si bien es fácil usar los datos, introducirlos y sacarlos correctamente del sistema puede ser difícil, porque la Tierra no es redonda ni uniforme.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top