don*_*ski 10 activerecord geocoding postgis ruby-on-rails callback
我正在尝试使用地理编码器宝石来查找地址和坐标.我希望它与我的PostGIS空间数据库和RGeo gem一起使用,它使用POINT功能而不是分别保存纬度和经度值.所以我尝试使用我的模型将地理编码器查找的结果保存到RGeo POINT功能中:
class Location < ActiveRecord::Base
attr_accessible :latlon, :name, :address
set_rgeo_factory_for_column(:latlon, RGeo::Geographic.spherical_factory(:srid => 4326))
geocoded_by :name_and_address do |obj, results|
if geo = results.first
obj.latlon = Location.rgeo_factory_for_column(:latlon).point(geo.longitude, geo.latitude)
end
end
after_initialize :init
after_validation :geocode
def init
self.latlon ||= Location.rgeo_factory_for_column(:latlon).point(0, 0)
end
def latitude
self.latlon.lat
end
def latitude=(value)
lon = self.latlon.lon
self.latlon = Location.rgeo_factory_for_column(:latlon).point(lon, value)
end
def longitude
self.latlon.lon
end
def longitude=(value)
lat = self.latlon.lat
self.latlon = Location.rgeo_factory_for_column(:latlon).point(value, lat)
end
def name_and_address
"#{self.name}, #{self.address}"
end
end
Run Code Online (Sandbox Code Playgroud)
在Rails控制台中,我现在可以:
test = Location.new(name: "Eiffel Tower") // => #<Location id: nil, name: "Eiffel Tower", latlon: #<RGeo::Geographic::SphericalPointImpl:0x81579974 "POINT (0.0 0.0)">, created_at: nil, updated_at: nil, address: nil>
test.geocode // => #<RGeo::Geographic::SphericalPointImpl:0x81581ac0 "POINT (2.294254 48.858278)">
Run Code Online (Sandbox Code Playgroud)
精彩!但是,当我想保存我的测试位置时,触发:after_validation调用:geocode我得到一个错误:
NoMethodError: undefined method `lon' for nil:NilClass
from /Users/sg/rails-projects/geo_rails_test/app/models/location.rb:24:in `latitude='
from /Users/sg/rails-projects/geo_rails_test/app/models/location.rb:7:in `block in <class:Location>'
from /Users/sg/.rvm/gems/ruby-1.9.3-p194/gems/geocoder-1.1.2/lib/geocoder/stores/base.rb:108:in `call'
from /Users/sg/.rvm/gems/ruby-1.9.3-p194/gems/geocoder-1.1.2/lib/geocoder/stores/base.rb:108:in `do_lookup'
from /Users/sg/.rvm/gems/ruby-1.9.3-p194/gems/geocoder-1.1.2/lib/geocoder/stores/active_record.rb:278:in `geocode'
from /Users/sg/.rvm/gems/ruby-1.9.3-p194/gems/activesupport-3.2.8/lib/active_support/callbacks.rb:405:in `_run__1498365873506454431__validation__51840359655181017__callbacks'
[...]
Run Code Online (Sandbox Code Playgroud)
似乎地理编码回调删除了RGeo对象,因此它的内置方法以及我的getter和setter方法不再可用.为什么?有任何想法吗?
这是一个血腥的错字......
有用.我把它留下来,也许别人有同样的问题或更好的解决方案......
我也加了reverse_geocode案子.
现在看看它能做什么:
1.9.3p194 :310 > loc = Location.new(name: "Vatikan")
=> #<Location id: nil, name: "Vatikan", latlon: #<RGeo::Geographic::SphericalPointImpl:0x8148add8 "POINT (0.0 0.0)">, created_at: nil, updated_at: nil, address: nil>
1.9.3p194 :311 > loc.save
(0.2ms) BEGIN
SQL (0.6ms) INSERT INTO "locations" ("address", "created_at", "latlon", "name", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id" [["address", "Via Pio X, 00120, Vatican City"], ["created_at", Sat, 17 Nov 2012 19:26:59 UTC +00:00], ["latlon", #<RGeo::Geographic::SphericalPointImpl:0x81570554 "POINT (12.453389 41.902916)">], ["name", "Vatikan"], ["updated_at", Sat, 17 Nov 2012 19:26:59 UTC +00:00]]
(0.9ms) COMMIT
=> true
Run Code Online (Sandbox Code Playgroud)
我喜欢这个!:-)
| 归档时间: |
|
| 查看次数: |
2055 次 |
| 最近记录: |