【问题标题】:Geocoding multiple addresses in one model在一个模型中对多个地址进行地理编码
【发布时间】:2015-06-21 17:41:28
【问题描述】:

我正在尝试使用地理编码器对模型中的 2 个地址进行地理编码,但我无法让 gem 按我的意愿工作。这是我应用于我的模型的代码:

class Sender < ActiveRecord::Base
validates_presence_of :source_address
validates_presence_of :destination_address
geocoded_by :source_address, :latitude => :latitude1, :longitude => :longitude1
geocoded_by :destination_address, :latitude2 => :latitude2, :longitude2 => :longitude2

def update_coordinates
    geocode
    [latitude1, longitude1, latitude2, longitude2]
end

after_validation :geocode  

这里是views/senders/show.html.erb的代码:

 <%= @sender.latitude1 %>
   <%= @sender.longitude1 %>
   <%= @sender.latitude2 %>
   <%= @sender.longitude2 %>

结果:35.6894875 139.6917064 - 不是应该给我发回 2 个地址信息吗?

这是我的js:

<script type="text/javascript">
function initialize() {
  var source = new google.maps.LatLng(<%= @sender.latitude1 %>, <%= @sender.longitude1 %>);
  var dest = new google.maps.LatLng(<%= @sender.latitude2 %>, <%= @sender.longitude2 %>);
  var mapOptions = {
    center: source,
    zoom: 8

  }
  var mapOptions2 = {
    center: dest,
    zoom: 8

  }

  var map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
  var map2 = new google.maps.Map(document.getElementById('map_canvas2'), mapOptions2);

  var marker = new google.maps.Marker({
    position:source,
    map: map
  });
  var marker2 = new google.maps.Marker({
    position:dest,
    map: map2
  });
}
google.maps.event.addDomListener(window, 'load', initialize);
</script>

【问题讨论】:

  • 您的latitude, longitude, latitude2, longitude2 是否返回 4 个不同的值?
  • 只返回结果中显示的纬度、经度值。似乎 geocoded_by :destination_address, :latitude2 => :lat, :longitude2 => :lon 并没有真正起作用..
  • 我想如果你想要Geocoding multiple addresses它需要返回一个地理编码地址的JsonArray,并解析它,参考here

标签: ruby-on-rails google-maps-api-3 geocoding


【解决方案1】:

问题和解决方法都提到了here

在您的模型中添加以下before_save 和相应的方法来解决问题。不要忘记重复第二个位置(可能是目的地)的代码部分:

before_save :geocode_endpoints

  private
  #To enable Geocoder to works with multiple locations
  def geocode_endpoints
    if from_changed?
      geocoded = Geocoder.search(loc1).first
      if geocoded
        self.latitude = geocoded.latitude
        self.longitude = geocoded.longitude
      end
    end
    # Repeat for destination
        if to_changed?
      geocoded = Geocoder.search(loc2).first
      if geocoded
        self.latitude2 = geocoded.latitude
        self.longitude2 = geocoded.longitude
      end
    end
  end

【讨论】:

    【解决方案2】:

    重写

    def function
    ...
    end
    

    作为:

    def update_coordinates
      geocode
      [latitude, longitude, latitude2, longitude2]
    end
    

    还有:

    geocoded_by :destination_address, :latitude => :latitude2, :longitude => :longitude2
    

    这里也不需要:latitude =&gt; :lat, :longitude =&gt; :lon

    geocoded_by :source_address, ...
    

    最后,在记录验证后自动获取坐标。因此,您可以不使用 update_coordinates(或您的版本中的 function)并安排视图以进行显示操作,如下所示:

    <%= @sender.latitude %>
    <%= @sender.longitude %>
    <%= @sender.latitude2 %>
    <%= @sender.longitude2 %>
    

    【讨论】:

    • 谢谢!还给我 [35.6894875, 139.6917064, nil, nil]。你知道为什么后两个是空的吗?
    • 当我关注您更新的答案时,它会返回 [nil, nil, 35.6894875, 139.6917064]。我很困惑
    • 你更新你的问题了吗?那么你肯定会需要这个:geocoded_by :source_address, :latitude =&gt; :latitude1, :longitude =&gt; :longitude1 并更正这个geocoded_by :destination_address, :latitude =&gt; :latitude2, :longitude =&gt; :longitude2
    • 当我检查元素时,它显示我和错误 Uncaught SyntaxError: Unexpected token ,下面是: var source = new google.maps.LatLng(, ); var dest = new google.maps.LatLng(43.653226, -79.3831843);
    • 语法似乎是正确的。我猜地理编码器由于某种原因无法解析源地址坐标。尝试增加 config/initializers/geocoder.rb 中的超时时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多