2017-12-22 19 views
3

그래서 자바에서 SphericalUtil에서 google.maps.geometry.spherical.computeDistanceBetween 및 computeDistanceBetween을 사용하고 있습니다. computeDistanceBetween Java 대 자바 스크립트

https://github.com/googlemaps/android-maps-utils/blob/master/library/src/com/google/maps/android/SphericalUtil.java

나는 같은 위치에 대해 서로 다른 거리를 얻고있다. 그 (것)들을 동일하게하기 위해 제가 할 수있는 일이 있습니까? 아니면 프론트 엔드 (자바 스크립트)와 백엔드 (자바)에서 비슷한 결과를 얻을 수있는 두 라이브러리가 있습니까?

자바 스크립트 : 자바에서

var from = new google.maps.LatLng(33.44138, -111.97500000000002); 
var to = new google.maps.LatLng(33.505904166596224, -112.09470748901367); 
var distanceBetween = google.maps.geometry.spherical.computeDistanceBetween(from, to); 
console.log(distanceBetween); 

: 대신 플로트의 더블 자바에서

LatLng from = new LatLng(Float.parseFloat("33.44138"), Float.parseFloat("-111.97500000000002")); 
LatLng to = new LatLng(Float.parseFloat("33.505904166596224"), Float.parseFloat("-112.09470748901367")); 
double distanceBetween = SphericalUtil.computeDistanceBetween(from, to); 
System.out.println(distanceBetween); 

: 아래

는 어떤 가치와 예입니다

LatLng from = new LatLng(Double.parseDouble("33.44138"), Double.parseDouble("-111.97500000000002")); 
LatLng to = new LatLng(Double.parseDouble("33.505904166596224"), Double.parseDouble("-112.09470748901367")); 
double distanceBetween = SphericalUtil.computeDistanceBetween(from, to); 
System.out.println(distanceBetween); 

자바 스크립트 ript 값은 다음과 같습니다 13234.355969270651 자바 (플로트) 값은 다음과 같습니다 13219.474110913057 자바 (더블) 값은 다음과 같습니다 13219.565680296535

감사합니다!

+0

부동 소수점 지정 정밀도 유형은 무엇입니까? –

+0

안녕하세요, 당신은 아미르, 로버트가 아닙니다! 비교할 코드와 결과를 게시하십시오. –

+0

좋아, 나는 예제를 추가 할 것이다. –

답변

0

자바 스크립트의 부동 소수점 숫자는 52 significant bits이며, 부동 소수점 숫자의 ~ 15 자릿수입니다. Java의 float에는 24 비트의 정밀도 만 있습니다. 거리 공식에는 빼기가 포함됩니다. 정밀하지 않은 두 개의 값을 빼면 충분히 가까워서 큰 오류가 발생할 수 있습니다.

FloatDouble : Double.parseDouble()으로 변경하십시오.

+0

나는 당신의 제안에 따라 자바 쪽에서 Double을 시도했다. 이 값은 Float Java 값과 약간 다르지만 여전히 약 5 미터 다릅니다 (원래 게시물의 예제와 값을 입력하십시오). –

+1

놀라운 질문입니다. –

+0

정말 실망 스럽네요! : P –

1

문서에서 사용 된 접지 반경 값을 확인하십시오.

이 코드를 사용하여 결과를 다른 2 개와 비교해보십시오.

Tier3Toolbox.EARTH_RADIUS = 6378137; /* Equitorial Radius instead of 6371000 */ 
Tier3Toolbox.toRad = 
    function (num) { 
     return num * Math.PI/180; 
    }; 
Tier3Toolbox.calculateDistance = 
    function(lat1, lon1, lat2, lon2){ 
     var dLat = this.toRad(lat2 - lat1); 
     var dLon = this.toRad(lon2 - lon1); 
     var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(this.toRad(lat1)) * 
       Math.cos(this.toRad(lat2)) * Math.sin(dLon/2) * Math.sin(dLon/2); 
     var distance = this.EARTH_RADIUS * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
     return distance; 
    } 
+0

같은 코드이지만 6371000 대신 반경에 6378137을 사용하면 훨씬 가까워졌습니다.Java 결과는 지금 13234.264297438078입니다. 그래서 자바 스크립트 코드는 적도 반경을 사용하는 Google지도처럼 보입니다. 제안 해 주셔서 감사합니다! –