Как рассчитать азимут (угол на север) между двумя координатами WGS84 в одном запросе T-SQL?

Я обнаружил решение этого вопроса на 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))))); 
}

Код из Тамир Хасон - Просто код

Может ли кто-нибудь исправить приведенный выше код или предложить альтернативное решение?


person Jader Dias    schedule 26.06.2009    source источник
comment
Почему вы хотите сделать это в запросе?   -  person quant_dev    schedule 27.06.2009
comment
@quant_dev, потому что мне нужна производительность. запрашивать результаты, обрабатывать и записывать их с C # слишком медленно   -  person Jader Dias    schedule 27.06.2009
comment
Вы выполняете пакетный запрос или запрашиваете по одной строке за раз? (Без обид, но я видел, как это делается ...)   -  person quant_dev    schedule 27.06.2009
comment
Получаю все результаты, обрабатываю и сразу вставляю   -  person Jader Dias    schedule 27.06.2009


Ответы (4)


Замените ifs выражениями 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 на вложенные выборки:

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
person A-K    schedule 26.06.2009

Думали ли вы о создании сборки с SP на C #? для sql сервера? Я бы, наверное, пошел по этому пути.

person Chris Klepeis    schedule 26.06.2009
comment
у вас есть ссылка на лучший учебник? - person Jader Dias; 27.06.2009
comment
конечно да. chiragrdarji.wordpress.com/2008 / 03/11 / - person Chris Klepeis; 27.06.2009

В ответе на SO 389211 довольно много необходимой сферической тригонометрии.. Копирование и изменение того, что я там написал:

Рассмотрим прямоугольный треугольник с углами A, B, C в вершинах и сторонах a, b , c напротив этих вершин (то есть сторона a находится от B до C и т. д. .). Применяя это к задаче, мы можем назвать две заданные точки B и C, и мы создадим прямоугольный сферический треугольник с прямым углом в A .

Рассмотрим эту диаграмму:

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

Вам даны две точки B и C, и вы хотите определить угол X = 90º - B. Сторона c < / em> равно разности долготы Δλ; сторона 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
    

Поэтому я считаю, что уравнение для 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

Or

        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 с последующим грехом.

person Jonathan Leffler    schedule 05.11.2009

В T-SQL вы можете использовать выражение CASE

e.g.

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

и Т. Д.

person Jeremy Smyth    schedule 26.06.2009