Como faço para calcular o azimute (ângulo para o norte) entre duas coordenadas WGS84 em uma única consulta T-SQL?

StackOverflow https://stackoverflow.com/questions/1050950

Pergunta

Eu encontrei a solução para esta questão em C # , mas não posso traduzi-lo para uma única consulta T-SQL, desde o meu C # implementação requer ramificação (se, em seguida, outra pessoa).

Eu também achei a seguinte solução C #, que poderia ser traduzido para uma única consulta T-SQL, mas não produz os resultados corretos

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

Código de Tamir Khason - código Apenas

Alguém poderia corrigir o código acima ou fornecer uma solução alternativa?

Foi útil?

Solução

Substituir ifs com expressões CASE:

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

substituir com:

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

substituir ifs consecutivos com seleciona aninhados:

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

substituir com

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

Outras dicas

Você considerou a criação de um montagem com um SP em C # para sql server? Essa é a rota que eu provavelmente iria.

Há um monte da trigonometria esférica necessário na resposta a SO 389211 . Copiar e modificar o que eu escrevi lá:

Considere um triângulo sperical com ângulos A , B , C nos vértices e lados a , < em> b , c oposto esses vértices (isto é, lado a é de b C , etc.). Aplicando este para o problema, podemos chamar os dois pontos dados B e C , e criamos um triângulo esférico direita com um ângulo direito em A .

Considere este diagrama:

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

Você recebe dois pontos B e C , e você quer para determinar o ângulo X = 90º - B. O lado c é igual à diferença de longitude, ??; o lado b é igual à diferença de latitude, ?f; o ângulo A é 90º, então pecado A = 1 e cos A = 0. Para determinar X, queremos que o valor de b dada b , c e A .

Olhando para o problema a partir de primeiros princípios, precisamos dos dois principais equações trigonometria esférica:

  1. A Fórmula Sine:

    sin A   sin B   sin C
    ----- = ----- = -----
    sin a   sin b   sin c
    
  2. A Fórmula Cosseno:

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

Por isso, acredito uma equação para a é:

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

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

Dada a , b e A , podemos usar a Fórmula Sine para determinar B :

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

ou

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

Ou, já que A = 90º, o pecado A = 1, eo pecado B = sin (90º - X) = cos X:

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

Eu prefiro suspeito que, se eu dobrei minha mente para ela (ou você inclinou sua mente para ela), você poderia vir acima com uma resposta que não envolvem o uso de arccos seguido pelo pecado.

No T-SQL, você pode usar a expressão CASE

por exemplo.

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

etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top