이 답변은 여러 섹션으로 나뉩니다.
"통조 된"루틴으로 원하는 점을 찾는 방법을 보여주는 문제 분석 및 감소 .
그림 : 작업 코드를 제공 하는 작업 프로토 타입
실시 예는 , 용액의 예를 도시.
함정 , 잠재적 문제 및 이에 대처하는 방법을 논의합니다.
ArcGIS 구현 , 사용자 정의 ArcGIS 도구 생성 및 필요한 루틴을 얻는 위치에 대한 의견.
문제 분석 및 감소
의는 (완벽 라운드) 구형 모델에 있음을 관찰하여 시작하자 이됩니다 항상 해결책이 될 사실 .. 이대로, 정확히 두 개의 솔루션을 제공합니다. 기준점 A, B 및 C가 주어지면 각 쌍은 "수직 이등분선"을 결정하는데, 이는 주어진 두 점과 등거리에있는 점들의 집합입니다. 이 이등분선은 측지선 (큰 원)입니다. 구형 지오메트리는 타원형입니다 . 두 개의 측지선이 교차합니다 (두 개의 고유 지점에서). 따라서 AB의 이등분선과 BC의 이등분선의 교점은 정의상 A, B 및 C와 동일하므로 문제를 해결할 수 있습니다. (아래 첫 번째 그림 참조)
타원체에서는 상황이 더 복잡해 보이지만 구의 작은 교란이기 때문에 비슷한 동작을 기대할 수 있습니다. 타원체에서 정확한 거리를 계산하기 위해 (내부적으로 GIS 내에서) 사용 된 복잡한 공식은 개념적 합병증이 아니지만 문제는 기본적으로 동일합니다. 문제가 실제로 얼마나 간단한 지 알아 보려면 다소 추상적으로 설명하겠습니다. 이 설명에서 "d (U, V)"는 점 U와 V 사이의 완전하고 정확한 거리를 나타냅니다.
타원체에 3 개의 점 A, B, C (라 트론 쌍으로)가 주어지면 (1) d (X, A) = d (X, B) = d (X, C) 및 ( 2)이 공통 거리는 가능한 작습니다.
이 세 거리는 모두 알 수없는 X 에 의존합니다 . 따라서 차이 거리에서 유 (X) = D (X, A) - (D) (X, B) 및 V (X) = D (X, B) - (D) (X, C) X.의 실함수있다 다시, 다소 추상적으로, 우리는 이러한 차이를 순서 쌍으로 모을 수 있습니다. 또한 X의 좌표로 (lat, lon)을 사용하여 X = (phi, lambda)라고도합니다. 이 설정에서 기능
F (phi, 람다) = (u (X), v (X))
2 차원 공간에서 값을 취하는 2 차원 공간의 일부에서 함수이며 우리의 문제는
F (phi, lambda) = (0,0)에 대해 가능한 모든 (phi, lambda)를 찾으십시오.
여기 추상화가 필요한 부분입니다. 이 (순수 수치 다차원 루트 찾기) 문제를 해결하기위한 훌륭한 소프트웨어가 많이 있습니다. 작동 방식은 F 를 계산하는 루틴을 작성한 다음 입력 제한에 대한 정보와 함께 소프트웨어에 전달하는 것입니다 ( phi 는 -90에서 90도 사이에 있어야 하고 람다 는 -180에서 180 사이에 있어야 함) 도). 그것은 1 초 동안 크랭크를 잃어 버리고 (일반적으로) 하나의 값 ( phi , lambda )을 찾을 수 있으면 ( 파이 , 람다 ) 만 반환합니다.
이에 대한 기술이 있기 때문에 다루어야 할 세부 사항 이 있습니다. F "동작 방식 " 에 따라 다양한 솔루션 방법 중에서 선택할 수 있습니다 . 검색을위한 합리적인 시작점을 제공함으로써 소프트웨어를 "조향"하는 데 도움이됩니다 (이것은 다른 솔루션이 아닌 가장 가까운 솔루션을 얻을 수있는 한 가지 방법입니다 ). 일반적으로 솔루션의 정확도를 지정해야합니다 (검색을 중지 할시기를 알 수 있음). (GIS 분석가들이 GIS 문제에서 많이 발생하는 이러한 세부 사항에 대해 알아야 할 사항에 대한 자세한 내용을 보려면 지리 공간 기술 컴퓨터 과학 과정에 포함시킬 권장 주제를 방문 하고 마지막 부분의 "기타"섹션을 참조하십시오. )
일러스트 : 실용 프로토 타입
분석에 따르면 솔루션의 초기 추정치와 F 자체 의 계산이라는 두 가지를 프로그래밍해야 합니다.
초기 추정은 3 개의 기준점의 "구면 평균"에 의해 이루어질 수있다. 이것은 지오 센 트릭 직교 좌표 (x, y, z) 좌표로 표시하고, 해당 좌표를 평균화 한 후 평균을 구로 다시 투영하고 위도와 경도로 다시 표현하여 얻습니다. 구의 크기는 중요하지 않으며 계산은 간단합니다. 이것은 시작점이므로 타원체 계산이 필요하지 않습니다.
이 작업 프로토 타입을 위해 Mathematica 8을 사용했습니다.
sphericalMean[points_] := Module[{sToC, cToS, cMean},
sToC[{f_, l_}] := {Cos[f] Cos[l], Cos[f] Sin[l], Sin[f]};
cToS[{x_, y_, z_}] := {ArcTan[x, y], ArcTan[Norm[{x, y}], z]};
cMean = Mean[sToC /@ (points Degree)];
If[Norm[Most@cMean] < 10^(-8), Mean[points], cToS[cMean]] / Degree
]
(최종 If
조건은 평균이 경도를 명확하게 나타내지 못하는지 여부를 테스트합니다. 그렇다면 입력의 위도 및 경도에 대한 직선 산술 평균으로 돌아갑니다. 훌륭한 선택은 아니지만 적어도 유효한 것입니다. 구현 지침에이 코드를 사용하는 사람들의 경우 Mathematica의 인수는 ArcTan
대부분의 다른 구현과 비교하여 반대입니다. 첫 번째 인수는 x 좌표이고 두 번째 인수는 y 좌표이며 벡터에 의해 만들어진 각도를 반환합니다 ( x, y).)
두 번째 부분 까지는 ArcGIS 및 거의 모든 다른 GIS와 같은 Mathematica 에는 타원체의 정확한 거리를 계산하는 코드가 포함되어 있기 때문에 작성할 내용이 거의 없습니다. 우리는 단지 루트 찾기 루틴을 호출합니다.
tri[a_, b_, c_] := Block[{d = sphericalMean[{a, b, c}], sol, f, q},
sol = FindRoot[{GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, a] ==
GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, b] ==
GeoDistance[{Mod[f, 180, -90], Mod[q, 360, -180]}, c]},
{{f, d[[1]]}, {q, d[[2]]}},
MaxIterations -> 1000, AccuracyGoal -> Infinity, PrecisionGoal -> 8];
{Mod[f, 180, -90], Mod[q, 360, -180]} /. sol
];
이 구현에서 가장 주목할만한 점은 위도 f
및 경도 q
를 각각 180도 및 360 도로 각각 계산 하여 위도 ( )와 경도 ( ) 를 제한 할 필요성을 피하는 방법 입니다. 이렇게하면 문제를 제한하지 않아도됩니다 (이는 종종 합병증을 유발 함). 제어 MaxIterations
코드 등은이 코드가 가능한 최대 정확도를 제공하도록 조정되었습니다.
실제로 작동하는지 확인하려면 관련 질문에 제공된 세 가지 기준점에 적용 해 보겠습니다 .
sol = tri @@ (bases = {{-6.28530175, 106.9004975375}, {-6.28955287, 106.89573839}, {-6.28388865789474, 106.908087643421}})
{-6.29692, 106.907}
이 솔루션과 세 지점 사이의 계산 된 거리는
{1450.23206979, 1450.23206979, 1450.23206978}
(이것은 미터입니다). 그들은 11 번째 유효 자릿수에 동의합니다 (실제로는 거리가 밀리미터 정도보다 정확하지 않기 때문에 너무 정확합니다). 다음은이 세 가지 점 (검은 색), 세 개의 상호 이등분선 및 솔루션 (빨간색)의 사진입니다.
예
이 구현을 테스트하고 문제의 작동 방식을 더 잘 이해하기 위해 3 개의 넓게 떨어진 기준점에 대한 거리의 제곱 평균 제곱 불일치의 등고선 그림이 있습니다. RMS 불일치는 d (X, A) -d (X, B), d (X, B) -d (X, C) 및 d (X, C) -d (X , A), 제곱의 평균을 구하고 제곱근을 취합니다 .X가 문제를 해결하면 X와 같고 X가 솔루션에서 멀어짐에 따라 증가하므로 어떤 위치에서 솔루션이 "가까이"가되는지를 측정합니다. )
기준점 (60, -120), (10, -40) 및 (45,10)은이 Plate Carree 투영에서 빨간색으로 표시됩니다. 계산에 0.03 초가 걸린 솔루션 (49.2644488, -49.9052992)은 노란색입니다. RMS 불일치는 모든 관련 거리가 수천 킬로미터 임에도 불구하고 3 나노 미터 미만 입니다. 어두운 영역은 작은 RMS 값을 나타내고 밝은 영역은 높은 값을 나타냅니다.
이지도는 다른 솔루션이 (-49.2018206, 130.0297177) 근처에 있음을 분명히 보여줍니다 (첫 번째 솔루션의 반대쪽에 초기 검색 값을 설정하여 2 나노 미터의 RMS로 계산 됨).
함정
수치 적 불안정성
기준점이 거의 동일 선상에 있고 서로 가까워지면 모든 솔루션이 거의 반 정도 떨어져 있고 정확하게 고정하기가 매우 어려울 것입니다. 그 이유는 전 세계 어디에서나 기준점을 향하거나 멀어지면서 위치를 조금만 변경해도 거리의 차이가 매우 작게 변화하기 때문입니다. 일반적인 측지 거리 계산에는 결과의 정확도를 높이기위한 정확도와 정밀도가 충분하지 않습니다.
예를 들어 (45.001, 0), (45, 0) 및 (44.999,0)의 기준점부터 시작하여 각 쌍 사이에서 111m 만 Prime Meridian을 따라 분리되어 tri
솔루션 (11.8213, 77.745)을 얻습니다. ). 그것으로부터 기준점까지의 거리는 8,127,964.998 77; 8,127,964.998 41; 및 8,127,964.998 65 미터. 그들은 가장 가까운 밀리미터에 동의합니다! 이 결과가 얼마나 정확한지 잘 모르겠지만 다른 구현 이이 위치에서 멀리 떨어진 위치를 반환하여 세 거리와 거의 동일한 동등성을 나타내는 경우 놀라지 않을 것입니다.
계산 시간
이러한 계산은 복잡한 거리 계산을 사용한 상당한 검색을 포함하기 때문에 빠르지 않으며 일반적으로 눈에 띄는 초가 필요합니다. 실시간 응용 프로그램은이를 알고 있어야합니다.
ArcGIS 구현
Python은 ArcGIS에서 선호하는 스크립팅 환경입니다 (버전 9부터 시작). scipy.optimize 패키지는 다변량 rootfinder가 root
어떻게해야 FindRoot
에서와 매스 매 티카 코드를. 물론 ArcGIS 자체는 정확한 타원체 거리 계산을 제공합니다. 나머지는 모든 구현 세부 사항입니다. 기준점 좌표를 얻는 방법 (사용자가 입력 한 레이어, 텍스트 파일, 마우스 등) 및 출력을 좌표로 표시하는 방법 결정 화면에 그래픽? 그래픽 레이어? 레이어의 새 점 개체로 표시?)하고 해당 인터페이스를 작성하고 여기에 표시된 Mathematica 코드를 포트 (직선)로 설정하면 모든 설정이 완료됩니다.