2014-05-21 4 views
-1

이 구현을 Haversine formulagiven on wikipedia으로 사용하려고 시도했지만이 수식은 예상되는 결과를 제공하지 않습니다. 위도 - 경도에 대한잘못된 결과를 생성하는 자바의 Haversine 수식

public class Haversine { 
    public static final double R = 6372.8; // In kilometers 
    public static double haversine(double lat1, double lon1, double lat2, double lon2) { 
     double dLat = Math.toRadians(lat2 - lat1); 
     double dLon = Math.toRadians(lon2 - lon1); 
     lat1 = Math.toRadians(lat1); 
     lat2 = Math.toRadians(lat2); 

     double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
     double c = 2 * Math.asin(Math.sqrt(a)); 
     return R * c; 
    } 
    public static void main(String[] args) { 
     System.out.println(haversine(36.12, -86.67, 33.94, -118.40)); 
    } 
} 

Input GPS latitude format : ddmm.mmmm 
Input GPS longitude format : dddmm.mmmm 

위 형식은 요구 사항 문서에 명시되어있다.

샘플 입력 좌표는 다음과 같다 :

lat1 = 3359.64868, lon1 = 8356.178 
lat2 = 3359.649, lon2 = 8356.178 

방법 하버 사인이 값을 전달하기 전에, I가도 형식으로이 값을 변환하고있다. 이 단계가 필요하지 않으면 저를 시정하십시오.

Decimal Degree = degree + (minute/60) 

그래서 새로운 좌표 방법은

haversine(33.994144666666664, 83.9363, 33.99415, 83.9363) 
처럼된다 하버 사인하는

lat1 = 33 + (59.64868/60) = 33.994144666666664 
lon1 = 83 + (56.178/60) = 83.9363 

lat2 = 33 + (59.649/60) = 33.99415 
lon2 = 83 + (56.178/60) = 83.9363 

호출 될 : 나는 아래의 진수도 형식도 분 형식에서 변환 공식을 사용하고

반환 값 5.932071604620887E-4

값을 확인하려면 this website에있는 변환기에 동일한 입력 (33.994144666666664, 83.9363, 33.99415, 83.9363)을 입력했지만 결과는 0.001km가됩니다.

십진수로 변환하지 않고 입력 값을 제공하려고 시도했지만 다음 두 메서드의 출력도 일치하지 않습니다.

아무도 내가 여기에서 어떤 실수를했는지 알려주실 수 있습니까?

+0

downvote – Shekhar

+2

에 대한 의견을 보내주십시오. 계산기로 프로그램을 보면서 결과가 다른 부분을 보았습니까? – awksp

+0

예 아니요. 나는 계산기로 학위/분 변환을 계산했지만이 코드가 정확할 것으로 기대했기 때문에 위키에 주어진 java 코드를 디버깅하지 않았습니다. – Shekhar

답변

3

5.932071604620887E-4의 결과는 5.932071604620887 * 10^(-4)5.932071604620887/10000 = 0.0005932071604620887입니다.

웹 사이트가 0.001 인 경우 내 제안은 소수점 세 자리까지입니다. 따라서 계산이 정확합니다.