كيف يمكنني حساب السمت (الزاوية إلى الشمال) بين إحداثيات WGS84 في استعلام T-SQL واحد؟

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

سؤال

لقد وجدت الحل لهذا السؤال في C#, ، لكن لا يمكنني ترجمته إلى استعلام واحد T-SQL، نظرًا لأن تطبيق C# الخاص بي يتطلب التفرع (إذا كان الأمر كذلك).

لقد وجدت أيضًا حل C# التالي، والذي يمكن ترجمته إلى استعلام واحد T-SQL ولكنه لا ينتج النتائج الصحيحة

public static double GetAzimuth(WGSCoord c1, WGSCoord c2) { 
     var lat1 = DegToRad(c1.Latitude); 
     var lon1 = DegToRad(c1.Longitude); 
     var lat2 = DegToRad(c2.Latitude); 
     var lon2 = DegToRad(c2.Longitude);

     return RadToDeg(Math.Asin(Math.Sin(lon1 – lon2) * Math.Cos(lat2) / Math.Sin(Math.Acos(Math.Sin(lat2) * Math.Sin(lat1) + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(lon2 – lon1))))); 
}

الكود من تامير خاسون - مجرد كود

هل يمكن لأي شخص تصحيح الكود أعلاه أو تقديم حل بديل؟

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

المحلول

واستبدال المحاذير مع تعبيرات حالة:

   if (latitudinalDifference == 0)
            {
                if (longitudinalDifference != 0)
                {
                    azimuth = Math.PI / 2d;
                }
            }

ويستعاض عنها:

SELECT CASE WHEN @latitudinalDifference = 0 AND @longitudinalDifference <> 0 THEN ...
 ELSE ... END AS azimuth

واستبدال المؤسسة الدولية للعلوم متتالية مع يختار المتداخلة:

if(some condition)
{
  i=1; 
}
else
{
 i=2;
}
if(some other condition)
{
  i++; 
}

واستبدال

SELECT i + CASE WHEN (some other condition) THEN 1 ELSE 0 END
FROM(
SELECT CASE WHEN (some condition) THEN 1 ELSE 2 END AS i
) AS t

نصائح أخرى

هل تعتبر تهيئة التجمع مع SP في C # لخادم SQL؟ ولهذا الطريق ربما سأذهب.

هناك الكثير من علم المثلثات الكروية الضرورية في الإجابة على هذا السؤال سو 389211.نسخ وتعديل ما كتبته هناك:

النظر في مثلث كروي مع الزوايا أ, ب, ج في القمم والجوانب أ, ب, ج مقابل تلك القمم (أي الجانب أ انه من ب ل ج, ، إلخ.).وبتطبيق ذلك على المسألة، يمكننا تسمية النقطتين الموضحتين ب و ج, ، ونقوم بإنشاء مثلث كروي قائم بزاوية قائمة عند أ.

النظر في هذا الرسم البياني:

                  + C
                 /|
                / |
            a  /  | b
           |  /   |
           |X/    |
           |/     |
         B +------+ A
              c

يتم إعطاؤك نقطتين ب و ج, ، وتريد تحديد الزاوية X = 90 درجة - ب.الجانب ج يساوي الفرق في خط الطول، Δε؛الجانب ب يساوي الفرق في خط العرض، Δφ؛الزاوية أ هو 90 درجة، لذلك الخطيئة أ = 1 و كوس أ = 0.لتحديد X، نريد قيمة ب منح ب, ج و أ.

بالنظر إلى المشكلة من المبادئ الأولى، نحتاج إلى معادلتين رئيسيتين في علم المثلثات الكروية:

  1. صيغة الجيب:

    sin A   sin B   sin C
    ----- = ----- = -----
    sin a   sin b   sin c
    
  2. صيغة جيب التمام:

    cos a = cos b . cos c + sin b . sin c . cos A
    

ولذلك، أعتقد معادلة ل أ يكون:

cos a = cos Δλ . cos Δφ + sin Δλ . sin Δφ . cos 90º

a = arccos (cos Δλ . cos Δφ)

منح أ, ب و أ, يمكننا استخدام صيغة الجيب لتحديد ب:

sin a   sin b
----- = ----
sin A   sin B

أو

        sin b . sin A
sin B = -------------
            sin a

أو بما أن A = 90°، فإن sin A = 1، وsin B = sin (90° - X) = cos X:

        sin b
cos X = -----
        sin a

أظن أنه إذا وجهت ذهني إليه (أو وجهت عقلك إليه)، فيمكنك التوصل إلى إجابة لا تتضمن استخدام arccos متبوعًا بالخطيئة.

في T-SQL، يمكنك استخدام التعبير كيس

ومنها مثلا.

SELECT ...
CASE 
    WHEN latD = 0 AND longD < 0 THEN ....
    WHEN latD < 0 AND longD = 0 THEN ....

وغيرها.

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