Как мне вычислить азимут (угол к северу) между двумя координатами WGS84 в одном запросе T-SQL?
-
20-08-2019 - |
Вопрос
Я нашел решение этого вопроса на C#, но я не могу перевести это в один запрос T-SQL, поскольку моя реализация на C # требует ветвления (if then else).
Я также нашел следующее решение на 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)))));
}
Код из Тамир Хасон – Просто код
Может ли кто-нибудь исправить приведенный выше код или предоставить альтернативное решение?
Решение
Замените 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
Другие советы
Рассматривали ли вы возможность создания сборка с SP в C # для sql server?Это маршрут, которым я, вероятно, пошел бы.
В ответе на ИТАК , 389211.Копирование и изменение того, что я там написал:
Рассмотрим сферический треугольник с углами A, B, C в вершинах и по бокам a, b, c напротив этих вершин (то есть сбоку a находится от B Для C, и т.д.).Применяя это к задаче, мы можем назвать две приведенные точки B и C, и мы создаем прямоугольный сферический треугольник с прямым углом в A.
Рассмотрим эту диаграмму:
+ C
/|
/ |
a / | b
| / |
|X/ |
|/ |
B +------+ A
c
Вам дается два балла B и C, и вы хотите определить угол X = 90 ° - В.Сторона c равна разнице в долготе, Δλ;сторона b равна разнице в широте, Δφ;угол A равно 90º, так что грех 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, за которым следует sin.
В T-SQL вы могли бы использовать выражение CASE
например ,
SELECT ...
CASE
WHEN latD = 0 AND longD < 0 THEN ....
WHEN latD < 0 AND longD = 0 THEN ....
и т.д.