【问题标题】:Ruby on Rails - Geocoder Better Forward and Reverse GeocodingRuby on Rails - 地理编码器更好的正向和反向地理编码
【发布时间】:2015-01-10 02:40:36
【问题描述】:

我正在使用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 回调,并且有条件仅在提供地址时进行地理编码,而在提供坐标时仅进行反向地理编码?感谢您的帮助。

【问题讨论】:

  • 我添加了一个答案,但它是错误的。我会考虑一下。要记住的一个问题是,无论何时验证资源,都会调用after_validation,而不管更改了什么属性。您可以通过条件来克服这个问题,但我会尝试想一个好的解决方案。
  • 感谢期待看到它@settheline
  • 这个 railscasts 视频解决了所有属性更新的问题。 railscasts.com/episodes/109-tracking-attribute-changes

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


【解决方案1】:

在这个链接中有一个关于这个主题的很好的教程: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? }
[...]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多