Формула Haversine и геолокация в AngularJS

Я пишу приложение, которое будет сортировать местоположение по имени или расстоянию от пользователя. Все работает как надо, кроме получения расстояния. Теоретически, я должен быть в состоянии получить координаты пользователя с помощью геолокации, и у меня уже есть координаты для каждого местоположения. Разве я не смогу запустить формулу haversine с этими координатами и привязать расстояние к каждой локации через object.distance = d? Вот мой код и план моего проекта. Плункер: http://plnkr.co/edit/nRQc7Ym0lsaK6jQwd626?p=preview
Код:

    var app = angular.module('app', []);
    app.controller('firstCtrl', function($scope) {

      $scope.ASiteLocs = [{
    "name": "IL5077 BRUSSELS",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.58543899999999,38.955472,0"
    }
  }, {
    "name": "IL5076 KAMPSVILLE",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.661923,39.29403,0"
    }
  }, {
    "name": "IL5146 CARROLLTON",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.39965700000001,39.309142,0"
    }
  }, {
    "name": "IL5153 GREENFIELD",
    "styleUrl": "#waypoint",
    "Point": {
      "coordinates": "-90.208747,39.364077,0"
    }
  }];
      $scope.SSiteLocs = [More Locations...];
      $scope.SiteLocs = $scope.SSiteLocs.concat($scope.ASiteLocs);
      repoSortOrder = "site.name";
      navigator.geolocation.getCurrentPosition(GetLocation);

      function GetLocation(location) {
        Lat = location.coords.latitude;
        Lon = location.coords.longitude;

      }

      angular.forEach($scope.SSiteLocs, function(object) {
        object.carrier = 'Sprint';
        getCoordDistance();
        object.distance = $scope.d
      });
      angular.forEach($scope.ASiteLocs, function(object) {
        object.carrier = 'AT&T';
        getCoordDistance();
        object.distance = $scope.d
      });

      angular.forEach($scope.SiteLocs, function(location) {
        var clength = location.Point.coordinates.length;
        if (location.Point.coordinates.substring(clength - 2, clength) === ",0") {
          location.Point.coordinates = location.Point.coordinates.substring(0, clength - 2).split(",");
          Lat = location.Point.coordinates[0];
          Lon = location.Point.coordinates[1];
          Com = ",";
          location.Point.coordinates = Lon.concat(Com, Lat);
        }
      });

      function getCoordDistance() {
        Number.prototype.toRad = function() {
          return this * Math.PI / 180;
        }
        var lat2 = Lat;
        var lon2 = Lon;
        var lat1 = 45;//Test Lat
        var lon1 = -50;//Test Lon

        var R = 3959; // Radius in miles 
        //has a problem with the .toRad() method below.
        var x1 = lat2 - lat1;
        var dLat = x1.toRad();
        var x2 = lon2 - lon1;
        var dLon = x2.toRad();
        var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
          Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) *
          Math.sin(dLon / 2) * Math.sin(dLon / 2);
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
        $scope.d = R * c;
      }
    });

В приведенном выше коде, когда я использую целые числа для Lat/Lons в getCoordDistance() например, lat1 = 5,lat2 = 10,lon1 = 0,lon2 = 0 это работает и добавляет расстояние к каждой локации. Но когда я пытаюсь использовать свое местоположение, это терпит неудачу. Есть идеи?
Заранее благодарю за любую помощь.

1 ответ

Я понял это, мой getCoordDistance() был неопределен.

Другие вопросы по тегам