단일 T-SQL 쿼리에서 두 개의 WGS84 좌표 사이의 방위각 (북쪽에서 북쪽으로)을 어떻게 계산합니까?

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

문제

C# 에서이 질문에 대한 해결책을 찾았습니다., 그러나 C# 구현에는 분기가 필요하기 때문에 단일 쿼리 T-SQL로 변환 할 수 없습니다.

또한 단일 쿼리 T-SQL로 변환 될 수있는 다음 C# 솔루션을 찾았지만 올바른 결과는 생성되지 않습니다.

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 - 코드

누군가 위의 코드를 수정하거나 대체 솔루션을 제공 할 수 있습니까?

도움이 되었습니까?

해결책

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

다른 팁

당신은 만들기를 고려 했습니까? 집회 SQL Server 용 SP가 있습니까? 그게 내가 갈 길입니다.

답에 필요한 구형 삼각법이 많이 있습니다. 그래서 389211. 내가 쓴 내용을 복사하고 수정 :

각도가있는 스페리어 삼각형을 고려하십시오 , , 정점과 측면에서 , , 그 정점 (즉, 측면 출신입니다 에게 , 등.). 문제에 이것에 적용하면 주어진 두 가지 점을 호출 할 수 있습니다. 그리고 , 그리고 우리는 직각으로 올바른 구형 삼각형을 만듭니다. .

이 다이어그램을 고려하십시오.

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

당신은 두 가지 점이 주어집니다 그리고 , 그리고 당신은 각도를 결정하고 싶습니다 엑스 = 90º -B. 측면 경도의 차이와 동일합니다, Δλ; 측면 위도의 차이, Δφ와 동일합니다. 각도 90º이므로 죄입니다 = 1과 cos = 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 Δφ)

주어진 , 그리고 , 우리는 사인 공식을 사용하여 결정할 수 있습니다 :

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를 사용하고 죄가 뒤 따르는 대답을 생각해 낼 수 있다고 생각합니다.

T-SQL에서는 케이스 표현식을 사용할 수 있습니다

예를 들어

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

등.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top