Was ist der einfachste Weg, geografische Breite und Länge zu Double-Wert zu konvertieren

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

  •  01-07-2019
  •  | 
  •  

Frage

Ich habe eine CSV-Datei enthält, bekam Breiten- und Längenwerte, wie zum Beispiel:

  

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

Jeder, der ein schnelles und einfaches Stück C # -Code hat dies doppelte Werte zu konvertieren?

Danke

War es hilfreich?

Lösung

Wenn Sie meinen, C # -Code, dies zu tun:

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

Zuerst müssen Sie den Ausdruck mit Regex oder einen anderen Mechanismus analysieren und teilen Sie es in die einzelnen Teile. Dann gilt:

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

Und natürlich ein Schalter Zeichen Flip je nach N / S oder E / S. Wikipedia hat ein wenig auf, dass:

  

Für die Berechnungen der West / Ost-Suffix wird durch ein negatives Vorzeichen in der westlichen Hemisphäre ersetzt. Verwirrend ist die Konvention von negativ für Ost auch manchmal gesehen. Die bevorzugte Konvention - das East positiv sein - steht im Einklang mit einem rechtshändigen kartesischen Koordinatensystem mit dem Nordpol nach oben. Eine spezifische Länge kann dann mit einer bestimmten Breite (in der Regel positiv in der nördlichen Hemisphäre) kombiniert werden, um eine genaue Position auf der Erdoberfläche zu geben.   ( http://en.wikipedia.org/wiki/Longitude )

Andere Tipps

Vielen Dank für die schnellen Antworten. Auf der Grundlage der Antwort von amdfan, habe ich diesen Code zusammen, dass der Job in C # funktioniert.

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

Was wollen Sie es als vertreten? Bogensekunden? Dann werden 60 min in jedem Grad, 60 Sekunden in jeder Minute. Sie würden dann E und N selbst behalten.

Das ist nicht, wie es in der Regel jedoch getan hat.

Die einfachste Darstellung die ich gesehen habe, mit zu arbeiten ist ein Punkt auf dem Globus auf einem Grid-System aufgetragen, das seinen Ursprung durch den Mittelpunkt der Erde hat. [So eine schöne Positionsvektor.] Das Problem dabei ist, dass während es ist einfach, die Daten zu verwenden, sie in das und aus dem System bekommen kann richtig hart sein, weil die Erde nicht rund ist, oder was das betrifft einheitlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top