Динамически загружать маркеры Google Maps с помощью gmaps4rails
Как загрузить только маркеры, которые находятся внутри границ карты, с помощью gmaps4rails? И, конечно, загружайте новые после панорамирования и / или масштабирования.
Непосредственно связанный с этим, как я могу получить текущие границы и уровень масштабирования карты?
2 ответа
Вот как я это сделал, я заменяю маркеры только после того, как пользователь заканчивает панорамирование или масштабирование, если вам требуется другое поведение, тогда используйте другой слушатель событий:
На ваш взгляд (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 индекс #:
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
Ух ты, ты действительно даешь много отзывов о жемчужине:)
Вот как я это использую:
чтобы загрузить только полезные маркеры, я фильтрую их, используя geokit-rails3 и следующую область видимости:
Location.in_bounds([@south_west_point, @north_east_point], :origin => @somewhere)
при масштабировании или пролете я полагаюсь только на кластеризацию, которая ускоряет процесс
для настройки, карты центра и оригинального увеличения, смотрите здесь
Вы должны написать сам метод, чтобы получить текущие границы, подумайте о том, чтобы тянуть:)