평균 위도 및 경도 좌표 계산


19

여러 위도와 경도 지점 사이의 평균을 어떻게 계산할 수 있습니까?

위도 및 경도에 대한 산술 평균을 계산해야합니까?


3
평균화의 적절성은 사용 사례에 달려 있다고 생각합니다. 웹 맵을 위해 도시 식당 위치를 클러스터링하는 경우 평균화가 대부분 작동합니다. 그러나 일부 장소에서는 버그가 발생합니다. 프로토 타입이나 저예산 앱의 경우에는 문제가 없습니다. 그러나 더 심각한 일을하거나 넓은 영역을 다루는 경우 투사 뉘앙스를 고려해야합니다.
Glenn

1
이 포인트는 어떻게 수집 되었습니까? 좌표 평균을 구하는 방법을 묻는 대신 평균화가 측정 오류를 보상하는 적절한 방법인지 묻습니다. 이 전자 책 에는 많은 오류 정의가 있습니다.
Kirk Kuykendall

'평균점'이 잘 정의되지 않은 경우가 있습니다. 예를 들어 적도의 어느 곳에서나 N 극과 S 극의 "평균"이 될 수 있습니다.
Dan S.

답변:


15

간단히 말해서 경도와 위도 좌표를 평균화하지 않으려 고합니다. 낮은 위도에서는 꽤 잘 작동하지만 높은 위도에서는 결과가 나 빠지고 극 근처에서 완전히 분해되기 시작합니다.

이 유형의 물건에 사용한 방법은 경도 / 위도 좌표를 3d 직교 좌표 (x, y, z)로 변환하는 것입니다. 이들을 평균화하여 (직교 벡터를 제공) 다시 변환하십시오. 벡터를 정규화 할 필요는 없으므로 실제 평균 프로세스는 단순한 합계 일 수 있습니다.


편집, 여기 내 코드가 있습니다 :

다음은 직교 좌표를 위도 / 경도 (도)로 변환 RAD2DEG합니다. 라디안 상수를 제거합니다 .

Latitude = MPUtility.RAD2DEG * Math.Atan2(z, Math.Sqrt(x * x + y * y));
Longitude = MPUtility.RAD2DEG * Math.Atan2(-y, x);

그리고 위도 / 경도 (라디안으로 지정)에서 직교 좌표를 계산합니다.

private void CalcCartesianCoord()
{
    _x = Math.Sin(LatitudeRadians) * Math.Cos(LongitudeRadians);
    _y = Math.Sin(LatitudeRadians) * Math.Sin(LongitudeRadians);
    _z = Math.Cos(LatitudeRadians); 
}

둘 다 실제 코드에서 잘라내어 붙여 넣기 때문에 각도와 라디안이 혼합됩니다. 여기에는 일부 변환을 수행 LatitudeRadians하는 속성이 있습니다 (예 : 라디안 값을 반환하는 속성).

예를 들어 중복 사인 계산과 같은 최적화가 가능합니다. 또한 많이 호출하면 삼각 계산을 캐시 할 수 있습니다.


1
좋은 지적입니다. 나는 그것을 언급하는 것을 잊었다 믿을 수 없다.. 기둥과 데이트 라인 근처의 평균화는 이전에 나를 물었다.
Glenn

3
(+1) 문제는 극점과 + -180도 자오선에 국한되지 않습니다. 평균을 구할 점의 위도가 상당히 다를 때 위도 / 경도 좌표의 직선 평균은 평판 캐리 투영법을 사용하여 계산됩니다. 위도에 따라 다양한 메트릭 왜곡이 발생합니다. 수치적인 문제는 없지만 평균은 단순히 잘못된 위치에 있습니다. 이러한 이유로 @Glenn의 답변에서 제안 된 위도 / 경도 계산은 상대적으로 작은 비극성 영역을 제외하고는 거의 용납되지 않습니다.
whuber

@ winwaed 감사합니다.이 작업을 수행하기 위해 일부 (Java) 코드 스 니펫 또는 좋은 자습서를 제안 할 수 있습니까?
aneuryzm

