如何向gmaps4rails添加addPolylines功能?

时间:2013-03-30 18:14:33

标签: ruby-on-rails ruby gem gmaps4rails

我正在使用gmaps4rails gem(版本1.5.6),我希望添加向地图添加更多折线而不是替换已存在的折线的功能。在github上,此代码可以查看here

Markers已存在此功能: Gmaps.map.replaceMarkers(your_markers_json_array); Gmaps.map.addMarkers(your_markers_json_array);

标记功能似乎分布在两个地方:

1)在gmaps4rails.base.js中:

Gmaps4Rails.prototype.addMarkers = function(new_markers) {
  this.markers = this.markers.concat(new_markers);
  this.create_markers();
  return this.adjustMapToBounds();
};

2)在gmaps4rails.base.js.coffee中:

  #add new markers to on an existing map
  addMarkers : (new_markers, adjustBounds = true) ->
    #update the list of markers to take into account
    @markers = @markers.concat(new_markers)
    #put markers on the map
    @create_markers()
    @adjustMapToBounds() if adjustBounds

我想我可以使用replacePolylines代码进行自己的addPolylines来电:

1)在replacePolylines代码附近的gmaps4rails.base.js中:

Gmaps4Rails.prototype.addPolylines = function(new_polylines) {
  this.polylines = this.polylines.concat(new_polylines);
  this.create_polylines();
  return this.adjustMapToBounds();
};

2)在replacePolylines代码附近的gmaps4rails.base.js.coffee中:

 #add new polylines to on an existing map
  addPolylines : (new_polylines) ->
    #update the list of polylines to take into account
    @polylines = @polylines.concat(new_polylines)
    #put polylines on the map
    @create_polylines()
    #.... and adjust map boundaries
    @adjustMapToBounds()

我已经对已经添加到我的Rails项目中的gem进行了这些更改,并且我重新启动了我的Rails服务器。我将其称为replacePolylinesGmaps.map.addPolylines(your_polylines_json_array);相同的方式。它在控制台中产生错误:Uncaught TypeError: Object #<Gmaps4RailsGoogle> has no method 'addPolylines'

在gmaps4rails项目中似乎没有任何其他地方我必须为addPolylines电话做任何事情,但我显然没有做正确的事情。根据这些信息,任何人都可以解释我需要做些什么来实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

作为一种解决方法,在我能够弄清楚如何在gmaps4rails本身中构建功能之前,我已采取这些措施将Polylines异步加载到地图上......

在我的UsersController中,我设置了show操作以构建空白@polylines_json集:

def show
  @user = User.find(params[:id])
  @polylines_json = {}
end

这里的想法是没有任何内容可以让gmaps4rails在其初始地图加载时显示,以便初始页面显示尽可能快。在视图中,我正在使用以下行加载地图:

<%= gmaps( :polylines => { :data => @polylines_json }, :map_options => { :type => 'HYBRID', :zoom => 12, :auto_adjust => false, :center_latitude => "-77", :center_longitude => "21" } ) %>

回到UsersController,我有一个自定义操作maps,用于处理包含fromto参数的json请求(以便我可以找到特定范围内的项目)。我正在根据from / to参数构建实际的Polyline json数据:

def items
  items = items.find(:all, :conditions => ['id >= ? AND id <= ?', params[:from], params[:to]])

  polyline = []
  i=0
  items.each do |item|
    polyline[i] = []
    polyline[i] += [{:lng=>item.longitude.to_f,:lat=>item.latitude.to_f}]
    i += 1
  end
  @polylines_json = polyline.to_json

  respond_to do |format|
    format.json { render json: @polylines_json }
  end
end

最后,回到视图中将它们整合在一起,我一次异步地构建Polyline集合,直到我从数据库中检索它们:

<% content_for :scripts do %>
  <script type="text/javascript" charset="utf-8">
    numberOfItems = <%= @user.items.count %>;
    var polylines= [];
    function LoadMap(from, to) {
      if (to < numberOfItems){
        nextFrom = to + 1;
        nextTo = to + 10;
      }
      if(nextTo <= numberOfItems){
        $.ajax({
          dataType: 'json',
          url: "http://<%= request.host %>/users/<%= @user.id %>/maps.json?from="+from+"&to="+to,
          success: function(response) {
            polylines = polylines.concat(response);
            Gmaps.map.replacePolylines(polylines);
            LoadMap(nextFrom, nextTo);
          }
        });
      }
    }
    LoadMap(1,10);
  </script>
<% end %>