두 WGS84 좌표 사이의 방위각 (북쪽에서 북쪽으로)을 계산하는 방법

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

  •  22-07-2019
  •  | 
  •  

문제

나는 2 개의 WGS84 좌표, 위도 및 경도를 정도로 얻었습니다. 이 지점은 다소 가깝습니다. 예를 들어 1 미터 떨어져 있습니다.

이 지점, 즉 북쪽의 각도 사이의 선의 방위각을 계산하는 쉬운 방법이 있습니까?

순진한 접근 방식은 직교 좌표계를 가정하고 (이 점이 너무 가깝기 때문에) 사용하는 것입니다.

sin (a) = abs (l2-l1) / sqrt (sqr (l2-l1) + sqr (b2-b1))

A = 방위각 L1, L2 = 경도 B1, B2 = 위도

좌표가 적도에서 멀어지면 오차가 커질 것입니다. 두 개의 세로도 사이의 거리는 두 위도도 (일정하게 유지) 사이의 거리보다 점점 더 작아지기 때문입니다.

나는 함께 가깝게 가까이있는 지점에 대해 과잉으로 보이기 때문에 실제로 구현하고 싶지 않은 아주 복잡한 공식을 발견했습니다. GPS가 반환하는 것과 같이 어쨌든 정밀도를 줄이는 다른 요소입니다).

위도에 따라 대략적인 종 방향 보정 계수를 결정하고 다음과 같이 사용할 수 있습니다.

sin (a) = abs (l2*f-l1*f) / sqrt (sqr (l2*f-l1*f) + sqr (b2-b1))

여기서 F는 보정 계수입니다

힌트가 있습니까?

(나는 이것에 어떤 라이브러리를 사용하고 싶지 않습니다. 특히 런타임 라이센스가 필요한 라이브러리가 아닙니다. 모든 MPLED 델파이 소스는 훌륭 할 것입니다.)

도움이 되었습니까?

해결책

텍스트에서 언급 한 공식은 2 점 사이의 큰 원 거리는 계산하는 것입니다. 점 사이의 각도를 계산하는 방법은 다음과 같습니다.

uses Math, ...;
...

const
  cNO_ANGLE=-999;

...

function getAngleBetweenPoints(X1,Y1,X2,Y2:double):double;
var
  dx,dy:double;
begin
  dx := X2 - X1;
  dy := Y2 - Y1;

  if (dx > 0) then  result := (Pi*0.5) - ArcTan(dy/dx)   else
  if (dx < 0) then  result := (Pi*1.5) - ArcTan(dy/dx)   else
  if (dy > 0) then  result := 0                          else
  if (dy < 0) then  result := Pi                         else
                    result := cNO_ANGLE; // the 2 points are equal

  result := RadToDeg(result);
end;
  • 2 포인트가 같은 상황을 처리해야합니다 (결과가 CNO_ANGLE와 동일한 지 확인하거나 예외를 던지기 위해 함수를 수정하십시오).

  • 이 기능은 평평한 표면에 있다고 가정합니다. 당신이 언급 한 작은 거리에서 이것은 모두 괜찮지 만, 당신이 전 세계의 도시들 사이의 제목을 계산하려면 지구의 모양을 세는 것을 조사하고 싶을 것입니다.

  • 이 기능에 이미 평평한 표면에 맵핑 된 좌표를 제공하는 것이 가장 좋습니다. 그래도 WGS84 위도를 Y로 직접 공급하고 (X로 Lon)를 공급하여 거친 근사치를 얻을 수 있습니다.

다른 팁

다음은 C# 솔루션입니다. 0, 45, 90, 135, 180, 225, 270 및 315 각도에 대해 테스트했습니다.

편집하다 Wouter 솔루션의 C# 번역으로 이전 Ugly 솔루션을 대체했습니다.

public double GetAzimuth(LatLng destination)
{
    var longitudinalDifference = destination.Lng - this.Lng;
    var latitudinalDifference = destination.Lat - this.Lat;
    var azimuth = (Math.PI * .5d) - Math.Atan(latitudinalDifference / longitudinalDifference);
    if (longitudinalDifference > 0) return azimuth;
    else if (longitudinalDifference < 0) return azimuth + Math.PI;
    else if (latitudinalDifference < 0) return Math.PI;
    return 0d;
}

public double GetDegreesAzimuth(LatLng destination)
{
    return RadiansToDegreesConversionFactor * GetAzimuth(destination);
}

이 링크를 찾았습니다

http://williams.best.vwh.net/avform.htm

답에 주어진

LAT/LON + 거리 + 제목 -> LAT/LON

이것은 유망한 것처럼 보입니다. 특히 끝 근처에 주어진 평평한 지구 근사치가 보입니다.

이것은 작은 차이 만으로만 작동합니다. 그렇지 않으면 당신은 단지 "위도 방향 / 종 방향 변동"만 할 수 없습니다.

경도를 기반으로 보정 계수를 구현하는 것이 좋습니다. 특정 지점에서 x 마일 이내에 모든 지오 코딩 된 레코드를 반환하고 시뮬레이션 문제에 부딪 치기 위해 한 번 시뮬레이션 루틴을 구현했습니다. 불행히도 나는 더 이상 코드가없고 수정 번호에 어떻게 도착했는지 기억할 수 없지만 당신은 올바른 길을 가고 있습니다.

누구든지 이것을 테스트 한 사람이 있습니까? 정답을 반환하지 않습니다

이 기능은 평평한 표면에 있다고 가정합니다. 당신이 언급 한 작은 거리에서 이것은 모두 괜찮지 만, 당신이 전 세계의 도시들 사이의 제목을 계산하려면 지구의 모양을 세는 것을 조사하고 싶을 것입니다.

당신의 평평한 지구는 이것과 거의 관련이 없습니다. 당신이 부르는 오류는 당신이 한 지점에서 초기 방위각을 계산하기 때문입니다. 극으로 곧장 향하지 않으면 극과의 관계는 거리에 따라 변합니다. 어쨌든 위의 프로그램은 올바른 결과를 반환하지 않습니다.

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