Заполнение маркеров Google Maps для Rails на основе геолокации

Я пытаюсь использовать гем Google Maps for Rails для заполнения карты маркеры на основе пользовательского gmaps4rails_callback, который использует текущее местоположение, но я не могу получить код для замены маркеров, чтобы они срабатывали после определения геолокации пользователя.

Мой application.js определяет функцию обратного вызова пользовательской карты вместе с обратным вызовом для getCurrentPosition:

function nearby_locations(position) {
    $.getJSON('locations/nearby.json',
          { lat: "33.7012", long: "-117.8683" },
          function(data) {
                    Gmaps4Rails.replace_markers(data);
          });   
}

function gmaps4rails_callback() {
    navigator.geolocation.getCurrentPosition(nearby_locations);
}

На данный момент я использую жестко закодированные данные широты/долготы, но в конечном итоге я собираюсь отключить реальные данные в переданном мне объекте position. Запуск вызова getJSON вручную работает нормально, и мой locations/nearby.json возвращает данные о местоположении в правильном формате, который обновляет маркеры, как и ожидалось.

Мой шаблон представления просто использует

<%= gmaps("map_options" => {"auto_adjust" => true, "detect_location" => true}) %>

Теперь я понимаю, что я, вероятно, выполняю геолокационный поиск дважды, используя как detect_location, так и вызов getCurrentPosition, но в более ранней попытке код в gmaps4rails_callback выполнялся до того, как разрешение на геолокацию из браузера (Safari) было завершено, поэтому Я думал, что это задержит выполнение до тех пор, пока место не будет определено.

Ранее я отображал карту без пользовательского gmaps4rails_callback, и она работала нормально, поэтому я знаю, что мои файлы jQuery и JavaScript включаются без проблем.

Возможно ли, что Google Maps для Rails каким-то образом уже устанавливает свой собственный обратный вызов getCurrentPosition, а мой игнорируется? После добавления журнала отладки не похоже, что nearby_locations вообще вызывается.


person Joost Schuur    schedule 24.05.2011    source источник


Ответы (1)


По сути, когда вы устанавливаете "detect_location" => true, это запускает следующую функцию:

findUserLocation: function() {
    if(navigator.geolocation) {
    //try to retrieve user's position
    navigator.geolocation.getCurrentPosition(function(position) {
      //saves the position in the userLocation variable
      Gmaps4Rails.userLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
           //change map's center to focus on user's geoloc if asked
            if(Gmaps4Rails.map_options.center_on_user === true) {
                Gmaps4Rails.map.setCenter(Gmaps4Rails.userLocation);
            }
    },
    function() {
          //if failure, triggers the function if defined
          if(this.fnSet("gmaps4rails_geolocation_failure")) { gmaps4rails_geolocation_failure(true); }
        });
  }
  else {
      //if failure, triggers the function if defined
      if(this.fnSet("gmaps4rails_geolocation_failure")) { gmaps4rails_geolocation_failure(false); }
  }
}

Так что да, геолокация уже сделана... или в процессе. Эта функция запускается до gmaps4rails_callback, но это сложная часть с геолокацией браузера: она занимает неопределенное время.

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

К сожалению, я не понимаю проблемы с вашим gmpas4rails_callback: у меня есть и detection_location, и обратный вызов, и он работает как положено.

person apneadiving    schedule 24.05.2011
comment
Спасибо за подтверждение того, что происходит за кулисами. Я не копался в коде, когда вчера вечером опубликовал свою проблему. Можете ли вы подтвердить, что выполнение gmaps4rails_callback заблокировано до тех пор, пока не будет предоставлено разрешение пользователя и не будет определено местоположение (или не будет запущено действие при сбое)? Судя по моим собственным испытаниям, это не так. Я позабочусь о публикации быстрого проекта, демонстрирующего проблему, которую вы можете клонировать, если хотите поближе. - person Joost Schuur; 25.05.2011
comment
Обратный вызов не блокируется. Я только что добавил в него предупреждение и не ответил, что хром хочет геолокировать мой компьютер. Сообщение с предупреждением отображалось до того, как я ответил на хром. - person apneadiving; 25.05.2011