c# - planisferio - que es latitud y longitud
¿Cuál es la forma más fácil de convertir la latitud y la longitud en valores dobles? (3)
Tengo un archivo CSV que contiene valores de latitud y longitud, como:
"25 ° 36''55.57" "E", "45 ° 39''12.52" "N"
¿Alguien tiene una pieza rápida y sencilla de código C # para convertir esto en valores dobles?
Gracias
¿Qué quieres representar como? Arc segundos? Luego 60 min en cada grado, 60 segundos en cada minuto. Entonces tendrías que mantener E y N por ti mismo.
Sin embargo, no es así como se hace generalmente.
La representación más sencilla con la que he visto trabajar es un punto trazado en el globo terráqueo en 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, aunque es fácil usar los datos, meterlo y sacarlo del sistema correctamente puede ser difícil, porque la tierra no es redonda, o para el caso, uniforme.
Si te refieres al código C # para hacer esto:
resultado = 25 + (36/60) + (55.57 / 3600)
Primero tendrá que analizar la expresión con Regex o algún otro mecanismo y dividirlo 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 el signo dependiendo de N / S o E / S. Wikipedia tiene un poco de 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 )
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;
}