2008-09-19 242 views

回答

11

如果你的意思是C#代码来做到这一点:

结果= 25 +(36/60)+(55.57/3600)

首先,您需要解析表达式与正则表达式或其他一些机制,并将其分割成单独的部分。然后:

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

当然还有一个切换标志,取决于N/S或E/S。维基百科有一点:

对于计算,西/东后缀在西半球用负号代替。令人困惑的是,有时也会看到东方消极的惯例。首选的公约 - 东方国家是积极的 - 与北极的右手笛卡尔坐标系一致。然后可以将特定的经度与特定的纬度(在北半球通常为正值)相结合,以便在地球表面上给出精确的位置。 (http://en.wikipedia.org/wiki/Longitude

+0

你在代码次要错误 - 第二分区(秒)应通过3600 – 2008-09-19 15:55:51

+0

正确公式为:结果=度+(分钟/ 60)+(秒/ 3600); – holiveira 2009-05-15 23:31:36

0

你想把它表示成什么?弧秒? 然后每分钟60分钟,每分钟60秒。 然后你必须自己保留E和​​N.

但这并不是通常的做法。

我见过的最简单的代表是在地球上绘制的一个点,它的起源是通过地球的中心。[因此一个很好的位置矢量。]这个问题是虽然使用这些数据很容易,但是正确地将其导入系统并将其导出系统可能会很困难,因为地球不是圆形的,或者是统一的。

7

感谢您的所有快速解答。基于amdfan的回答,我将这些代码放在一起,完成了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; 
}