여러 위도와 경도 지점 사이의 평균을 어떻게 계산할 수 있습니까?
위도 및 경도에 대한 산술 평균을 계산해야합니까?
여러 위도와 경도 지점 사이의 평균을 어떻게 계산할 수 있습니까?
위도 및 경도에 대한 산술 평균을 계산해야합니까?
답변:
간단히 말해서 경도와 위도 좌표를 평균화하지 않으려 고합니다. 낮은 위도에서는 꽤 잘 작동하지만 높은 위도에서는 결과가 나 빠지고 극 근처에서 완전히 분해되기 시작합니다.
이 유형의 물건에 사용한 방법은 경도 / 위도 좌표를 3d 직교 좌표 (x, y, z)로 변환하는 것입니다. 이들을 평균화하여 (직교 벡터를 제공) 다시 변환하십시오. 벡터를 정규화 할 필요는 없으므로 실제 평균 프로세스는 단순한 합계 일 수 있습니다.
편집, 여기 내 C # 코드가 있습니다 :
다음은 직교 좌표를 위도 / 경도 (도)로 변환 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
하는 속성이 있습니다 (예 : 라디안 값을 반환하는 속성).
예를 들어 중복 사인 계산과 같은 최적화가 가능합니다. 또한 많이 호출하면 삼각 계산을 캐시 할 수 있습니다.
클러스터링 옵션 :이 유형의 작업을 다루는 개념적 단어는 "클러스터링"이라고 생각합니다. 평균화는 구현하기 가장 단순하며 대부분의 목적에 적합합니다. 내가 다른 것을 사용할 유일한 시간은 특이 치 [편집]-> 또는 극점 또는 국제 날짜 표시 줄이 걱정되는 경우입니다. [Edit]-> 또한 평균화는 클러스터의 중심에 가깝게 보이는 것을 제공하지만 위도는 항상 같은 거리에 있지 않다는 사실로 인한 투영 부정확성으로 인해 약간 벗어납니다. km / miles에서 떨어져 있습니다. 평균 영역이 클수록 왜곡이 커집니다.
다음은 몇 가지 클러스터링 옵션을 비교 한 것입니다
평균 (쉽고 빠르며 정확하지 않음) : 위도 값을 합산하고 개수로 나누고 lng 값에 대해서도 동일하게 수행하십시오. Int32를 사용하는 경우 오버플로를 확인하십시오. 일부 시스템 (특히 c #)은 자동으로 낮은 숫자로 오버플로됩니다. 합계 누산기에 부동 소수점 정밀도를 사용하면 이러한 오류를 피할 수 있습니다. 이 방법의 한 가지 문제점은 특이 치가 위치를 왜곡 할 수 있다는 것입니다. [편집]-> 또 다른 점은 극점과 국제 날짜 표시 줄 근처의 수학은 평균이 좋지 않으며 위치가 왜곡되는 것입니다.
가장 가까운 이웃 (약간 더 느리게, 더 느리게, 편향되지 않은 편향) 평균을 계산하는 대신 모든 인접 지역과의 평균 거리가 가장 작은 실제 위도 위치로 이동할 수 있습니다. 이것은 "중앙값"을받는 것과 같습니다. 단점은 모든 점을 다른 모든 점과 비교하고 그 사이의 거리를 계산하기 때문에 계산 비용이 많이 든다는 것입니다. 예를 들어 10,000 포인트를 클러스터링하려면 1 억 거리 계산이 필요합니다. 느린 속도는 아니지만 확장 성이 떨어집니다.
그리드 셀 (약간의 추가 설정이 필요하고, 훨씬 빠르며, 이상치 바이어스가 아닙니다) 이것은 가장 가까운 이웃과 비슷하지만 훨씬 빠릅니다. .01 deg lat lng (대략 채워진 위도에서 약 1km)와 같은 임의의 정밀도 수준을 선택하고 포인트를 .01 x .01도 버킷으로 그룹화 할 수 있습니다. 그런 다음 점이 가장 많은 버킷을 선택하고 해당 점의 평균을 취하거나 해당 점에 대해 가장 가까운 이웃 분석을 실행할 수 있습니다. 저는이 방법을 정말 큰 데이터 세트 (수십억 개의 레코드)와 함께 많이 사용하며 정밀도와 속도의 균형이 잘 맞습니다.
볼록 껍질 중심 (단단하고 느리고 깔끔한 결과) : 점 주위에 밴드를 그려 모든 점을 덮는 모양을 정의한 다음 ( wikipedia 참조 )이 모양의 중심점을 계산할 수도 있습니다. 일반적인 중심 함수는 중심 가중치가 아니므로 가장자리에서 가장 먼 것을 찾을 때까지 모양 내부의 샘플 점을 사용하여 일종의 역 근접 이웃 분석을 수행해야합니다. 이 방법은 실제 중심 발견 알고리즘보다는 볼록 껍질 자체로 인해 더욱 흥미 롭습니다.하지만, 정확하지는 않습니다. 그러나 선체 모양에는 다른 유용한 응용 프로그램이있을 수 있습니다.
달성하려는 것이 확실하지 않지만 위도가 원래 점 세트의 평균 위도이고 경도가 원래 점 세트의 평균 경도 인 점은 원래 점 세트의 평균점이됩니다. [업데이트] : 위의 avg는 산술 평균입니다.