Java与Javascript之间的计算距离

Java与Javascript之间的计算距离,javascript,java,android,google-maps,google-maps-api-3,Javascript,Java,Android,Google Maps,Google Maps Api 3,所以我在Javascript中使用google.maps.geometry.sphere.computeDistanceBetween,在Java中使用SphereCalutil中的computeDistanceBetween 对于相同的位置,我得到了不同的距离。我可以做些什么来校准它们,使它们保持一致,或者我可以使用两个库在前端(Javascript)和后端(Java)中获得相似的结果 以下是一些值和示例: 在Javascript中: var from = new google.maps.L

所以我在Javascript中使用google.maps.geometry.sphere.computeDistanceBetween,在Java中使用SphereCalutil中的computeDistanceBetween

对于相同的位置,我得到了不同的距离。我可以做些什么来校准它们,使它们保持一致,或者我可以使用两个库在前端(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);
在使用Double而不是Float的Java中:

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(浮点)值为:13219.474110913057 Java(双精度)值为:13219.565680296535

谢谢

Javascript在浮点数中包含约15位有效数字。Java的浮点只有24位精度。记住,距离公式包含减法运算。如果减去两个足够接近的非精确值,就会得到一个巨大的误差


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

检查文档中使用的地球半径值

尝试使用此代码将结果与其他两个结果进行比较

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

不同的浮点定点精度类型?嘿,你是阿米尔,不是罗伯特!请发布代码和结果进行比较。好的,我将添加示例。好的,我添加了一个示例。您现在可以看到输出之间存在差异。谢谢这可能与地球的基本模型不同。谷歌很可能使用扁球体,而Java模型似乎使用球形模型——但我不能证实这一点。你可以在上查看很多模型,所以我根据你的建议在Java方面做了双重尝试。该值与Float Java值略有不同,但仍有大约5米的差异(将示例和值放在原始帖子中)。这是一个令人惊讶的问题。这真是令人沮丧!:PSame代码,但使用6378137代替6371000的半径让我更接近。Java结果现在是13234.264297438078。因此,谷歌地图javascript代码似乎在幕后使用赤道半径。谢谢你的建议!