Как использовать функцию геолокации WatchPosition() для наблюдения за другими координатами

Привет, мне было интересно, есть ли способ передать функцию WatchPosition(), специфичную для Lat/Lon, которая предоставляется из массива координат.

У меня возникли проблемы с созданием функции обратного вызова, которая использует что-то вроде координат по умолчанию. координаты лат. длинный

другими словами, я хочу создать какую-то функцию, которую можно использовать аналогичным образом, но предоставляющую мой произвольный набор координат, чтобы watchPosition() мог обновлять местоположение, когда цикл проходит через массив и устанавливается другое местоположение.

if(navigator.geolocation) {

    navigator.geolocation.watchPosition(function(position) {
      var pos = new google.maps.LatLng(position.coords.latitude,
                                       position.coords.longitude);

}


person Kayoti    schedule 08.07.2013    source источник


Ответы (1)


Мне нужно было сделать то же самое, поэтому я написал тестовый скрипт для замены объекта navigator.geolocation фиктивным. Вот мой код:

// Replace real geolocation with mock geolocation
delete navigator.geolocation;    
navigator.geolocation = {
  isMock: true,
  paused: true,
  delay: 100,
  shouldFail: false,
  failsAt: -1,
  unFailsAt: -1,
  errorMessage: "There was an error retrieving the position!",
  currentTimeout: -1,
  lastPosReturned: 0,
  overrideAccuracy: 0, // accuracy in m to return for all positions (overrides any existing accuracies defined in the waypoints)
  useOverrideAccuracy: false, // Whether to override acurracies defined in the waypoints with the above override accuracy      

  _geoCall: function(method, success, error, repeat) {

      return this.currentTimeout = window[method].call(null, __bind(function() {

        var nextPos;

        if(!this.paused && this.lastPosReturned < this.waypoints.length - 1){
            nextPos = this.lastPosReturned++;               
        }else{
            this.lastPosReturned = nextPos = 0;
        }


        if(!this.shouldFail && nextPos == this.failsAt) this.shouldFail = true;
        if(this.shouldFail && nextPos == this.unFailsAt) this.shouldFail = false;

        if(repeat) this._geoCall("setTimeout", success, error, true);

        if (this.shouldFail && (error != null)) {               
            return error(this.errorMessage);
        }
        else if (success != null && !this.paused) {                
            var result = this.waypoints[nextPos];
            result.isMock = true;
            if(this.useOverrideAccuracy) result.coords.accuracy = this.overrideAccuracy;               
            success(result);
            return nextPos;
        }
      }, this), this.delay);

  },
  getCurrentPosition: function(success, error) {
    return this._geoCall("setTimeout", success, error, false);
  },
  watchPosition: function(success, error) {
    this._geoCall("setTimeout", success, error, true);
    return this.currentTimeout;
  },
  clearWatch: function(id) {
    return clearInterval(this.currentTimeout);
  },
  waypoints: []
};

Затем мне просто нужно заполнить массив navigator.geolocation.waypoints объектами положения.

person DaveAlden    schedule 10.07.2013
comment
Я хотел отслеживать свою собственную позицию с помощью watchPosition, а затем наблюдать за чьей-то еще позицией, используя ту же функцию, если их координаты поставляются из массива. - person Kayoti; 10.07.2013
comment
Итак, вы хотите получать как реальные обновления местоположения, так и фиктивные обновления местоположения одновременно? Вы можете использовать мой код выше для фиктивных обновлений местоположения, но переименуйте его в navigator.mockGeolocation. Тогда вы сможете одновременно наблюдать как реальную позицию (navigator.geolocation.watchPosition), так и фиктивную позицию (navigator.mockGeolocation.watchPosition). - person DaveAlden; 11.07.2013
comment
Круто, рад, что у вас получилось :-) Пожалуйста, примите мой ответ на этот вопрос, чтобы другие люди знали, что на него ответили :-) - person DaveAlden; 14.07.2013
comment
нажмите на галочку под стрелками вверх/вниз в левом верхнем углу этого ответа. Я становится зеленым, когда вы наводите на него указатель мыши. Можно и стрелочку вверх щелкнуть ;-) - person DaveAlden; 15.07.2013