2008-09-19 27 views

Trả lời

11

Nếu bạn có nghĩa là mã C# để làm điều này:

result = 25 + (36/60) + (55,57/3600)

Trước tiên, bạn sẽ cần phải phân tích sự biểu hiện với Regex hoặc một số cơ chế khác và chia nó thành từng phần riêng biệt. Sau đó:

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

Và tất nhiên là chuyển sang dấu lật tùy thuộc vào N/S hoặc E/S. Wikipedia có một chút về điều đó:

Để tính toán, hậu tố Tây/Đông được thay thế bằng dấu trừ ở bán cầu tây. Nhầm lẫn, quy ước tiêu cực đối với phương Đông cũng đôi khi được nhìn thấy. Công ước được ưu tiên - rằng phương Đông là dương - phù hợp với hệ thống tọa độ thuận tay phải của Cartes với Bắc cực. Một kinh độ cụ thể sau đó có thể được kết hợp với một vĩ độ cụ thể (thường là dương ở bán cầu bắc) để đưa ra một vị trí chính xác trên bề mặt Trái Đất. (http://en.wikipedia.org/wiki/Longitude)

+0

Bạn có lỗi nhỏ trong mã - bộ phận thứ hai (giây) nên bởi 3600. –

+0

Công thức đúng là: result = DEG + (min/60) + (giây/3600); – holiveira

+0

không phải là những gì tôi có? thứ tự của các hoạt động quy định rằng phân chia sẽ được thực hiện trước khi bổ sung. – ine

0

Bạn muốn đại diện cho điều đó là gì? Arc giây? Sau đó, 60 phút ở mọi cấp độ, 60 giây trong mỗi phút. Bạn sẽ phải giữ E và N một mình.

Tuy nhiên, đây không phải là cách thực hiện.

Biểu diễn đơn giản nhất mà tôi đã thấy là một điểm được vẽ trên toàn cầu trên hệ thống lưới có nguồn gốc của nó thông qua tâm của trái đất. [Vì vậy, một vectơ vị trí đẹp.] Vấn đề với điều này là trong khi nó dễ sử dụng dữ liệu, việc đưa nó vào và ra khỏi hệ thống một cách chính xác có thể khó khăn, bởi vì trái đất không tròn, hoặc cho đồng phục vật chất đó.

7

Cảm ơn tất cả các câu trả lời nhanh. Dựa trên câu trả lời của amdfan, tôi đặt mã này lại với nhau để thực hiện công việc trong 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

Mã đó hoàn hảo! Tôi chỉ cải tiến một chút: riêng tư Regex Parser = new Regex ("^ (? [- + 0-9] {2}) [^ 0-9] + (? [0-9] { 2}) [^ 0-9] + (? [0-9.,] +) [^ 0-9., ENSW]? (? [ENSW] *) $); –

+0

Đặt 'Biến thể bất biến' cho' double.Parse' sẽ tốt hơn. –

Các vấn đề liên quan