Doing a radius/location search

The application I’m developing allows people to create events in their
local area; as part of this feature I want to display a list of, say,
the five most recent events within 30 miles of a person’s location.

I
have a User model and a Profiles model which contains the user’s
location (city, state, zip code) among other non-related personal
information. So what I would like to do is be able to do is to get a
list of upcoming events relative to that person’s location, and display
it on their “control panel” when they log in to the site.

Also,
at some point in the future I want to integrate with Google Maps to
display a map of the Event’s location on a particular event’s detail
page (i.e. “show” action in the controller); this isn’t required for
the Beta version of the site, but it’s something to consider since it
will be a feature later.

I’ve been looking at the Google Maps
API but I’m not sure if it would let me do what I really need, which
is to query for all zip codes within 30 miles of a given zip code, so I
can display the events to users who live within that radius and
hopefully get them to attend.

I have the book “RailsSpace”, and
it implements something similar to what I want with a database, but if
I go this route will it prevent me from using Google Maps at a later
date? I haven’t really looked yet to see if there are any plugins that
can help me out with this - I want to get a handle on the concepts I
need, and then work on the implementation.

To summarize, what I want to be able to do is:

  • Display a list of the five most recent events within 30 miles of a user’s location on their profile page

Check out the Geokit plugin (for distance finders) and the YM4R-GM
plugin for Google map display.

Harry

I've also used the zip code plugin at this location: http://zipcodesearch.rubyforge.org/
with good results.

I second Harry's suggestion for Geokit. It's super easy and very
powerful. Let's you do a simple query like:

Event.find(:all, :origin=> @user.address, :within=>30, :limit =>
5, :order => 'distance asc')

That would find the 5 events within 30 miles ordered by closest to the
user's address, which could be any "geolocatable representation"...
i.e. anything you'd type in at maps.google.com and get a valid
response.

http://geokit.rubyforge.org/

Oh, and YM4R-GM is good for getting started, but if you start to get
fancy with Google Maps, you may find, as I did, that it's best to just
build it directly with Javascript using the Google Maps API. It seemed
weird to me to be building view logic within the controller, so I
ended up ditching YM4R and doing the javascript directly via the view
and helpers.

Good luck!

-Danimal

I've also used the zip code plugin at this location:http://zipcodesearch.rubyforge.org/
with good results.

The acts_as_locateable plugin is based on zipcodesearch with the same
features plus some improvements.

http://agilewebdevelopment.com/plugins/actsaslocateable
http://www.baconbear.com/articles/2006/12/29/actsaslocateable-released