如何使用 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 查询某个点附近的对象?的主要内容,如果未能解决你的问题,请参考以下文章

ruby 如何在Ruby Gtk3中使用Glade资源

如何使用 jira-ruby gem 将转换更改为 ruby​​ 中的问题?

如何使用 Ruby 检测人脸?

ruby 方法中如何使用符号来识别参数

如何在 Visual Studio 代码中使用 ruby​​-linter?

如何使用 Ruby 通过 Paymill 进行付款