1
votes

I am trying to do something like this:

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
...

It manages to geocode the query string correctly, but doesn't let me query against it. Querying a model that uses geocoder raises the following error when you try to find objects near specific coordinates:

Mongo::OperationFailure
geo values have to be numbers

The app is running Mongoid, with the Ruby Geocoder gem for geocoding.

UPDATE Here is the output of the geocode result:

    <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'
2
show us loc.coordinates value. Do you use ruby 1.9.2? there is some difference between 1.9.2 and 1.8.7 output for arrays, which geocoder returns. - Mikhail Nikalyukin
@Mikhail - I updated the question with the entire result of the query - Avishai

2 Answers

3
votes

Your mongoid query for Geospatial query is incorrect

instead this

@places = Place.near(loc.coordinates)

You have to use this

@places = Place.near(:loc => loc.coordinates).

:loc is the column/field name got the location co-ordinates in mongo document.

Edit:

And i forgot one more thing

Google geocoder returns the co-ordinates in [lat,lng] format, but mongo requires them in [lng,lat] format. You better reverse the co-ordinate in the query.

1
votes

There's a couple of things you need to be aware of when using Mongoid with Geocoder. Make sure you've included the Mongoid specific lines in your Place model.

Also, switch loc.coordinates to loc.to_coordinates otherwise you'll end up in Antarctica when you're looking for New York.