평균 위도 및 경도 좌표 계산


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.