2 Stimmen

Abrufen von Gradzahlen (0-360) von einem LatLng zu einem anderen in JavaScript

Kann mir jemand helfen, die Lücken mit nativem JavaScript zu füllen?

function getHeading(lat1, lon1, lat2, lon2) {
    // Do cool things with math here

    return heading; // Should be a number between 0 and 360
}

Ich habe schon lange damit herumgespielt und scheine meinen Code nicht richtig hinzubekommen.

14voto

Daniel Vassallo Punkte 325264

Es gibt eine sehr gute JavaScript-Implementierung von Chris Veness unter Berechnung von Entfernung, Peilung und mehr zwischen Breiten- und Längengraden unter dem Lager Überschrift.

Vielleicht bevorzugen Sie die Erweiterung von Googles LatLng Prototyp mit einer getHeading Methode, wie folgt (unter Verwendung der v3-API ):

Number.prototype.toRad = function() {
   return this * Math.PI / 180;
}

Number.prototype.toDeg = function() {
   return this * 180 / Math.PI;
}

google.maps.LatLng.prototype.getHeading = function(point) {
   var lat1 = this.lat().toRad(), lat2 = point.lat().toRad();
   var dLon = (point.lng() - this.lng()).toRad();

   var y = Math.sin(dLon) * Math.cos(lat2);
   var x = Math.cos(lat1) * Math.sin(lat2) -
           Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);

   var brng = Math.atan2(y, x);

   return ((brng.toDeg() + 360) % 360);
}

Diese kann dann wie folgt verwendet werden:

var pointA = new google.maps.LatLng(40.70, -74.00);
var pointB = new google.maps.LatLng(40.70, -75.00);

pointA.getHeading(pointB);   // Returns 270 degrees

Wenn Sie jedoch eine globale Funktion bevorzugen, anstatt die Google-eigene LatLng können Sie wie folgt vorgehen:

function getHeading(lat1, lon1, lat2, lon2) {
    var lat1 = lat1 * Math.PI / 180;
    var lat2 = lat2 * Math.PI / 180;
    var dLon = (lon2 - lon1) * Math.PI / 180;

    var y = Math.sin(dLon) * Math.cos(lat2);
    var x = Math.cos(lat1) * Math.sin(lat2) -
            Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);

    var brng = Math.atan2(y, x);

    return (((brng * 180 / Math.PI) + 360) % 360);
}

Verwendung:

getHeading(40.70, -74.00, 40.70, -75.00);    // Returns 270 degrees

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X