Ruby on Rails - Geocoder更好的前向和反向地理编码

时间:2014-11-13 03:01:47

标签: ruby-on-rails ruby google-maps geocoding reverse-geocoding

我正在使用Ruby Geocoder gem同时执行转发和反转地理编码,并遇到了一些问题。我有一个位置模型,它具有经度和纬度字段以及地址字段。在控制器中,我允许用户以两种不同的方式创建位置,第一种是通过提供地址并让Geocoder计算出经度和纬度,第二种是通过提供坐标并让Geocoder确定地址。以下是执行这些任务的Locations模型中的代码:

class Location < ActiveRecord::Base
  validates :name, :presence =>true

  geocoded_by :address
  reverse_geocoded_by :latitude, :longitude
  after_validation :geocode, :reverse_geocode
end

此代码直接来自Ruby Geocoder gem网站,但效果不佳。当我使用地址创建位置时,它似乎仍然执行reverse_geocode。这将从原始地址生成经度和纬度,然后重新生成通常不正确的地址。我对Ruby on Rails相当新,并且想知道是否有更好的方法来做到这一点。也许有一种方法可以使用after_validation回调,并且只有在提供地址时才使用地理编码条件,并且只在提供坐标时才反向地理编码?谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

在此链接中,有一个有关该主题的不错的教程:Geocoder: Display Maps and Find Places in Rails

使geocoderreverse_geocoder在同一模型中工作的位是:

[...]
after_validation :geocode, if: ->(obj){ obj.address.present? and obj.address_changed? }
after_validation :reverse_geocode, unless: ->(obj) { obj.address.present? },
                   if: ->(obj){ obj.latitude.present? and obj.latitude_changed? and obj.longitude.present? and obj.longitude_changed? }
[...]

解决了如果不提供或修改坐标并进行正向和反向地理编码的情况,则进行反向地理编码的问题。