Есть ли способ добавить маркер текущего местоположения в gmaps4rails?

Я пытаюсь понять, как добавить маркер текущего местоположения на карту gmaps4rails вместе с некоторыми map_points из бэкэнда, используя @map_points = @user.places.to_gmaps4rails. Я увидел следующий пост:

Как отобразить местоположение пользователя с помощью маркер в gmaps4rails?

и попытался реализовать там javascript, но, похоже, он не работает. Я добавил этот код в свой раздел javascript, но по какой-то причине обратный вызов не срабатывает:

= gmaps("map_options" => {"detect_location" => true, "center_on_user" => true, "auto_zoom" => false, "zoom" => 12, "auto_adjust" => true, "markers" => {"data" => @map_points}})

:javascript
  Gmaps.map.callback = function() {
    Gmaps.map.addMarkers({Lat: Gmaps.map.userLocation.lat(), Lng: Gmaps.map.userLocation.lng(), rich_marker: null, marker_picture:""});
    }

РЕДАКТИРОВАТЬ: вот что у меня есть сейчас, но по какой-то причине addListenerOnce не срабатывает:

- content_for :scripts do
  :javascript
    Gmaps.map.callback = function() {
      google.maps.event.addListenerOnce(Gmaps.map.getMapObject(),'idle', function(){
        navigator.geolocation.getCurrentPosition(add_map_marker,displayError);
      });

    };

    function add_map_marker(position){
      var lat = position.coords.latitude;
      var lng = position.coords.longitude;
      Gmaps.map.addMarkers([{
        "lng": lng,
        "lat": lat,
        "picture": "http://googlemaps.googlermania.com/google_maps_api_v3/en/Google_Maps_Marker.png",
        "width": "37",
        "height": "34"
      }]);
    }

    function displayError(error){
      alert('There is an error displaying location');
    }

person locoboy    schedule 24.11.2012    source источник


Ответы (2)


Вы должны использовать addMarkers определенный здесь.

Вы должны передать json-массив маркеров в качестве аргумента, полученный в результате to_gmaps4rails или с тем же форматом.


Редактировать:

:javascript
  Gmaps.map.callback = function() {
    Gmaps.map.addMarkers([
      {"description": "", "title": "", "sidebar": "", "lng": "", "lat": "", "picture": "", "width": "", "height": ""}
    ]);
  }

Если карты еще нет, посмотрите здесь.

person apneadiving    schedule 24.11.2012
comment
Спасибо за помощь, как именно мне реализовать это в моем представлении show? - person locoboy; 25.11.2012
comment
Проблема здесь в том, как мне получить текущую широту, долготу? Я попробовал Gmaps.map.userLocation.lat() для широты, но это не работает... См. мой код выше. Также я заметил, что когда я вызываю этот обратный вызов, все точки из вызова =gmaps(blah, :data=>@map_points) стираются. - person locoboy; 25.11.2012
comment
Используйте обратный вызов, предназначенный для успешной геолокации - person apneadiving; 26.11.2012
comment
это тот же обратный вызов, который у вас есть выше? Должен ли я просто отображать все места и текущую позицию в js? - person locoboy; 26.11.2012

Где именно вы добавили этот код? потому что я думаю без перезагрузки, например:

Gmaps.loadMaps();

это все равно не сработает... чтобы решить эту проблему, я думаю, вам нужно описать весь путь. Как именно вы загружаете все? Если стандартным способом, вам необходимо перезагрузить карту.

Я бы порекомендовал также более внимательно изучить (источник gmaps4rails)

Gmaps4rails::JsBuilder.create_js 

метод, и если это ваше поведение по умолчанию, попробуйте разработать собственный метод с этой пользовательской инъекцией для обратного вызова (около строки 34).

Другой способ - вызвать какой-нибудь ajax и сделать с ujs:

  $('#map').html('<%= escape_javascript( gmaps({:last_map => false}) ) %>');
  Gmaps.map = new Gmaps4RailsGoogle();
  Gmaps.load_map = function() {
    Gmaps.map.map_options.maxZoom = 15;
    Gmaps.map.initialize();
    Gmaps.map.markers = <%=raw @json %>;
    Gmaps.map.create_markers();
    Gmaps.map.adjustMapToBounds();
    Gmaps.map.callback();
  };
  Gmaps.loadMaps();
person Piotr Mąsior    schedule 24.11.2012