computeDistanceBetween Java vs Javascript

时间:2017-12-22 19:43:39

标签: javascript java android google-maps google-maps-api-3

所以我在Javascript中使用google.maps.geometry.spherical.computeDistanceBetween,在Java中使用SphericalUtil中的computeDistanceBetween。

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

我在相同的位置获得不同的距离。我可以做些什么来校准它们是相同的还是有两个我可以使用的库可以在前端(Javascript)和后端(Java)中得到类似的结果?

以下是一些值和示例:

在Javascript中:

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);

在Java中:

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);

在Java中使用Double而不是Float:

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);

Javascript值为:13234.355969270651 Java(float)值为:13219.474110913057 Java(double)值为:13219.565680296535

谢谢!

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:0)

Javascript在浮点数中有52 significant bits,它是浮点数的~15位有效数字。 Java的float只有24位的精度。请记住,距离公式包含减法。如果你减去两个非精确值,那么你可以得到一个巨大的错误。

尝试将Float更改为DoubleDouble.parseDouble()