Получить степени (0-360) от одного LatLng к другому в JavaScript - PullRequest
2 голосов
/ 26 мая 2010

Может ли кто-нибудь помочь мне заполнить пробелы родным JavaScript?

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

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

Я долго возился с этим и, похоже, не могу заставить мой код работать правильно.

1 Ответ

12 голосов
/ 26 мая 2010

Крис Венесс (Chris Veness) очень хорошо реализовал JavaScript на . Вычислите расстояние, направление и многое другое между точками широты и долготы под заголовком Подшипники .

Вы можете предпочесть увеличение прототипа Google LatLng методом getHeading следующим образом (используя 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);
}

Который затем можно использовать так:

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

В противном случае, если вы предпочитаете глобальную функцию вместо увеличения LatLng от Google, вы можете сделать это следующим образом:

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

Использование:

getHeading(40.70, -74.00, 40.70, -75.00);    // Returns 270 degrees
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...