단일 T-SQL 쿼리에서 두 개의 WGS84 좌표 사이의 방위각 (북쪽에서 북쪽으로)을 어떻게 계산합니까?
-
20-08-2019 - |
문제
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)))));
}
누군가 위의 코드를 수정하거나 대체 솔루션을 제공 할 수 있습니까?
해결책
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를 결정하려면 값을 원합니다. 비 주어진 비, 씨 그리고 ㅏ.
첫 번째 원칙의 문제를 살펴보면 두 가지 주요 구형 삼각법 방정식이 필요합니다.
사인 공식 :
sin A sin B sin C ----- = ----- = ----- sin a sin b sin c
코사인 포뮬러 :
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 ....
등.