2017-12-22 38 views
3

私はJavascriptでgoogle.maps.geometry.spherical.computeDistanceBetweenを、JavaでSphericalUtilからcomputeDistanceBetweenを使用しています。computeDistanceBetween Java対Java JavaScript

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

私は同じポジションの異なる距離を取得しています。それらを同じものにするために私ができることは何ですか?また、フロントエンド(Javascript)とバックエンド(Java)で同様の結果を得ることができる2つのライブラリがありますか?

JavaScriptで: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); 

:代わりにフロートのダブルと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); 

:以下

は、いくつかの値と例です

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

Javasc RIPT値は次のとおりです。13234.355969270651 のJava(フロート)値は次のとおりです。13219.474110913057 のJava(ダブル)値は次のとおりです。13219.565680296535

ありがとう!

+0

異なる浮動小数点指向のタイプですか? –

+0

ねえ、あなたはアミール、ロバートじゃない!比較するコードと結果を投稿してください。 –

+0

さて、例を追加します。 –

答えて

0

Javascriptの浮動小数点数は52 significant bitsです。浮動小数点数は〜15桁です。 Javaの浮動小数点数はわずか24ビットです。距離式には減算が含まれています。 2つの非精度値を減算すると、それは十分に近い値になりますが、大きな誤差が生じます。

FloatDoubleDouble.parseDouble()に変更してください。

+0

私はあなたの提案でJava側で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 Mapsのjavascriptコードは、背後で赤道の半径を使用しているように見えます。提案していただきありがとうございます! –