public
Description: A Rails plugin that makes your applications geo-aware.
Homepage: http://graticule.rubyforge.org/plugin.html
Clone URL: git://github.com/collectiveidea/acts_as_geocodable.git
Click here to lend your support to: acts_as_geocodable and make a donation at www.pledgie.com !
100644 99 lines (59 sloc) 3.553 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
= acts_as_geocodable
 
acts_as_geocodable is a plugin to help build geo-aware applications. It automatically geocodes your models when they are saved, giving you the ability to search by location and calculate distances between records.
 
== Usage
 
  event = Event.create :street => "777 NE Martin Luther King, Jr. Blvd.",
    :locality => "Portland", :region => "Oregon", :postal_code => 97232
    
  event.geocode.latitude #=> 45.529100000000
  event.geocode.longitude #=> -122.644200000000
  
  event.distance_to "49423" #=> 1807.66560483205
  
  Event.find(:all, :within => 50, :origin => "97232")
  
  Event.find(:nearest, :origin => "Portland, OR")
  
== Upgrading
 
If you're upgrading from a previous version of this plugin, note that :city has been renamed to :locality to be consistent with Graticule 0.2. Create a migration that has:
 
  rename_column :geocodes, :city, :locality
 
Also remember to change your mapping in your geocodable classes to use the :locality key instead of :city:
 
class Event < ActiveRecord::Base
  acts_as_geocodable :address => {:street => :address1, :locality => :city,
   :region => :state, :postal_code => :zip}
end
 
== Installation
 
Graticule[link:http://rubyforge.org/projects/graticule] is used for all the heavy lifting.
 
  gem install graticule --include-dependencies
 
Install the plugin
 
  script/plugin install git://github.com/collectiveidea/acts_as_geocodable.git
 
== Upgrading
  
Before October 2008, precision wasn't included in the Geocode model. Make sure you add a string precision column to your geocode table if you're upgrading from an older version, and update Graticule.
 
== Configuration
 
Create the required tables
  
  script/generate geocodable_migration add_geocodable_tables
  rake db:migrate
 
Set the default geocoder in your environment.rb file.
 
  Geocode.geocoder = Graticule.service(:yahoo).new 'your_api_key'
 
Then, in each model you want to make geocodable, add acts_as_geocodable.
 
  class Event < ActiveRecord::Base
    acts_as_geocodable
  end
 
The only requirement is that your model must have address fields. By default, acts_as_geocodable looks for attributes called +street+, +locality+, +region+, +postal_code+, and +country+. To change these, you can provide a mapping in the <tt>:address</tt> option:
 
  class Event < ActiveRecord::Base
    acts_as_geocodable :address => {:street => :address1, :locality => :city, :region => :state, :postal_code => :zip}
  end
 
If that doesn't meet your needs, simply override the default +to_location+ method in your model, and return a Graticule::Location with those attributes set.
 
acts_as_geocodable can also update your address fields with the data returned from the geocoding service:
 
  class Event < ActiveRecord::Base
    acts_as_geocodable :normalize_address => true
  end
 
== IP-based Geocoding
 
acts_as_geocodable adds a remote_location method in your controllers that uses http://hostip.info to guess remote users location based on their IP address.
 
  def index
    @nearest = Store.find(:nearest, :origin => remote_location) if remote_location
    @stores = Store.find(:all)
  end
 
Keep in mind that IP-based geocoding is not always accurate, and often will not return any results.
 
== Development
 
The source code is available at:
   http://github.com/collectiveidea/acts_as_geocodable
   git://github.com/collectiveidea/acts_as_geocodable.git
 
Patches and suggestions are welcome!
 
== To Do
 
* Documentation!!!
* configurable formulas