Quel est le moyen le plus simple de convertir la latitude et la longitude en valeurs doubles

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

  •  01-07-2019
  •  | 
  •  

Question

J'ai un fichier CSV contenant les valeurs de latitude et de longitude, telles que:

  

"25 '36'55,57" "E", "45" 39'12,52 "" N "

Quelqu'un a-t-il un morceau de code C # rapide et simple à convertir en doubles valeurs?

Merci

Était-ce utile?

La solution

Si vous voulez dire par code C #, procédez comme suit:

résultat = 25 + (36/60) + (55,57 / 3600)

Vous devez d’abord analyser l’expression avec Regex ou un autre mécanisme et la scinder en parties individuelles. Puis:

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

Et bien sûr, un commutateur pour basculer le signe en fonction de N / S ou E / S. Wikipedia a un peu à ce sujet:

  

Pour les calculs, le suffixe Ouest / Est est remplacé par un signe négatif dans l'hémisphère occidental. De manière confuse, la convention du négatif pour l'Est est également parfois vue. La convention privilégiée - que l’Est soit positif - correspond à un système de coordonnées cartésien à droite avec le pôle Nord en place. Une longitude spécifique peut ensuite être combinée avec une latitude spécifique (généralement positive dans l'hémisphère nord) pour donner une position précise sur la surface de la Terre.   ( http://fr.wikipedia.org/wiki/Longitude )

Autres conseils

Merci pour toutes les réponses rapides. Sur la base de la réponse apportée par amdfan, j’ai mis ensemble ce code qui fait le travail 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]*)<*>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;
}

Comment voulez-vous le représenter? Secondes d'arc? Puis 60 min dans chaque degré, 60 secondes dans chaque minute. Vous devriez alors garder E et N par vous-même.

Ce n’est pas comme cela que cela se passe généralement.

La représentation la plus simple avec laquelle je vois travailler est un point tracé sur le globe terrestre sur un système de grille qui tire son origine du centre de la Terre. [Ainsi, un joli vecteur de position.] Il est facile d'utiliser les données. Il peut être difficile d'entrer et de sortir correctement du système, car la Terre n'est pas ronde, voire uniforme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top