ما هي أسهل طريقة لتحويل خطوط الطول والعرض إلى قيم مزدوجة

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

  •  01-07-2019
  •  | 
  •  

سؤال

لدي ملف CSV يحتوي على قيم خطوط الطول والعرض، مثل:

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

هل لدى أي شخص جزء سريع وبسيط من كود C# لتحويل هذا إلى قيم مزدوجة؟

شكرًا

هل كانت مفيدة؟

المحلول

إذا كنت تقصد كود C# للقيام بذلك:

النتيجة = 25 + (36 / 60) + (55.57 / 3600)

ستحتاج أولاً إلى تحليل التعبير باستخدام Regex أو أي آلية أخرى وتقسيمه إلى أجزاء فردية.ثم:

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)

نصائح أخرى

شكرا لجميع الإجابات السريعة.بناءً على إجابة 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;
}

ماذا تريد أن تمثله؟ثانية قوسية؟ثم 60 دقيقة في كل درجة، و60 ثانية في كل دقيقة.سيتعين عليك بعد ذلك الاحتفاظ بـ E و N بنفسك.

هذه ليست الطريقة التي يتم بها الأمر بشكل عام.

إن أسهل تمثيل رأيته للعمل به هو نقطة مرسومة على الكرة الأرضية على نظام شبكي أصله يمر بمركز الأرض. [وبالتالي فإن متجه موضع جميل.] المشكلة في هذا هي أنه على الرغم من أنه من السهل عند استخدام البيانات، فإن إدخالها وإخراجها من النظام بشكل صحيح قد يكون أمرًا صعبًا، لأن الأرض ليست مستديرة، أو في هذا الصدد متجانسة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top