2009-06-26 9 views
0

I found the solution for this question in C#, mais je ne peux pas le traduire en une seule requête T-SQL, puisque mon implémentation en C# nécessite une dérivation (si par la suite).Comment calculer l'azimut (angle au nord) entre deux coordonnées WGS84 dans une seule requête T-SQL?

J'ai aussi trouvé la solution C# suivante, ce qui pourrait se traduire par un T-SQL seule requête, mais il ne produit pas les résultats corrects

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))))); 
} 

code de Tamir Khason – Just code

Quelqu'un pourrait-il corriger la code ci-dessus ou fournir une autre solution?

+0

Pourquoi voulez-vous le faire dans une requête? –

+0

@quant_dev parce que j'ai besoin de performance. interroger les résultats, les traiter et les réécrire à partir de C# est trop lent –

+0

Est-ce que vous mettez en lot la requête ou la requête pour une ligne à la fois? (Pas d'offense, mais j'ai vu cela fait ...) –

Répondre

3

Remplacer ifs avec des expressions CASE:

if (latitudinalDifference == 0) 
      { 
       if (longitudinalDifference != 0) 
       { 
        azimuth = Math.PI/2d; 
       } 
      } 

remplacer par:

SELECT CASE WHEN @latitudinalDifference = 0 AND @longitudinalDifference <> 0 THEN ... 
ELSE ... END AS azimuth 

remplacer ifs consécutifs imbriquées Selects:

if(some condition) 
{ 
    i=1; 
} 
else 
{ 
i=2; 
} 
if(some other condition) 
{ 
    i++; 
} 

remplacer par

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

Avez-vous envisagé de créer un assembly avec un SP en C# pour le serveur sql? C'est la route que j'irais probablement.

+0

auriez-vous un lien vers un meilleur tutoriel? –

+1

bien sûr. http://chiragrdarji.wordpress.com/2008/03/11/clr-stored-procedure-in-sql-server-2005/ –

1

Dans T-SQL, vous pouvez utiliser l'expression CASE

par exemple

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

etc.

2

Il y a beaucoup de la trigonométrie sphérique nécessaire dans la réponse à SO 389211. La copie et la modification de ce que j'écrit là:

Considérons un triangle sphérique avec des angles A, B, C aux sommets et sur les côtés un, b, c en regard de ces sommets (qui est, côté un est de B à C, etc.). En appliquant cela au problème, nous pouvons appeler les deux points donnés B et C, et nous créons un triangle sphérique droit avec un angle droit à A.

Considérez ce schéma:

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

On vous donne deux points B et C, et que vous souhaitez déterminer l'angle X = 90º - B.Le côté c est égal à la différence de longitude, Δλ; le côté b est égal à la différence de latitude, Δφ; l'angle A est 90º, donc le péché A = 1 et cos A = 0. Pour déterminer X, nous voulons que la valeur de B donnée b, c et A.

En regardant le problème des premiers principes, nous avons besoin des deux principales équations de la trigonométrie sphérique:

  1. La formule Sine:

    sin A sin B sin C 
    ----- = ----- = ----- 
    sin a sin b sin c 
    
  2. La formule Cosinus:

    cos a = cos b . cos c + sin b . sin c . cos A 
    

Par conséquent, je crois une équation pour un est:

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

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

Compte tenu un, b et A, on peut utiliser la formule Sine pour déterminer B:

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

ou

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

Ou, puisque A = 90º, sin A = 1, et le péché B = sin (90º - X) = cos X:

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

Je préfère pense que si je baissai mon esprit (ou vous plié votre esprit à cela), vous pourriez trouver une réponse qui n'implique pas l'utilisation d'arccos suivie par le péché.

+0

Bonnes choses. Merci. –

Questions connexes