如何在单个T-SQL查询中计算两个WGS84坐标之间的方位角(北角)?

时间:2009-06-26 19:53:22

标签: sql-server-2005 tsql geospatial azimuth

I found the solution for this question in 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 – Just code的代码

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

4 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:2)

您是否考虑过使用C#中的SP为SQL Server创建assembly?那是我可能去的路线。

答案 2 :(得分:2)

SO 389211的答案中有相当多的必要球面三角学。复制和修改我在那里写的内容:

考虑在顶点和侧面 A B C 的精确三角形 a ,< em> b , c 与这些顶点相对(即, a B C >,等)。 将此问题应用于问题,我们可以调用 B C 给出的两个点,并在 A 处创建一个直角的直角三角形>

考虑这个图:

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

你有两个点 B C ,你想确定角度 X =90º - B.侧面 c 等于经度差Δλ;边 b 等于纬度差Δφ;角度 A 是90º,所以sin A = 1而cos A = 0.要确定X,我们需要的值B 指定 b c A

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

  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
    
  3. 因此,我认为 a 的等式是:

    cos a = cos Δλ . cos Δφ + sin Δλ . sin Δφ . cos 90º
    
    a = arccos (cos Δλ . cos Δφ)
    

    鉴于 a b 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
    

    我宁愿怀疑如果我坚持下去(或者你一心想要),你可以想出一个不涉及使用arccos然后犯罪的答案。

答案 3 :(得分:1)

在T-SQL中,您可以使用CASE表达式

e.g。

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