如何使用 Ruby Geocoder/Mongoid 查询某个点附近的对象?
Posted
技术标签:
【中文标题】如何使用 Ruby Geocoder/Mongoid 查询某个点附近的对象?【英文标题】:How do I query objects near a point with Ruby Geocoder/Mongoid? 【发布时间】:2011-07-10 11:05:24 【问题描述】:我正在尝试做这样的事情:
if params[:q]
loc = Geocoder.search(params[:q])[0]
logger.info loc.coordinates
@places = Place.near(loc.coordinates).paginate(:per_page => 20, :page => params[:page])
else
...
它设法正确地对查询字符串进行地理编码,但不允许我查询它。 当您尝试查找特定坐标附近的对象时,查询使用地理编码器的模型会引发以下错误:
Mongo::OperationFailure
geo values have to be numbers
应用程序正在运行 Mongoid,使用 Ruby Geocoder gem 进行地理编码。
更新这是地理编码结果的输出:
<Geocoder::Result::Google:0x102fe38c0 @data="address_components"=>["long_name"=>"627", "types"=>["street_number"], "short_name"=>"627", "long_name"=>"3rd Ave", "types"=>["route"], "short_name"=>"3rd Ave", "long_name"=>"Manhattan", "types"=>["sublocality", "political"], "short_name"=>"Manhattan", "long_name"=>"New York", "types"=>["locality", "political"], "short_name"=>"New York", "long_name"=>"New York", "types"=>["administrative_area_level_2", "political"], "short_name"=>"New York", "long_name"=>"New York", "types"=>["administrative_area_level_1", "political"], "short_name"=>"NY", "long_name"=>"United States", "types"=>["country", "political"], "short_name"=>"US", "long_name"=>"10017", "types"=>["postal_code"], "short_name"=>"10017"], "types"=>["street_address"], "partial_match"=>true, "geometry"=>"location"=>"lng"=>-73.9750644, "lat"=>40.7498908, "bounds"=>"northeast"=>"lng"=>-73.9750644, "lat"=>40.7498994, "southwest"=>"lng"=>-73.9750849, "lat"=>40.7498908, "location_type"=>"RANGE_INTERPOLATED", "viewport"=>"northeast"=>"lng"=>-73.9719270293198, "lat"=>40.7530427206802, "southwest"=>"lng"=>-73.9782222706802, "lat"=>40.7467474793198, "formatted_address"=>"627 3rd Ave, New York, NY 10017, USA">
MONGODB development['places'].find(:coordinates=>"$nearSphere"=>[-73.9750644, 40.7498908], "$maxDistance"=>0.00505209229513324)
Completed in 504ms
Mongo::OperationFailure (geo values have to be numbers):
app/controllers/places_controller.rb:11:in `index'
app/middleware/flash_session_cookie_middleware.rb:17:in `call'
app/middleware/flash_session_cookie_middleware.rb:17:in `call'
【问题讨论】:
向我们展示 loc.coordinates 值。你使用 ruby 1.9.2 吗?数组的 1.9.2 和 1.8.7 输出之间存在一些差异,地理编码器返回。 @Mikhail - 我用整个查询结果更新了问题 【参考方案1】:您对地理空间查询的 mongoid 查询不正确
而不是这个
@places = Place.near(loc.coordinates)
你必须使用这个
@places = Place.near(:loc => loc.coordinates).
:loc是在mongo文档中获取位置坐标的列/字段名。
编辑:
我又忘记了一件事
Google 地理编码器以 [lat,lng] 格式返回坐标,但 mongo 需要 [lng,lat] 格式的坐标。您最好在查询中反转坐标。
【讨论】:
【参考方案2】:在将 Mongoid 与 Geocoder 结合使用时,您需要注意几件事。确保在 Place 模型中包含 Mongoid 特定行。
另外,将loc.coordinates
切换为loc.to_coordinates
,否则当您寻找纽约时,您最终会在南极洲。
【讨论】:
我试过了,它为#<:result::google:0x102c7d2f8> 引发了“未定义的方法`to_coordinates'”以上是关于如何使用 Ruby Geocoder/Mongoid 查询某个点附近的对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jira-ruby gem 将转换更改为 ruby 中的问题?