2014-07-26 2 views
1

두 점 사이의 거리를 계산해야합니다 (위도는 & 경도). 전 C#C# haversine 구현은 googlemaps/movable-type.co.uk과 다른 답변을 제공합니다.

private double toRadian(double val) 
{ 
    return (Math.PI/180) *  
} 

public double Distance(Position pos1, Position pos2,DistanceType type) 
{ 
     double R = (type == DistanceType.Miles) ? 3960 : 6378137; // 6318137 in meters 

     double dLat = toRadian(pos2.Latitude - pos1.Latitude); 
     double dLon = toRadian(pos2.Longitude - pos2.Longitude); 

     double a = Math.Sin(dLat/2) * Math.Sin(dLat/2) + 
     Math.Cos(this.toRadian(pos1.Latitude)) * Math.Cos(this.toRadian(pos2.Latitude)) * 
     Math.Sin(dLon/2) * Math.Sin(dLon/2); 

     double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)); 
     double d = R * c; 

     return d; 
} 

의 표준 하버 사인 공식을 구현하지만 코드에서와 웹 사이트 http://www.movable-type.co.uk/scripts/latlong.html 다른 답변을 얻을. 입력 예를 들어 : pos1.Latitude = 12.916822Pos1.Longitude = 77.599816 및 pos2.Latitude = 12.917135 및 Pos2.Longitude = 77.585783 내 프로그램을 반환 34.843 (I 대답에 Math.Round((dist), 4)을 수행 할 때) 웹 사이트가 1.521 킬로미터를 제공으로 사람이 지적시겠습니까 뭐가 잘못 됐어? 추신 : 내 프로그램은 거리를 미터 단위로 계산합니다.

답변

4

빠르게 살펴보면이 문제는 쉽게 해결할 수 있습니다. 어떻게 변경에 대한 다음

double dLon = toRadian(pos2.Longitude - pos2.Longitude); 

을 ...로 :

double dLon = toRadian(pos2.Longitude - pos1.Longitude); 

을 주목 POS1/POS2 오타? :)

0

나는이 아마 더 나은 구현보다 테스트 GeoCoordinate

에서 제공하는 내장 DOTNET 하나를 사용하도록 구현을 변경하는 것이 좋습니다.