(큰 원) 경로에서 프로젝트 위치 수 있습니다. 그래서 나는

나는이 SE 사이트를 꽤 오랫동안 검색 해 왔으며 여전히 내 질문에 대한 해결책을 찾기 위해 고심하고 있습니다. 내 목표는 OSM과 내 위치 (위도 / 경도 좌표)에서 길을 찾은 다음 그 방법으로 가장 가까운 위치 (위도 / 경도 좌표)를 찾고 싶습니다. 지점은 길을 정의하는 데 사용되는 지점으로 제한되지 않고 도중에있을 수 있습니다.

그래서 나는 다음 알고리즘을 생각하고 있습니다 :

  1. 별도의 모서리로 경로를 분리하고 각 모서리는 두 점만 연결합니다.
  2. 가장 가까운 가장자리를 선택하십시오.
  3. 그 위치에 내 위치를 투영하십시오.

이제 위치와 경로 사이의 거리를 계산하는 방법에 대한 많은 질문이 있습니다.

또한 계산을 올바르게하거나 확인할 수없는 매우 비슷한 질문입니다.

그 주제에 관한 Dr. Math의 정보도 있습니다 . 그러나 3 단계에서 위치를 계산하는 알고리즘을 찾을 수없는 것 같습니다. 꽤 오랫동안 (벡터) 대수를 만지지 않았으므로 해당 답변의 논리를 이해하지 못합니다.

누군가이 작업을 수행하는 알고리즘을 보여줄 수 있습니까? 합리적인 프로그래밍 언어의 솔루션은 저에게 좋습니다.



답변

구형의 지구 모델을 사용하면 적절한 정확도를 얻을 수 있으며 간단한 빠른 계산이 가능합니다.

모든 좌표를 지구 중심 (3D) 직교 좌표로 변환합니다. 예를 들어

(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))

할 것이다. (지구 반경이 한 단위 인 거리 측정을 사용하므로 편리합니다.)

시작점에 대해 X0 = (x0, y0, z0)을 작성하고 큰 점을 정의하는 대상 지점에 대해 X1 = (x1, y1, z1)을 작성합니다. U를 X0과 X1의 정규화 된 교차 곱이라고합시다. 이것은 두 단계로 계산됩니다.

V = (xv, yv, zv) = (y0*z1 - z0*y1, z0*x1 - x0*z1, x0*y1 - y0*x1)

V의 길이는

|V| = sqrt(xv^2 + yv^2 + zv^2)

정규화는 V를 단위 길이로 늘립니다.

U = (xu, yu, zu) = V / |V| = (xv/|V|, yv/|V|, zv/|V|).

점 X = (x, y, z)와이 큰 원의 평면 사이의 방향 3D 거리는 X와 Z의 내적입니다.

d = X * U = x*xu + y*yu + z*zu

지구 표면의 거리 측면에서 가장 가까운 점 은 평면에 가장 가까운 점이므로 d의 절대 값이 가장 작습니다 .

이 그림은 그 큰 원의 평면까지의 절대 3D 거리에 따라 색상이 지정되고 음영 처리 된 구의 두 개의 흰색 점과 2000 개의 임의의 점으로 결정된 큰 원 (검정색)을 보여줍니다. 즉, | d |.

가장 가까운 점을 찾은 후 먼저 큰 원의 평면 (3D)에 투영 한 다음 방사형 바깥쪽으로 지표면까지 연장하여 큰 원으로 투영합니다. 이 투영법은 단순히 d * U를 뺍니다.

X' = (x', y', z') = X - d*U = (x - d*xu, y - d*yu, z - d*zu).

방사상 투영은 V가 U로 다시 정규화되는 것과 같은 방식으로 X ‘를 단순히 정규화합니다.

X'' = X' / |X'|.

(가장 가까운 점이 큰 원의 극 중 하나 일 때 발생하는 | X ‘| = 0 인 경우 문제가됩니다. 발생할 수있는 경우이 조건에 대한 코드에 테스트를 포함하고 별도로 처리하십시오. d 의 부호를 사용하여 어떤 극을 식별하십시오.)

원하는 경우 일반적인 공식을 사용하여 X ”의 좌표를 (lat, lon)으로 다시 변환하십시오 .