我正在使用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
回调,并且只有在提供地址时才使用地理编码条件,并且只在提供坐标时才反向地理编码?谢谢你的帮助。
答案 0 :(得分:0)
在此链接中,有一个有关该主题的不错的教程:Geocoder: Display Maps and Find Places in Rails
使geocoder
和reverse_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? }
[...]
解决了如果不提供或修改坐标并进行正向和反向地理编码的情况,则进行反向地理编码的问题。