2009-12-09 8 views
7

Je crée une petite application dans Sinatra, et je voudrais déterminer les villes de mes utilisateurs à partir de leur code postal (qu'ils saisiraient), la distance entre eux et d'autres utilisateurs (par code postal), et éventuellement une carte de chaleur des zips.Geo Localisation Ruby/Sinatra?

Comment est-ce que je ferais ceci? J'ai essayé le geoip gem, mais il ne semble pas faire ce que je veux. Est-ce que j'utiliserais un service externe comme Google Maps (de toute évidence, j'en aurais besoin pour une carte thermique)?

Merci pour toute aide.

Répondre

9

Le gemme GeoKit semble être un bon choix pour ce que vous aimeriez faire.

Il extrait les interfaces vers divers services de géocodage (Yahoo, Google, etc.) et fournit un code pour les calculs de distance.

Vous pouvez géocoder les zips pour obtenir des emplacements, accéder aux informations d'adresse relatives à l'emplacement et calculer les distances entre vos emplacements.

Voici le démarrage rapide, sans vergogne copié à partir de la page liée, juste pour vous donner une idée de la façon dont fonctionne la bibliothèque:

irb> require 'rubygems' 
irb> require 'geokit' 
irb> a=Geokit::Geocoders::YahooGeocoder.geocode '140 Market St, San Francisco, CA' 
irb> a.ll 
=> 37.79363,-122.396116 
irb> b=Geokit::Geocoders::YahooGeocoder.geocode '789 Geary St, San Francisco, CA' 
irb> b.ll 
=> 37.786217,-122.41619 
irb> a.distance_to(b) 
=> 1.21120007413626 
irb> a.heading_to(b) 
=> 244.959832435678 
irb(main):006:0> c=a.midpoint_to(b)  # what's halfway from a to b? 
irb> c.ll 
=> "37.7899239257175,-122.406153503469" 
irb(main):008:0> d=c.endpoint(90,10)  # what's 10 miles to the east of c? 
irb> d.ll 
=> "37.7897825005142,-122.223214776155" 
+0

parfait, merci! – user227837