2016-08-29 14 views
-1

私は緯度と経度の2つのペアを取り、距離をm単位で返す関数を持っています。 JavaScriptの同じ関数のデータの複数のフォーマットを処理する方法

function distance(lat1, lon1, lat2, lon2){ 
     var p = Math.PI/180; 
     var c = Math.cos; 
     var a = 0.5 - c((lat2 - lat1) * p)/2 + 
      c(lat1 * p) * c(lat2 * p) * 
      (1 - c((lon2 - lon1) * p))/2; 

     return 12742 * Math.asin(Math.sqrt(a)) * 1000; // 2 * R; R = 6371 km 
    }//Distance 

私は緯度と経度のための複数のソースを持っていると私はそれらを処理する方法を知っていただきたいと思います(私はこの関数を作成するが、SOに別の質問からそれを得なかった注意してください)。 Iは

フォーマットでデータを返す

三つの異なるフォーマットからIは、入力を処理する関数を使用したい
{latitude: 0000, longitude:0000} 

navigator.geolocation.x 

||

このよう
var distanceFromTarget = distance(
     target.latitude || target.lat || target.lat(), 
     target.longitude || target.lng || target.lng(), 
     current.latitude || current.lat || current.lat(), 
     current.longitude || current.lat || current.lng() 
    ); 

を使用してプラグインを試し返信

{lat: 000, lng: 000} 

と、このような緯度とLNG何かのためにゲッターを含む場所の複雑なオブジェクトを返すGoogleマップAPI:私は3つすべてを扱うことができる方法

location = {lat(){return latitude}, lng(){return longitude}} 

?私は上記のことが働いていたと思ったが、今はそうではないことは明らかである。場所が形式target.lat()の場合、距離はNaNを返します。また、前のものが定義されていなかった場合、次のオブジェクトを単に使用すると思っていたので、誰かがどのようにして動作するのか説明できればいいです。

+0

'||'は短絡演算子です。つまり、最初のケースが真であれば残りはこの場合評価されません。 – Aaron

+0

私はあなたのコードをテストし、うまくいきました。第4引数では小さなエラーがあります: 'current.lng'ではなく' current.lat'です –

+0

これを発見してくれたChrisに感謝します。それはソリューションではないようだが、Googleマップの結果からデータを使用したとき、私は距離としてNaNを取得していました。私は演算子の順序を入れ替えます。つまり、 'target.lat'の前に' target.lat() 'を置くことで問題は解決したようです。私はそれが定義されているtarget.latを読み込んでいたと思うし、関数で返される値ではなく、関数の操作を実行します。私はまだプラグインのケースでそれをテストしていない。 – xerotolerant

答えて

0

問題は、元の現在のオブジェクトまたはターゲットオブジェクトが定義されていなかった場合のように、コードがエラーをどのように処理したかにあります。位置オブジェクトにlatlnglat()またはlng()のゲッターが含まれている場合も同様です。それでtarget.latが定義されるので、私は使用しました

function atPosition(current, target){ 
    if (typeof current === "undefined" || typeof target == "undefined") { 
     console.log("current or target position undefined.") 
     return 
    } 
    //if target is function and defined set property to return value of function. 
    if (typeof target === "object" && typeof target.lat === "function") { 
     target.lat = target.lat(); 
     target.lng = target.lng(); 
    } 

    //console.log(target); 
    //if currentPosition is within 25m of target return true 
    var distanceFromTarget = distance(
     target.latitude || target.lat, 
     target.longitude || target.lng, 
     current.latitude || current.lat, 
     current.longitude || current.lng 
    ); 
    console.log("Distance from target", distanceFromTarget); 
    if (distanceFromTarget <= 25) { 
     return true 
    } else { 
     return false 
    } 
    } 
関連する問題