Динамически загружать маркеры Google Maps с помощью gmaps4rails - PullRequest
5 голосов
/ 19 февраля 2011

Как загрузить только маркеры, которые находятся внутри границ карты, с gmaps4rails ?И, конечно, загружайте новые после панорамирования и / или масштабирования.

Непосредственно с этим связано, как я могу получить текущие границы и уровень масштабирования карты?

Ответы [ 2 ]

10 голосов
/ 25 мая 2011

Вот как я это сделал, я заменяю маркеры только после того, как пользователь заканчивает панорамирование или масштабирование, если вам требуется другое поведение, тогда используйте другой слушатель событий:

В вашем представлении (index.html.erb):

<%= gmaps({ "map_options" => { "zoom" => 15, 
                               "auto_adjust" => false, 
                               "detect_location" => true, 
                               "center_on_user" => true }}, false, true) %>

В нижней части вашего представления добавьте:

<script type="text/javascript" charset="utf-8">

function gmaps4rails_callback() {
    google.maps.event.addListener(Gmaps4Rails.map, 'idle', function () {
        var bounds = Gmaps4Rails.map.getBounds();
        drawItems(bounds);
    });
}

</script>

В application.js (используя jQuery):

function drawItems(theBounds) {
    var url = '/venues.json/?sw_y=' + theBounds.getSouthWest().lng() + 
                           '&sw_x=' + theBounds.getSouthWest().lat() + 
                           '&ne_y=' + theBounds.getNorthEast().lng() +
                           '&ne_x=' + theBounds.getNorthEast().lat();
    $.get(url, function(newItemData) {
        Gmaps4Rails.replace_markers(newItemData);
    });
}

venues_controller # index:

def index
    # Only pull venues within the visible bounds of the map
    if (params[:sw_y] && params[:sw_x] && params[:ne_y] && params[:ne_x])
        bounds = [ [params[:sw_x].to_f, params[:sw_y].to_f], 
                 [params[:ne_x].to_f, params[:ne_y].to_f] ]
        @venues_within_bounds = Venue.within_bounds(bounds)
    else
        @venues_within_bounds = Venue.all
    end   

    respond_to do |format|
        format.html # index.html.erb
        format.json { 
            @data = @venues_within_bounds.collect {|v| {
                     :longitude => v.longitude, 
                     :latitude => v.latitude, 
                     :picture => v.marker_picture, 
                     :title => v.marker_title 
            }
            render :json => @data
        }
    end
end

Модель Venue.rb (с использованием mongodb и mongoid):

def self.within_bounds(bounds)
    self.where(:location.within => {"$box" => bounds })
end
2 голосов
/ 19 февраля 2011

Ух ты, ты действительно даешь много отзывов о самоцвете:)

Вот как я это использую:

  • для загрузки только полезных маркеров, я фильтрую их, используя geokit-rails3 и следующую область действия: Location.in_bounds([@south_west_point, @north_east_point], :origin => @somewhere)

  • при масштабировании или пролете я полагаюсь только на кластеризацию, которая ускоряет процесс

  • для настройки, центра карты и исходного увеличения, см. здесь

  • Вы должны написать сам метод, чтобы получить текущие границы, подумайте о вытягивании:)

...