0

この質問の解決策はC#で見つかりましたが、C#の実装には分岐が必要なため(そうでない場合)、単一のクエリT-SQLに変換できません。

また、次の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))))); 
}

Tamir Khasonからのコード–コードだけ

誰かが上記のコードを修正するか、別の解決策を提供できますか?

4

4 に答える 4

3

ifをCASE式に置き換えます。

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

と置換する:

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

連続するifをネストされたselectに置き換えます。

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
于 2009-06-26T20:03:32.360 に答える
2

SO 389211の回答には、必要な球面三角法がかなりたくさんあります。私がそこに書いたものをコピーして変更する:

頂点に角度ABCがあり、それらの頂点の反対側に辺abcがある(つまり、辺aBからCになっているなど)特殊な三角形について考えてみます。これを問題に適用すると、 BCが与えられた2つの点を呼び出すことができ、 Aで直角の直角球面三角形を作成します。

この図を検討してください。

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

2つの点BCが与えられ、角度X =90º--Bを決定したいとします。辺cは経度の差Δλに等しくなります。辺bは、緯度の差Δφに等しくなります。角度Aは90度なので、sin A =1およびcosA = 0です。Xを決定するには、b c およびAが与えられたBの値が必要です。

第一原理から問題を見ると、2つの主要な球面三角法方程式が必要です。

  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
    

したがって、 aの方程式は次のようになります。

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

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

ab、およびAが与えられると、正弦式を使用してBを決定できます。

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

むしろ、私がそれに心を曲げた場合(またはあなたがそれに心を曲げた場合)、アークコサインの後に罪を使用することを含まない答えを思い付くことができるのではないかと思います。

于 2009-11-05T08:26:41.373 に答える
2

SQL Server用のC#でSPを使用してアセンブリを作成することを検討しましたか?それは私がおそらく行くルートです。

于 2009-06-26T19:57:42.560 に答える
1

T-SQLでは、CASE式を使用できます

例えば

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

于 2009-06-26T19:59:13.260 に答える