1
수학은 'Cartesian Coordinates'아래의 en.wikipedia.org/wiki/Spherical_coordinates 에 있습니다. (내 구현은 C #이며 부분적으로 최적화되어 있으며 치과 의사에게 이것을 입력하고 있습니다 !!)
winwaed

1
정확한 공학적 사용 사례는 매우 정확하다고 생각합니다. 그러나 고도의 정밀성이 요구되지 않는 한, 평균 WGS84 위도, 도시 및 지역의 좌표는 꽤 잘 작동하며 평균화가 사용되는 대부분의 용도에 대해 상당히 정확한 결과를 제공합니다.
Glenn

3

클러스터링 옵션 :이 유형의 작업을 다루는 개념적 단어는 "클러스터링"이라고 생각합니다. 평균화는 구현하기 가장 단순하며 대부분의 목적에 적합합니다. 내가 다른 것을 사용할 유일한 시간은 특이 치 [편집]-> 또는 극점 또는 국제 날짜 표시 줄이 걱정되는 경우입니다. [Edit]-> 또한 평균화는 클러스터의 중심에 가깝게 보이는 것을 제공하지만 위도는 항상 같은 거리에 있지 않다는 사실로 인한 투영 부정확성으로 인해 약간 벗어납니다. km / miles에서 떨어져 있습니다. 평균 영역이 클수록 왜곡이 커집니다.

다음은 몇 가지 클러스터링 옵션을 비교 한 것입니다

평균 (쉽고 빠르며 정확하지 않음) : 위도 값을 합산하고 개수로 나누고 lng 값에 대해서도 동일하게 수행하십시오. Int32를 사용하는 경우 오버플로를 확인하십시오. 일부 시스템 (특히 c #)은 자동으로 낮은 숫자로 오버플로됩니다. 합계 누산기에 부동 소수점 정밀도를 사용하면 이러한 오류를 피할 수 있습니다. 이 방법의 한 가지 문제점은 특이 치가 위치를 왜곡 할 수 있다는 것입니다. [편집]-> 또 다른 점은 극점과 국제 날짜 표시 줄 근처의 수학은 평균이 좋지 않으며 위치가 왜곡되는 것입니다.

가장 가까운 이웃 (약간 더 느리게, 더 느리게, 편향되지 않은 편향) 평균을 계산하는 대신 모든 인접 지역과의 평균 거리가 가장 작은 실제 위도 위치로 이동할 수 있습니다. 이것은 "중앙값"을받는 것과 같습니다. 단점은 모든 점을 다른 모든 점과 비교하고 그 사이의 거리를 계산하기 때문에 계산 비용이 많이 든다는 것입니다. 예를 들어 10,000 포인트를 클러스터링하려면 1 억 거리 계산이 필요합니다. 느린 속도는 아니지만 확장 성이 떨어집니다.

그리드 셀 (약간의 추가 설정이 필요하고, 훨씬 빠르며, 이상치 바이어스가 아닙니다) 이것은 가장 가까운 이웃과 비슷하지만 훨씬 빠릅니다. .01 deg lat lng (대략 채워진 위도에서 약 1km)와 같은 임의의 정밀도 수준을 선택하고 포인트를 .01 x .01도 버킷으로 그룹화 할 수 있습니다. 그런 다음 점이 가장 많은 버킷을 선택하고 해당 점의 평균을 취하거나 해당 점에 대해 가장 가까운 이웃 분석을 실행할 수 있습니다. 저는이 방법을 정말 큰 데이터 세트 (수십억 개의 레코드)와 함께 많이 사용하며 정밀도와 속도의 균형이 잘 맞습니다.

볼록 껍질 중심 (단단하고 느리고 깔끔한 결과) : 점 주위에 밴드를 그려 모든 점을 덮는 모양을 정의한 다음 ( wikipedia 참조 )이 모양의 중심점을 계산할 수도 있습니다. 일반적인 중심 함수는 중심 가중치가 아니므로 가장자리에서 가장 먼 것을 찾을 때까지 모양 내부의 샘플 점을 사용하여 일종의 역 근접 이웃 분석을 수행해야합니다. 이 방법은 실제 중심 발견 알고리즘보다는 볼록 껍질 자체로 인해 더욱 흥미 롭습니다.하지만, 정확하지는 않습니다. 그러나 선체 모양에는 다른 유용한 응용 프로그램이있을 수 있습니다.


@winwaed는 극점 근처의 좌표 평균을 계산하는 데 큰 도움이되며 국제 날짜 줄을 추가 할 것입니다. 예를 들어 한쪽에 다른 점이 있고 다른 점에 다른 점이 있으면 평균이 나빠집니다. 이것은 거의 일어나지 않지만, 그렇게 할 때 디버깅하는 것은 진짜 고통입니다.
Glenn

@whuber는 평균을 낼 때 중심 표류에 대해 좋은 지적을합니다. 평균화를 사용하면 클러스터의 중심에 가깝게 보이는 것이 생길 수 있지만, 위도 lng가 항상 킬로미터 / 마일로 같은 거리에 있지 않다는 사실로 인한 투영 부정확성 때문에 약간 벗어납니다. 평균 영역이 클수록 왜곡이 커집니다.
Glenn

0

달성하려는 것이 확실하지 않지만 위도가 원래 점 세트의 평균 위도이고 경도가 원래 점 세트의 평균 경도 인 점은 원래 점 세트의 평균점이됩니다. [업데이트] : 위의 avg는 산술 평균입니다.


귀하의 답변에서 avg = Arithmetic mean?
aneuryzm

1
네 맞습니다. 그것이 명확성이 결여되어서 유감스럽게 생각한 것입니다. 나는 대답을 업데이트했다. 그러나 나는 여기 테이블에 굉장히 유용한 것을 가져다 줄지 확신하지 못한다 ...
GuillaumeC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.