2012-07-09 4 views
-3

Haversine Formula를 C#에서 찾았습니다.주변 지역을 찾는 방법 현재 사용자 위치에서 위도와 경도를 사용하여

public double HaversineDistance(LatLng pos1, LatLng pos2, DistanceUnit unit) 
    { 
     double R = (unit == DistanceUnit.Miles) ? 3960 : 6371; 
     var lat = (pos2.Latitude - pos1.Latitude).ToRadians(); 
     var lng = (pos2.Longitude - pos1.Longitude).ToRadians(); 
     var h1 = Math.Sin(lat/2) * Math.Sin(lat/2) + 
         Math.Cos(pos1.Latitude.ToRadians()) * Math.Cos(pos2.Latitude.ToRadians()) * 
         Math.Sin(lng/2) * Math.Sin(lng/2); 
     var h2 = 2 * Math.Asin(Math.Min(1, Math.Sqrt(h1))); 
     return R * h2; 
    } 
+2

위 공식에 어떤 문제가 있습니까? 왜 "더 나은"솔루션을 찾고 있습니까? 그것을 대체 할 이유가 있다면 그 이유를 표현하십시오. –

+3

"더 나은"이란 무엇을 의미합니까? 빨리? 더 정확한? 양자 모두? –

답변

1

나는 그것이 당신이 무엇을하고 싶은지의 문제라고 생각한다. 내 생각 엔 ZIP (우편) 코드를 기반으로 거리를 계산하려고하며 pos2가 pos1의 x 거리 내에 있는지 알고 싶습니다.

먼저 이해해야 할 점은 (작업 할 멋진 Geo Spatial 데이터가없는 한) 모든 계산에서 일반적으로 지정된 면적의 고도 또는 기타 지형적 특성을 고려하지 않으므로 계산이되지 않습니다. 정확한. 더 나아가 이러한 계산은 "까마귀가 날아 다닌다"는 것을 의미합니다. 즉, 점 x에서 점 y까지가 직선이므로 점 y가 중심점 x에서 25 마일 이내에있을 수 있지만 중심점 x에서 점 y까지는 실제로 30 마일이 걸릴 수 있습니다.

는 어떤 당신이 피타고라스의 정리를 사용할 수있는 경우로 표현되는이 작은 거리 (< 12 ~ 마일) 계산되지 않는 한 하버 사인 공식은 가장 좋은 건 말했다되는 :

D = SQRT ((X2 - X1)^2 + (Y2 - Y1)^2)

여기서 X와 Y는 사용자의 좌표입니다. 이것은 훨씬 빠르지 만 거리가 멀어 질수록 정확도가 훨씬 떨어집니다.

Haversine 수식은 특히 반복 호출하는 경우 느리지 만이 수식을 기반으로 거리를 계산하는 더 빠른 방법을 알지 못합니다.

관련 문제