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)))));
}
有人可以更正上面的代码或提供替代解决方案吗?
答案 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 。
从第一原理看问题,我们需要两个主要的球面三角学方程:
正弦公式:
sin A sin B sin C
----- = ----- = -----
sin a sin b sin c
余弦公式:
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 Δφ)
鉴于 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 ....
等