Qual é a maneira mais fácil de latitude e longitude convertido para valores double

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

  •  01-07-2019
  •  | 
  •  

Pergunta

Eu tenho um arquivo CSV que contém os valores de latitude e longitude, tais como:

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

Qualquer um tem uma peça simples e rápida de código C # para converter isso em valores double?

Graças

Foi útil?

Solução

Se você quer dizer código C # para fazer isso:

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

Em primeiro lugar você vai precisar para analisar a expressão com Regex ou algum outro mecanismo e dividi-lo em partes individuais. Então:

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

E, claro, um interruptor para sinal de aleta dependendo N / S ou E / S. Wikipedia tem um pouco sobre isso:

Para os cálculos, o sufixo Oeste / Leste é substituído por um sinal negativo no hemisfério ocidental. Desconcertante, a convenção de negativo para o Leste também é visto às vezes. A convenção preferido - que o Leste ser positivo - é consistente com um sistema destro de coordenadas cartesianas com o Pólo Norte para cima. A longitude específico pode então ser combinada com uma latitude específico (geralmente positivo no hemisfério norte) para dar uma posição precisa sobre a superfície da Terra. ( http://en.wikipedia.org/wiki/Longitude )

Outras dicas

Obrigado por todas as respostas rápidas. Com base na resposta por amdfan, eu coloquei isso junto código que faz o trabalho em 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;
}

O que você está querendo representá-lo como? segundos de arco? Em seguida, 60 min em todos os graus, 60 segundos em cada minuto. Você teria, então, para manter E e N por si mesmo.

Isto não é como ele é feito geralmente embora.

A representação mais fácil que eu já vi para trabalhar com é um ponto traçado no globo em um sistema de grade que tem a sua origem através do centro da Terra. [Assim, um bom vetor posição.] O problema com isto é que, enquanto é fácil de usar os dados, recebendo-o para dentro e para fora do sistema corretamente pode ser difícil, porque a terra não é redonda, ou para que o uniforme matéria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top