Как запросить объекты возле точки с помощью Ruby Geocoder / Mongoid? - PullRequest
1 голос
/ 10 июля 2011

Я пытаюсь сделать что-то вроде этого:

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::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 ]

3 голосов
/ 11 июля 2011

Ваш mongoid запрос для геопространственного запроса неправильный

вместо этого

@places = Place.near(loc.coordinates)

Вы должны использовать это

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

: loc имя столбца / поля получило координаты местоположения в документе монго.

Редактировать:

И я забыл еще одну вещь

Геокодер Googleвозвращает координаты в формате [lat, lng] , но mongo требует их в формате [lng, lat] .Вам лучше поменять координаты в запросе.

1 голос
/ 10 июля 2011

При использовании Mongoid с Geocoder вам необходимо помнить несколько вещей. Убедитесь, что вы включили монгоидные линии в модель Place.

Кроме того, переключите loc.coordinates на loc.to_coordinates, иначе вы окажетесь в Антарктиде, когда будете искать Нью-Йорк.

...