0

我在 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))))); 
}

来自Tamir Khason 的代码 – 只是代码

有人可以更正上面的代码或提供替代解决方案吗?

4

4 回答 4

3

用 CASE 表达式替换 ifs:

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

用。。。来代替:

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

用嵌套选择替换连续的 if:

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(即,边a是从BC等)。将此应用于问题,我们可以将给定的两个点称为BC ,并创建一个在A处具有直角的直角球面三角形。

考虑这个图表:

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

给定两个点BC,并且要确定角度X = 90º - B。边c等于经度差 Δλ;b边等于纬度差Δφ;角度A为 90º,因此 sin A = 1 和 cos A = 0。要确定 X,我们需要给定bcA的B值。

从第一原理看问题,我们需要两个主要的球面三角方程:

  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 Δφ)

给定abA,我们可以使用正弦公式来确定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

我宁愿怀疑,如果我一心一意(或者您一心一意),您可能会想出一个不涉及使用 arccos 后跟 sin 的答案。

于 2009-11-05T08:26:41.373 回答
2

您是否考虑过在 C# 中为 sql server 创建带有 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 回答