2016-08-29 2 views
-1

Ich habe eine Funktion, die 2 Paare von Längen-und Breitengrad und gibt eine Strecke in m.Wie behandelt man mehrere Formate für Daten in der gleichen Funktion in 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 

(bemerke ich diese Funktion nicht erstellt haben, aber aus einer anderen Frage kam auf SO)

ich mehrere Quellen für Breiten- und Längengrade haben, und ich würde gerne wissen, wie sie zu handhaben. Ich habe versucht, || wie diese

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

mit würde Ich mag die Funktion verwenden Eingabe von drei verschiedenen Formaten

navigator.geolocation.x 

die Daten

{latitude: 0000, longitude:0000} 

ein Plugin kehrt zu handhaben, die in dem Format gibt

zurück
{lat: 000, lng: 000} 

und Google Maps API, die eine komplexe Aufgabe für den Standort gibt Getter für lat und lng etwas wie folgt enthält:

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

Wie kann ich alle drei umgehen? Ich dachte, was ich oben hatte funktioniert, aber jetzt ist es klar, dass es nicht ist. Die Entfernung gibt NaN zurück, wenn sich der Standort im Format target.lat() befindet. Es wäre auch schön, wenn jemand erklären könnte, wie || im Allgemeinen funktioniert, da ich dachte, es würde nur das nächste Objekt in der Zeile verwenden, wenn das vorherige nicht definiert war.

+0

'||' ist ein Kurzschlussoperator, was bedeutet, wenn der erste Fall wahr ist, wird der Rest in diesem Fall nicht ausgewertet werden. – Aaron

+0

Ich habe Ihren Code getestet und es hat gut funktioniert. Es gibt allerdings einen kleinen Fehler im vierten Argument: 'current.lat' anstelle von' current.lng' –

+0

Danke Chris, dass du das entdeckt hast. Obwohl es nicht die Lösung zu sein schien, bekam ich NaN als meine Entfernung, wenn ich Daten aus den Google Maps nutze. Ich ändere die Reihenfolge der Operatoren, dh setze 'target.lat()' vor, bevor 'target.lat' das Problem gelöst zu haben scheint. Ich denke, dass target.lat wie definiert gelesen wurde und dann die Operationen für die Funktion ausgeführt wurden und nicht der Wert, der von der Funktion zurückgegeben wurde. Ich habe es jedoch noch nicht mit dem Plugin-Fall getestet. – xerotolerant

Antwort

0

Das Problem war wirklich, wie der Code Fehler behandelt, wie wenn das ursprüngliche aktuelle oder Zielobjekt undefiniert war. Auch für den Fall, dass das Positionsobjekt einen Getter für lat und lnglat() oder lng() enthält. Dann würde target.lat definiert werden

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 
    } 
    } 
Verwandte Themen