2009-06-26 9 views
0

I found the solution for this question in C#, но я не могу перевести его на один запрос T-SQL, так как моя реализация C# требует ветвления (если тогда еще).Как рассчитать азимут (угол к северу) между двумя координатами WGS84 в одном запросе T-SQL?

Я также нашел следующую 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

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

+0

Почему вы хотите сделать это в запросе? –

+0

@quant_dev, потому что мне нужна производительность. запрашивать результаты, обрабатывать и записывать их обратно с C# слишком медленно –

+0

Вы выполняете пакетный запрос или запрос по одной строке за раз? (Не обижайтесь, но я это сделал ...) –

ответ

3

Заменить 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 
2

Считаете ли вы создание assembly с SP в C# для сервера sql? Это маршрут, который я, вероятно, пойду.

+0

. У вас есть ссылка на лучший учебник? –

+1

обязательно сделаю. http://chiragrdarji.wordpress.com/2008/03/11/clr-stored-procedure-in-sql-server-2005/ –

1

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

например,

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

т.д.

2

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

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

Рассмотрим эту схему:

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

Вам дается две точки B и C, и вы хотите, чтобы определить угол X = 90º - B.Сторона c равна разнице в долготе, Δλ; сторона b равна разности широты Δφ; угол является 90º, поэтому грех = 1 и соз = 0. Для определения X, мы хотим, чтобы значение В данной б, с и .

Глядя на проблему из первых принципов, нам нужны две основные сферические тригонометрии уравнения:

  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 
    

Поэтому я считаю, уравнение для является:

cos a = cos Δλ . cos Δφ + sin Δλ . sin Δφ . cos 90º 

a = arccos (cos Δλ . cos Δφ) 

Учитывая , б и , мы можем использовать Sine формулу для определения B:

sin a sin b 
----- = ---- 
sin A sin B 

или

 sin b . sin A 
sin B = ------------- 
      sin a 

Или, так как A = 90º, грех A = 1, и грех B = sin (90º - X) = соз X:

 sin b 
cos X = ----- 
     sin a 

Я подозреваю, что если я согнуты мой разум к нему (или ты загнул ваш ум к этому), вы могли бы найти ответ, который не включал бы использование arccos, за которым следовал бы грех.

+0

Хороший материал. Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^