2008-09-19 9 views

Répondre

11

Si vous voulez parler du code C# pour le faire:

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

D'abord, vous aurez besoin pour analyser l'expression avec Regex ou un autre mécanisme et le diviser 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 interrupteur basculer en fonction de N/S ou E/S. Wikipedia a un peu sur cela:

Pour les calculs, le suffixe Ouest/Est est remplacé par un signe négatif dans l'hémisphère occidental. Confusément, la convention de négatif pour l'Est est aussi parfois vu. La convention préférée - que l'Est soit positif - est compatible avec un système de coordonnées cartésiennes droitier avec le pôle Nord en place. Une longitude spécifique peut alors ê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.)

+0

Vous avez petite erreur dans le code - deuxième division (secondes) doit être par –

+0

3600. La formule correcte est: result = deg + (min/60) + (s/3600); – holiveira

+0

n'est-ce pas ce que j'ai? ordre des opérations dicte que la division sera faite avant l'addition. – ine

0

Que voulez-vous représenter en tant que? Arc secondes? Puis 60 min dans chaque degré, 60 secondes dans chaque minute. Vous devrez alors garder E et N par vous-même.

Cependant, ce n'est généralement pas le cas. La représentation la plus facile avec laquelle j'ai vu travailler est un point tracé sur le globe sur un système de quadrillage qui a son origine au centre de la terre. [Un bon vecteur de position.] Le problème est que Bien qu'il soit facile d'utiliser les données, il peut être difficile d'entrer et de sortir du système correctement, car la terre n'est pas ronde, ou uniforme.

7

Merci pour toutes les réponses rapides. Basé sur la réponse par amdfan, j'ai mis ce code ensemble 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]*)$"); 

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

Ce code est parfait! Je n'ai qu'une petite amélioration: private Regex Parser privé = new Regex ("^ (? [- + 0-9] {2}) [^ 0-9] + (? [0-9] { 2}) [^ 0-9] + (? [0-9.,] +) [^ 0-9., ENSW]? (? [ENSW] *) $); –

+0

Définition de 'InvariantCulture' pour' double.Parse' serait mieux. –

Questions connexes