Qual è il modo più semplice per convertire latitudine e longitudine in valori doppi

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

  •  01-07-2019
  •  | 
  •  

Domanda

Ho un file CSV contenente i valori di latitudine e longitudine, come:

  

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

Qualcuno ha un pezzo di codice C # rapido e semplice per convertirlo in valori doppi?

Grazie

È stato utile?

Soluzione

Se intendi il codice C # per farlo:

risultato = 25 + (36/60) + (55.57 / 3600)

Per prima cosa dovrai analizzare l'espressione con Regex o qualche altro meccanismo e dividerlo nelle singole parti. Poi:

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

E ovviamente un passaggio al segno di inversione a seconda di N / S o E / S. Wikipedia ha un po 'su questo:

  

Per i calcoli, il suffisso Ovest / Est è sostituito da un segno negativo nell'emisfero occidentale. Confusamente, a volte si vede anche la convenzione del negativo per l'Est. La convenzione preferita - che l'Est sia positivo - è coerente con un sistema di coordinate cartesiane destrorso con il Polo Nord in alto. Una longitudine specifica può quindi essere combinata con una latitudine specifica (generalmente positiva nell'emisfero settentrionale) per dare una posizione precisa sulla superficie terrestre.   ( http://en.wikipedia.org/wiki/Longitude )

Altri suggerimenti

Grazie per tutte le risposte rapide. Sulla base della risposta di amdfan, ho messo insieme questo codice che fa il lavoro in 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]*)<*>quot;);

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

Come vuoi rappresentarlo? Secondi d'arco? Quindi 60 minuti in ogni grado, 60 secondi in ogni minuto. Dovresti quindi mantenere E e N da solo.

Tuttavia, non è così che viene fatto in generale.

La rappresentazione più semplice con cui ho visto lavorare è un punto tracciato sul globo su un sistema a griglia che ha la sua origine attraverso il centro della terra. [Quindi un bel vettore di posizione.] Il problema è che mentre è facile usare i dati, farli entrare e uscire correttamente dal sistema può essere difficile, perché la terra non è rotonda, o per quella materia uniforme.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top