이 구현을 Haversine formula
given 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.001
km가됩니다.
십진수로 변환하지 않고 입력 값을 제공하려고 시도했지만 다음 두 메서드의 출력도 일치하지 않습니다.
아무도 내가 여기에서 어떤 실수를했는지 알려주실 수 있습니까?
downvote – Shekhar
에 대한 의견을 보내주십시오. 계산기로 프로그램을 보면서 결과가 다른 부분을 보았습니까? – awksp
예 아니요. 나는 계산기로 학위/분 변환을 계산했지만이 코드가 정확할 것으로 기대했기 때문에 위키에 주어진 java 코드를 디버깅하지 않았습니다. – Shekhar