geo_coder 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. data/Gemfile +12 -0
  2. data/Gemfile.lock +32 -0
  3. data/History.txt +6 -0
  4. data/Makefile +13 -0
  5. data/Manifest.txt +18 -0
  6. data/README.rdoc +197 -0
  7. data/Rakefile +53 -0
  8. data/TODO.txt +8 -0
  9. data/VERSION +1 -0
  10. data/bin/build_indexes +8 -0
  11. data/bin/rebuild_cluster +22 -0
  12. data/bin/rebuild_metaphones +23 -0
  13. data/bin/tiger_import +59 -0
  14. data/demos/demo/app/ext/geocodewrap.rb +84 -0
  15. data/demos/demo/app/views/index.builder +13 -0
  16. data/demos/demo/app/views/index.erb +71 -0
  17. data/demos/demo/config.ru +12 -0
  18. data/demos/demo/config/bootstraps.rb +130 -0
  19. data/demos/demo/config/geoenvironment.rb +25 -0
  20. data/demos/demo/geocoder_helper.rb +12 -0
  21. data/demos/demo/geocom_geocode.rb +10 -0
  22. data/demos/demo/main.rb +3 -0
  23. data/demos/demo/rakefile.rb +17 -0
  24. data/demos/demo/tmp/restart.txt +0 -0
  25. data/demos/simpledemo/views/index.builder +13 -0
  26. data/demos/simpledemo/views/index.erb +69 -0
  27. data/demos/simpledemo/ws.rb +83 -0
  28. data/doc/Makefile +7 -0
  29. data/doc/html4css1.css +279 -0
  30. data/doc/lookup.rst +193 -0
  31. data/doc/parsing.rst +125 -0
  32. data/doc/voidspace.css +147 -0
  33. data/geo_coder.gemspec +172 -0
  34. data/lib/geocoder/us.rb +21 -0
  35. data/lib/geocoder/us/address.rb +290 -0
  36. data/lib/geocoder/us/constants.rb +670 -0
  37. data/lib/geocoder/us/database.rb +745 -0
  38. data/lib/geocoder/us/import.rb +181 -0
  39. data/lib/geocoder/us/import/tiger.rb +13 -0
  40. data/lib/geocoder/us/numbers.rb +58 -0
  41. data/navteq/README +4 -0
  42. data/navteq/convert.sql +37 -0
  43. data/navteq/navteq_import +39 -0
  44. data/navteq/prepare.sql +92 -0
  45. data/sql/cluster.sql +16 -0
  46. data/sql/convert.sql +80 -0
  47. data/sql/create.sql +37 -0
  48. data/sql/index.sql +12 -0
  49. data/sql/place.csv +104944 -0
  50. data/sql/place.sql +104948 -0
  51. data/sql/setup.sql +78 -0
  52. data/src/Makefile +13 -0
  53. data/src/README +14 -0
  54. data/src/liblwgeom/Makefile +75 -0
  55. data/src/liblwgeom/box2d.c +54 -0
  56. data/src/liblwgeom/lex.yy.c +4799 -0
  57. data/src/liblwgeom/liblwgeom.h +1405 -0
  58. data/src/liblwgeom/lwalgorithm.c +946 -0
  59. data/src/liblwgeom/lwalgorithm.h +52 -0
  60. data/src/liblwgeom/lwcircstring.c +759 -0
  61. data/src/liblwgeom/lwcollection.c +541 -0
  62. data/src/liblwgeom/lwcompound.c +118 -0
  63. data/src/liblwgeom/lwcurvepoly.c +86 -0
  64. data/src/liblwgeom/lwgeom.c +886 -0
  65. data/src/liblwgeom/lwgeom_api.c +2201 -0
  66. data/src/liblwgeom/lwgparse.c +1219 -0
  67. data/src/liblwgeom/lwgunparse.c +1054 -0
  68. data/src/liblwgeom/lwline.c +525 -0
  69. data/src/liblwgeom/lwmcurve.c +125 -0
  70. data/src/liblwgeom/lwmline.c +137 -0
  71. data/src/liblwgeom/lwmpoint.c +138 -0
  72. data/src/liblwgeom/lwmpoly.c +141 -0
  73. data/src/liblwgeom/lwmsurface.c +129 -0
  74. data/src/liblwgeom/lwpoint.c +439 -0
  75. data/src/liblwgeom/lwpoly.c +579 -0
  76. data/src/liblwgeom/lwsegmentize.c +1047 -0
  77. data/src/liblwgeom/lwutil.c +369 -0
  78. data/src/liblwgeom/measures.c +861 -0
  79. data/src/liblwgeom/postgis_config.h +93 -0
  80. data/src/liblwgeom/ptarray.c +847 -0
  81. data/src/liblwgeom/vsprintf.c +179 -0
  82. data/src/liblwgeom/wktparse.h +126 -0
  83. data/src/liblwgeom/wktparse.lex +74 -0
  84. data/src/liblwgeom/wktparse.tab.c +2353 -0
  85. data/src/liblwgeom/wktparse.tab.h +145 -0
  86. data/src/liblwgeom/wktparse.y +385 -0
  87. data/src/libsqlite3_geocoder/Makefile +22 -0
  88. data/src/libsqlite3_geocoder/Makefile.nix +15 -0
  89. data/src/libsqlite3_geocoder/Makefile.redhat +15 -0
  90. data/src/libsqlite3_geocoder/extension.c +121 -0
  91. data/src/libsqlite3_geocoder/extension.h +13 -0
  92. data/src/libsqlite3_geocoder/levenshtein.c +42 -0
  93. data/src/libsqlite3_geocoder/metaphon.c +278 -0
  94. data/src/libsqlite3_geocoder/util.c +37 -0
  95. data/src/libsqlite3_geocoder/wkb_compress.c +54 -0
  96. data/src/metaphone/Makefile +7 -0
  97. data/src/metaphone/README +49 -0
  98. data/src/metaphone/extension.c +37 -0
  99. data/src/metaphone/metaphon.c +251 -0
  100. data/src/shp2sqlite/Makefile +37 -0
  101. data/src/shp2sqlite/Makefile.nix +36 -0
  102. data/src/shp2sqlite/Makefile.redhat +35 -0
  103. data/src/shp2sqlite/dbfopen.c +1595 -0
  104. data/src/shp2sqlite/getopt.c +695 -0
  105. data/src/shp2sqlite/getopt.h +127 -0
  106. data/src/shp2sqlite/shapefil.h +500 -0
  107. data/src/shp2sqlite/shp2sqlite.c +1974 -0
  108. data/src/shp2sqlite/shpopen.c +1894 -0
  109. data/tests/address.rb +236 -0
  110. data/tests/benchmark.rb +20 -0
  111. data/tests/constants.rb +57 -0
  112. data/tests/data/address-sample.csv +52 -0
  113. data/tests/data/db-test.csv +57 -0
  114. data/tests/data/locations.csv +4 -0
  115. data/tests/database.rb +137 -0
  116. data/tests/generate.rb +34 -0
  117. data/tests/numbers.rb +46 -0
  118. data/tests/run.rb +11 -0
  119. metadata +237 -0
data/tests/address.rb ADDED
@@ -0,0 +1,236 @@
1
+ $LOAD_PATH.unshift '../lib'
2
+
3
+ require 'test/unit'
4
+ require 'set'
5
+ require 'geocoder/us/address'
6
+
7
+ include Geocoder::US
8
+
9
+ class TestAddress < Test::Unit::TestCase
10
+ def test_new
11
+ addr = Address.new("1600 Pennsylvania Av., Washington DC")
12
+ assert_equal "1600 Pennsylvania Av, Washington DC", addr.text
13
+ end
14
+ def test_clean
15
+ fixtures = [
16
+ [ "cleaned text", "cleaned: text!" ],
17
+ [ "cleaned-text 2", "cleaned-text: #2?" ],
18
+ [ "it's working 1/2", "~it's working 1/2~" ],
19
+ [ "it's working, yes", "it's working, yes...?" ],
20
+ [ "it's working & well", "it's working & well?" ]
21
+ ]
22
+ fixtures.each {|output, given|
23
+ assert_equal output, Address.new(given).text
24
+ }
25
+ end
26
+ def test_expand_numbers
27
+ num_list = ["5", "fifth", "five"]
28
+ num_list.each {|n|
29
+ addr = Address.new(n)
30
+ assert_equal num_list, addr.expand_numbers(n).to_a.sort
31
+ }
32
+ end
33
+ def test_city_parse
34
+ places = [
35
+ [ "New York, NY", "New York", "NY", "" ],
36
+ [ "NY", "", "NY", "" ],
37
+ [ "New York", "New York", "NY", "" ],
38
+ [ "Philadelphia", "Philadelphia", "", "" ],
39
+ [ "Philadelphia PA", "Philadelphia", "PA", "" ],
40
+ [ "Philadelphia, PA", "Philadelphia", "PA", "" ],
41
+ [ "Philadelphia, Pennsylvania", "Philadelphia", "PA", "" ],
42
+ [ "Philadelphia, Pennsylvania 19131", "Philadelphia", "PA", "19131" ],
43
+ [ "Philadelphia 19131", "Philadelphia", "", "19131" ],
44
+ [ "Pennsylvania 19131", "Pennsylvania", "PA", "19131" ], # kind of a misfeature
45
+ [ "19131", "", "", "19131" ],
46
+ [ "19131-9999", "", "", "19131" ],
47
+ ]
48
+ for fixture in places
49
+ addr = Address.new fixture[0]
50
+ [:city, :state, :zip].zip(fixture[1..3]).each {|key,val|
51
+ result = addr.send key
52
+ result = [result.downcase] unless result.kind_of? Array
53
+ if result.empty?
54
+ assert_equal val, "", key.to_s + " test no result " + fixture.join("/")
55
+ else
56
+ assert result.member?(val.downcase), key.to_s + " test " + result.inspect + fixture.join("/")
57
+ end
58
+ }
59
+ end
60
+ end
61
+
62
+ def test_po_box
63
+ addr_po = Address.new "PO Box 1111 Herndon VA 20171"
64
+ assert addr_po.po_box?, true
65
+ end
66
+
67
+
68
+
69
+ def test_parse
70
+ addrs = [
71
+ {:text => "1600 Pennsylvania Av., Washington DC 20050",
72
+ :number => "1600",
73
+ :street => "Pennsylvania Ave",
74
+ :city => "Washington",
75
+ :state => "DC",
76
+ :zip => "20050"},
77
+
78
+ {:text => "1600 Pennsylvania, Washington DC",
79
+ :number => "1600",
80
+ :street => "Pennsylvania",
81
+ :city => "Washington",
82
+ :state => "DC"},
83
+
84
+ {:text => "1600 Pennsylvania Washington DC",
85
+ :number => "1600",
86
+ :street => "Pennsylvania Washington",
87
+ :city => "Pennsylvania Washington", # FIXME
88
+ :state => "DC"},
89
+
90
+ {:text => "1600 Pennsylvania Washington",
91
+ :number => "1600",
92
+ :street => "Pennsylvania",
93
+ :city => "Washington",
94
+ :state => "WA"}, # FIXME
95
+
96
+ {:text => "1600 Pennsylvania 20050",
97
+ :number => "1600",
98
+ :street => "Pennsylvania", # FIXME
99
+ :zip => "20050"},
100
+
101
+ {:text => "1600 Pennsylvania Av, 20050-9999",
102
+ :number => "1600",
103
+ :street => "Pennsylvania Ave",
104
+ :zip => "20050"},
105
+
106
+ {:text => "1005 Gravenstein Highway North, Sebastopol CA",
107
+ :number => "1005",
108
+ :street => "Gravenstein Hwy N",
109
+ :city => "Sebastopol",
110
+ :state => "CA"},
111
+
112
+ {:text => "100 N 7th St, Brooklyn",
113
+ :number => "100",
114
+ :street => "N 7 St",
115
+ :city => "Brooklyn"},
116
+
117
+ {:text => "100 N Seventh St, Brooklyn",
118
+ :number => "100",
119
+ :street => "N 7 St",
120
+ :city => "Brooklyn"},
121
+
122
+ {:text => "100 Central Park West, New York, NY",
123
+ :number => "100",
124
+ :street => "Central Park W",
125
+ :city => "New York",
126
+ :state => "NY"},
127
+
128
+ {:text => "100 Central Park West, 10010",
129
+ :number => "100",
130
+ :street => "Central Park W",
131
+ :zip => "10010"},
132
+
133
+ {:text => "1400 Avenue of the Americas, New York, NY 10019",
134
+ :number => "1400",
135
+ :street => "Ave of the Americas",
136
+ :city => "New York",
137
+ :state => "NY"},
138
+
139
+ {:text => "1400 Avenue of the Americas, New York",
140
+ :number => "1400",
141
+ :street => "Ave of the Americas",
142
+ :city => "New York"},
143
+
144
+ {:text => "1400 Ave of the Americas, New York",
145
+ :number => "1400",
146
+ :street => "Ave of the Americas",
147
+ :city => "New York"},
148
+
149
+ {:text => "1400 Av of the Americas, New York",
150
+ :number => "1400",
151
+ :street => "Ave of the Americas",
152
+ :city => "New York"},
153
+
154
+ {:text => "1400 Av of the Americas New York",
155
+ :number => "1400",
156
+ :street => "Ave of the Americas",
157
+ :city => "New York"},
158
+
159
+ ]
160
+ for fixture in addrs
161
+ text = fixture.delete(:text)
162
+ addr = Address.new(text)
163
+ for key, val in fixture
164
+ result = addr.send key
165
+ if result.kind_of? Array
166
+ result.map! {|str| str.downcase}
167
+ assert result.member?(val.downcase), "#{text} (#{key}) = #{result.inspect}"
168
+ else
169
+ assert_equal val, result, "#{text} (#{key}) = #{result.inspect}"
170
+ end
171
+ end
172
+ end
173
+ end
174
+
175
+ def test_skip_parse
176
+ addresses = [
177
+ {:street => "1233 Main St", :city => "Springfield", :region => "VA", :postal_code => "12345", :final_number => "1233", :parsed_street => "main st"},
178
+ {:street => "somewhere Ln", :city => "Somewhere", :region => "WI", :postal_code => "22222", :number => "402", :parsed_street => "somewhere ln", :final_number => "402"},
179
+ ]
180
+ for preparsed_address in addresses
181
+ address_for_geocode = Address.new preparsed_address
182
+ assert_equal preparsed_address[:parsed_street],address_for_geocode.street[0]
183
+ assert_equal preparsed_address[:final_number],address_for_geocode.number
184
+ assert_equal preparsed_address[:city],address_for_geocode.city[0]
185
+ assert_equal preparsed_address[:region],address_for_geocode.state
186
+ assert_equal preparsed_address[:postal_code],address_for_geocode.zip
187
+ end
188
+ end
189
+
190
+ def test_states_abbreviated_in_skip_parse
191
+ addresses = [
192
+ {:street => "123 Main St", :city => "Springfield", :region => "Virginia", :postal_code => "12345",:state_abbrev => "VA"},
193
+ {:street => "402 Somewhere Ln", :city => "Somewhere", :region => "WI", :postal_code => "22222", :state_abbrev => "WI"},
194
+ ]
195
+ for preparsed_address in addresses
196
+ address_for_geocode = Address.new preparsed_address
197
+ assert_equal preparsed_address[:state_abbrev],address_for_geocode.state
198
+ end
199
+
200
+ end
201
+
202
+ def test_address_hash
203
+ addresses = [
204
+ {:address => "Herndon, VA", :place_check => ["herndon"]},
205
+ {:address => "Arlington, VA", :place_check => ["arlington"]}
206
+ ]
207
+ for preparsed_address in addresses
208
+ address_for_geocode = Address.new preparsed_address
209
+ assert_equal preparsed_address[:place_check],address_for_geocode.city
210
+ end
211
+ end
212
+
213
+ def test_partial_address
214
+ addresses = [
215
+ {:street => "2200 Wilson Blvd", :postal_code => "22201"},
216
+ ]
217
+ for preparsed_address in addresses
218
+ address_for_geocode = Address.new preparsed_address
219
+ assert_equal preparsed_address[:postal_code],address_for_geocode.zip
220
+ end
221
+
222
+
223
+ end
224
+
225
+ def test_country_parse
226
+ addresses = [
227
+ {:city => "Paris", :country => "FR"},
228
+ ]
229
+
230
+ for preparsed_address in addresses
231
+ address_for_geocode = Address.new preparsed_address
232
+ assert_equal preparsed_address[:country],address_for_geocode.state
233
+ end
234
+ end
235
+
236
+ end
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'test/unit'
4
+ require 'geocoder/us/database'
5
+ require 'benchmark'
6
+ include Benchmark # we need the CAPTION and FMTSTR constants
7
+
8
+ db = Geocoder::US::Database.new("/mnt/tiger2008/geocoder.db")
9
+
10
+ n = 50
11
+ s = "1005 Gravenstein Hwy N, Sebastopol CA 95472"
12
+ a = Geocoder::US::Address.new(s)
13
+
14
+ print db.geocode(s)
15
+
16
+ Benchmark.bmbm do |x|
17
+ x.report("parse max_penalty=0") { n.times{a.parse(0)} }
18
+ x.report("parse max_penalty=1") { n.times{a.parse(1)} }
19
+ x.report("geocode") { n.times{db.geocode(s)} }
20
+ end
@@ -0,0 +1,57 @@
1
+ $LOAD_PATH.unshift '../lib'
2
+
3
+ require 'test/unit'
4
+ require 'geocoder/us/constants'
5
+
6
+ include Geocoder::US
7
+
8
+ class TestConstants < Test::Unit::TestCase
9
+ def initialize (*args)
10
+ @map = Map[
11
+ "Abbreviation" => "abbr",
12
+ "Two words" => "2words",
13
+ "Some three words" => "3words"
14
+ ]
15
+ super(*args)
16
+ end
17
+ def test_class_constructor
18
+ assert_kind_of Map, @map
19
+ assert_kind_of Hash, @map
20
+ end
21
+ def test_key
22
+ assert @map.key?( "Abbreviation" )
23
+ assert @map.key?( "abbreviation" )
24
+ assert !(@map.key? "abbreviation?")
25
+ assert @map.key?( "abbr" )
26
+ assert @map.key?( "Two words" )
27
+ assert @map.key?( "2words" )
28
+ end
29
+ def test_fetch
30
+ assert_equal "abbr", @map["Abbreviation"]
31
+ assert_equal "abbr", @map["abbreviation"]
32
+ assert_nil @map["abbreviation?"]
33
+ assert_equal "abbr", @map["abbr"]
34
+ assert_equal "2words", @map["Two words"]
35
+ assert_equal "2words", @map["2words"]
36
+ end
37
+ # def test_partial
38
+ # assert @map.partial?( "Abbreviation" )
39
+ # assert @map.partial?( "Two" )
40
+ # assert @map.partial?( "two" )
41
+ # assert !(@map.partial? "words")
42
+ # assert @map.partial?( "Some" )
43
+ # assert !(@map.partial? "words")
44
+ # assert @map.partial?( "Some three" )
45
+ # assert @map.partial?( "SOME THREE WORDS" )
46
+ # end
47
+ def test_constants
48
+ assert_kind_of Map, Directional
49
+ assert_kind_of Map, Prefix_Qualifier
50
+ assert_kind_of Map, Suffix_Qualifier
51
+ assert_kind_of Map, Prefix_Type
52
+ assert_kind_of Map, Suffix_Type
53
+ assert_kind_of Map, Unit_Type
54
+ assert_kind_of Map, Name_Abbr
55
+ assert_kind_of Map, State
56
+ end
57
+ end
@@ -0,0 +1,52 @@
1
+ address,number,predir,prequal,pretyp,street,suftyp,sufqual,sufdir,unittyp,unit,city,state,zip,lon,lat,count,comment
2
+ "93 NORTH 9TH STREET, BROOKLYN NY 11211",93,N,,,9th,St,,,,,Brooklyn,NY,11211,,,,
3
+ "380 WESTMINSTER ST, PROVIDENCE RI 02903",380,,,,Westminster,St,,,,,Providence,RI,02903,,,,
4
+ "177 MAIN STREET, LITTLETON NH 03561",177,,,,Main,St,,,,,Littleton,NH,03561,,,,
5
+ "202 HARLOW ST, BANGOR ME 04401",202,,,,Harlow,St,,,,,Bangor,ME,04401,,,,
6
+ "46 FRONT STREET, WATERVILLE, ME 04901",46,,,,Front,St,,,,,Waterville,ME,04901,,,,
7
+ "22 SUSSEX ST, HACKENSACK NJ 07601",22,,,,Sussex,St,,,,,Hackensack,NJ,07601,,,,
8
+ "75 OAK STREET, PATCHOGUE NY 11772",75,,,,Oak,St,,,,,Patchogue,NY,11772,,,,
9
+ "1 CLINTON AVE, ALBANY NY 12207",1,,,,Clinton,Ave,,,,,Albany,NY,12207,,,,
10
+ "7242 ROUTE 9, PLATTSBURGH NY 12901",7242,,,US Hwy,9,,,,,,Plattsburgh,NY,12901,,,,
11
+ "520 5TH AVE, MCKEESPORT PA 15132",520,,,,5th,Ave,,,,,McKeesport,PA,15132,,,,
12
+ "122 W 3RD STREET, GREENSBURG PA 15601",122,W,,,3rd,St,,,,,Greensburg,PA,15601,,,,
13
+ "901 UNIVERSITY DR, STATE COLLEGE PA 16801",901,,,,University,Dr,,,,,"State College",PA,16801,,,,
14
+ "240 W 3RD ST, WILLIAMSPORT PA 17701",240,W,,,3rd,St,,,,,Williamsport,PA,17701,,,,
15
+ "41 N 4TH ST, ALLENTOWN PA 18102",41,N,,,4th,St,,,,,Allentown,PA,18102,,,,
16
+ "2221 W. MARKET STREET, POTTSVILLE PA 17901",2221,W,,,Market,St,,,,,Pottsville,PA,17901,,,,
17
+ "337 BRIGHTSEAT ROAD, LANDOVER MD 20785",337,,,,Brightseat,Rd,,,,,Hyattsville,MD,20785,,,,"canonical place"
18
+ "101 CHESAPEAKE BLVD, ELKTON MD 21921",103,,,,Chesapeake,Blvd,,,,,Elkton,MD,21921,,,,"find nearest corner"
19
+ "2875 SABRE ST, VIRGINIA BEACH VA 23452",2809,,,,Sabre,St,,,,,"Virginia Beach",VA,23452,,,,"find nearest corner"
20
+ "324 COMMERCE ROAD, FARMVILLE VA 23901",324,,,,Commerce,St,,,,,Clarksville,VA,23927,,,,"nearby address; might be TIGER omission"
21
+ "1480 EAST MAIN STREET, WYTHEVILLE VA 24382",1480,W,,,Main,St,,,,,Wytheville,VA,24382,,,,"nearby address; TIGER omission"
22
+ "116 N JEFFERSON STREET, ROANOKE VA 24016",116,N,,,Jefferson,St,,,,,Roanoke,VA,24016,,,,
23
+ "50 MCDOWELL STREET, WELCH WV 24801",50,,,,"Mc Dowell",St,,,,,Welch,WV,24801,,,,
24
+ "146 EAST FIRST AVE, WILLIAMSON WV 25661",200,E,,,1st,Ave,,,,,Williamson,WV,25661,,,,"find nearest corner"
25
+ "1925 E MAIN ST, ALBEMARLE NC 28001",1925,E,,,Main,St,,,,,Albemarle,NC,28001,,,,
26
+ "1013 SPRING LANE, SANFORD NC 27330",1013,,,,Spring,Ln,,,,,Sanford,NC,27330,,,,
27
+ "145 ROWAN STREET, FAYETTEVILLE NC 28301",145,,,,Rowan,St,,,,,Fayetteville,NC,28301,,,,
28
+ "1420 MCCARTHY BLVD, NEW BERN NC 28562",1420,,,,McCarthy,Blvd,,,,,"New Bern",NC,28562,,,,
29
+ "115 ENTERPRISE COURT, GREENWOOD SC 29649",115,,,,Enterprise,Ct,,,,,Greenwood,SC,29649,,,,
30
+ "732 W 2ND ST, TIFTON GA 31794",732,,,,2nd,St,,W,,,Tifton,GA,31793,,,,"TIGER artifact"
31
+ "97 WEST OAK AVE, PANAMA CITY FL 32401",97,,,,Oak,Ave,,,,,"Panama City",FL,32401,,,,"predir is TIGER artifact"
32
+ "2276 WILTON DR, WILTON MANORS FL 33305",2276,,,,Wilton,Dr,,,,,"Fort Lauderdale",FL,33305,,,,"canonical place"
33
+ "203 SOUTH WALNUT ST, FLORENCE AL 35630",203,S,,,Walnut,St,,,,,Florence,AL,35630,,,,
34
+ "108 CENTER POINTE DR, CLARKSVILLE TN 37040",108,,,,"Center Pointe",Dr,,,,,Clarksville,TN,37040,,,,
35
+ "1800 OLD TROY RD, UNION CITY TN 38261",1800,,Old,,Troy,Rd,,,,,"Union City",TN,38261,,,,
36
+ "931 OLD SMITHVILLE HWY, MCMINNVILLE TN 37110",931,,Old,,Smithville,Rd,,,,,McMinnville,TN,37110,,,,
37
+ "1301 GREENE STREET, MARIETTA OH 45750",1301,,,,Greene,St,,,,,Marietta,OH,45750,,,,
38
+ "602 SOUTH MICHIGAN ST, SOUTH BEND IN 46601",602,S,,,Michigan,St,,,,,"South Bend",IN,46601,,,,
39
+ "500 NORTH A STREET, RICHMOND IN 47374",500,N,,,A,St,,,,,Richmond,IN,47374,,,,
40
+ "317 SOUTH DRAKE ROAD, KALAMAZOO MI 49009",317,S,,,Drake,Rd,,,,,Kalamazoo,MI,49009,,,,
41
+ "105 Amity Way, Wayne PA 19087",105,,,,Amity,Dr,,,,,Wayne,PA,19087,,,,
42
+ "305 W 45th St, New York NY 10036",305,W,,,45,St,,,,,"New York",NY,10036,,,,
43
+ "11839 Federalist Way, Fairfax VA 22030",11839,,,,Federalist,Way,,,,,Fairfax,VA,22030,,,,
44
+ "400 Monroe St, Hoboken, NJ 07030",400,,,,Monroe,St,,,,,Hoboken,NJ,07030,,,,
45
+ "101 West End Avenue, New York NY 10023",101,W,,,End,Ave,,,,,"New York",NY,10023,,,,"predir is TIGER artifact"
46
+ "2900 4TH AVE, BILLINGS MT 59101",2900,,,,4th,Ave,,N,,,Billings,MT,59101,,,,"returns 2 results"
47
+ "158 N SCOTT STREET, JOLIET IL 60432",158,N,,,Scott,St,,,,,Joliet,IL,60432,,,,
48
+ "1207 NETWORK CENTRE DR, EFFINGHAM IL 62401",1207,,,,"Network Centre",Dr,,,,,Effingham,IL,62401,,,,
49
+ "3555 SOUTHERN HILLS DR, SIOUX CITY IA 51106",3555,,,,"Southern Hills",Dr,,,,,"Sioux City",IA,51106,,,,
50
+ "300 E 3RD ST, NORTH PLATTE NE 69101",300,E,,,3rd,St,,,,,"North Platte",NE,69101,,,,
51
+ "115 N WEBB RD, GRAND ISLAND NE 68803",115,N,,,Webb,Rd,,,,,"Grand Island",NE,68803,,,,
52
+ "415 VALLEY VIEW DR, SCOTTSBLUFF NE 69361",501,,,,"Valley View",Dr,,,,,"Scotts Bluff",NE,69361,,,,"find nearest corner"
@@ -0,0 +1,57 @@
1
+ "address","number","street","city","state","zip","lon","lat","count","comment"
2
+ "93 NORTH 9TH STREET, BROOKLYN NY 11211",93,N 9th St,Brooklyn,NY,11211,-73.95892,40.720361,1,
3
+ "380 WESTMINSTER ST, PROVIDENCE RI 02903",380,Westminster St,Providence,RI,02903,-71.414872,41.82126,1,
4
+ "177 MAIN STREET, LITTLETON NH 03561",177,Main St,Littleton,NH,03561,-71.77646,44.307516,1,range
5
+ "202 HARLOW ST, BANGOR ME 04401",202,Harlow St,Bangor,ME,04401,-68.773178,44.804885,1,
6
+ "46 FRONT STREET, WATERVILLE, ME 04901",46,Front St,Waterville,ME,04901,-69.628535,44.550875,1,
7
+ "22 SUSSEX ST, HACKENSACK NJ 07601",22,Sussex St,Hackensack,NJ,07601,-74.046952,40.880046,1,
8
+ "75 OAK STREET, PATCHOGUE NY 11772",75,Oak St,Patchogue,NY,11772,-73.011289,40.76813,1,
9
+ "1 CLINTON AVE, ALBANY NY 12207",1,Clinton Ave,Albany,NY,12207,-73.748853,42.653821,1,
10
+ "7242 ROUTE 9, PLATTSBURGH NY 12901",7242,US Hwy 9,Plattsburgh,NY,12901,-73.425181,44.741501,1,
11
+ "520 5TH AVE, MCKEESPORT PA 15132",520,5th Ave,McKeesport,PA,15132,-79.861617,40.351269,1,
12
+ "122 W 3RD STREET, GREENSBURG PA 15601",122,W 3rd St,Greensburg,PA,15601,-79.545833,40.29984,1,
13
+ "901 UNIVERSITY DR, STATE COLLEGE PA 16801",901,University Dr,State College,PA,16801,-77.845018,40.797574,1,
14
+ "240 W 3RD ST, WILLIAMSPORT PA 17701",240,W 3rd St,Williamsport,PA,17701,-77.004837,41.239267,1,
15
+ "41 N 4TH ST, ALLENTOWN PA 18102",41,N 4th St,Allentown,PA,18102,-75.465652,40.604528,1,
16
+ "2221 W. MARKET STREET, POTTSVILLE PA 17901",2221,W Market St,Pottsville,PA,17901,-76.22596,40.674952,1,
17
+ "337 BRIGHTSEAT ROAD, LANDOVER MD 20785",337,Brightseat Rd,Hyattsville,MD,20785,-76.850929,38.893382,1,canonical place
18
+ "101 CHESAPEAKE BLVD, ELKTON MD 21921",103,Chesapeake Blvd,Elkton,MD,21921,-75.787244,39.605795,1,find nearest corner
19
+ "2875 SABRE ST, VIRGINIA BEACH VA 23452",2809,Sabre St,Virginia Beach,VA,23452,-76.068511,36.822897,1,find nearest corner
20
+ "324 COMMERCE ROAD, FARMVILLE VA 23901",324,Commerce St,Clarksville,VA,23927,-78.55251,36.622205,1,nearby address; might be TIGER omission
21
+ "1480 EAST MAIN STREET, WYTHEVILLE VA 24382",1168,E Main St,Wytheville,VA,24382,-81.069279,36.951346,1,nearby address; TIGER omission
22
+ "116 N JEFFERSON STREET, ROANOKE VA 24016",116,N Jefferson St,Roanoke,VA,24016,-79.940484,37.274388,1,
23
+ "50 MCDOWELL STREET, WELCH WV 24801",50,Mc Dowell St,Welch,WV,24801,-81.58558,37.433227,1,
24
+ "146 EAST FIRST AVE, WILLIAMSON WV 25661",200,E 1st Ave,Williamson,WV,25661,-82.277028,37.670255,1,find nearest corner
25
+ "1925 E MAIN ST, ALBEMARLE NC 28001",1925,E Main St,Albemarle,NC,28001,-80.16389,35.348749,1,
26
+ "1013 SPRING LANE, SANFORD NC 27330",1013,Spring Ln,Sanford,NC,27330,-79.198602,35.487517,1,
27
+ "145 ROWAN STREET, FAYETTEVILLE NC 28301",145,Rowan St,Fayetteville,NC,28301,-78.878159,35.0577,1,
28
+ "1420 MCCARTHY BLVD, NEW BERN NC 28562",1420,McCarthy Blvd,New Bern,NC,28562,-77.094959,35.097715,1,
29
+ "115 ENTERPRISE COURT, GREENWOOD SC 29649",115,Enterprise Ct,Greenwood,SC,29649,-82.165438,34.217807,1,
30
+ "732 W 2ND ST, TIFTON GA 31794",732,W 2nd St,Tifton,GA,31793,-83.529553,31.457994,1,ZIP is wrong
31
+ "97 WEST OAK AVE, PANAMA CITY FL 32401",97,W Oak Ave,Panama City,FL,32401,-85.662232,30.155214,1,
32
+ "2276 WILTON DR, WILTON MANORS FL 33305",2276,Wilton Dr,Fort Lauderdale,FL,33305,-80.137418,26.157,1,canonical place
33
+ "203 SOUTH WALNUT ST, FLORENCE AL 35630",203,S Walnut St,Florence,AL,35630,-87.671379,34.800936,1,
34
+ "108 CENTER POINTE DR, CLARKSVILLE TN 37040",108,Center Pointe Dr,Clarksville,TN,37040,-87.308915,36.569738,1,
35
+ "1800 OLD TROY RD, UNION CITY TN 38261",1800,Old Troy Rd,Union City,TN,38261,-89.093706,36.417762,1,
36
+ "931 OLD SMITHVILLE HWY, MCMINNVILLE TN 37110",931,Old Smithville Rd,McMinnville,TN,37110,-85.788226,35.701451,1,
37
+ "1301 GREENE STREET, MARIETTA OH 45750",1301,Greene St,Marietta,OH,45750,-81.424821,39.426052,1,
38
+ "602 SOUTH MICHIGAN ST, SOUTH BEND IN 46601",602,S Michigan St,South Bend,IN,46601,-86.250221,41.669598,1,
39
+ "500 NORTH A STREET, RICHMOND IN 47374",500,N A St,Richmond,IN,47374,-84.89517,39.830625,1,
40
+ "317 SOUTH DRAKE ROAD, KALAMAZOO MI 49009",317,S Drake Rd,Kalamazoo,MI,49009,-85.648231,42.289145,1,
41
+ "105 Amity Way, Wayne PA 19087",105,Amity Dr,Wayne,PA,19087,-75.455493,40.076415,1,
42
+ "305 W 45th St, New York NY 10036",305,W 45 St,New York,NY,10036,-73.988479,40.759213,1,
43
+ "11839 Federalist Way, Fairfax VA 22030",11839,Federalist Way,Fairfax,VA,22030,-77.354157,38.850052,1,
44
+ "400 Monroe St, Hoboken, NJ 07030",400,Monroe St,Hoboken,NJ,07030,-74.038949,40.742849,1,
45
+ "101 West End Avenue, New York NY 10023",101,W End Ave,New York,NY,10023,-73.98815,40.774788,1,predir is TIGER artifact
46
+ "2900 4TH AVE, BILLINGS MT 59101",2900,4th Ave S,Billings,MT,59101,-108.501942,45.776389,2,returns 2 results
47
+ "158 N SCOTT STREET, JOLIET IL 60432",158,N Scott St,Joliet,IL,60432,-88.080155,41.526524,1,
48
+ "1207 NETWORK CENTRE DR, EFFINGHAM IL 62401",1207,Network Centre Dr,Effingham,IL,62401,-88.524714,39.145835,1,
49
+ "3555 SOUTHERN HILLS DR, SIOUX CITY IA 51106",3555,Southern Hills Dr,Sioux City,IA,51106,-96.353207,42.448741,1,
50
+ "300 E 3RD ST, NORTH PLATTE NE 69101",300,E 3rd St,North Platte,NE,69101,-100.761028,41.135235,1,
51
+ "115 N WEBB RD, GRAND ISLAND NE 68803",115,N Webb Rd,Grand Island,NE,68803,-98.378432,40.917192,1,
52
+ "415 VALLEY VIEW DR, SCOTTSBLUFF NE 69361",501,Valley View Dr,Scotts Bluff,NE,69361,-103.656078,41.879011,1,find nearest corner
53
+ "4018 W Ustick Rd, Meridian ID",4413,W Ustick Rd,Nampa,ID,83687,-116.479463,43.634111,1,street
54
+ "129 E Williams Field Rd, Gilbert AZ 85295",800,E Williams Field Rd,Gilbert,AZ,85295,-111.772768,33.306601,1,street
55
+ "2518 S Pacific Hwy, Medford OR",2499,S Pacific Hwy,Medford,OR,97501,-122.849335,42.301566,1,street
56
+ "1111 River Rd Apt A17, Edgewater NJ 07020",1111,River Rd,Edgewater,NJ,07020,-73.972523,40.832584,1,FIXME: parsing
57
+ "460 West St, Amherst MA 01002-2964",460,West St,Amherst,MA,01002,-72.519936,42.341085,1,address is all abbreviations
@@ -0,0 +1,4 @@
1
+ name,address
2
+ "Home","2026 21st St. N, Arlington, VA 22201"
3
+ "Work","2200 Wilson Blvd., Arlington, VA 22201"
4
+ "RTI","1506 N Main St., Royal Oak, MI 48067"
data/tests/database.rb ADDED
@@ -0,0 +1,137 @@
1
+ $LOAD_PATH.unshift '../lib'
2
+
3
+ require 'test/unit'
4
+ require 'geocoder/us/database'
5
+ require 'csv'
6
+
7
+ Base = File.dirname(__FILE__)
8
+
9
+ module Geocoder::US
10
+ Database_File = (
11
+ (ARGV[0] and !ARGV[0].empty?) ? ARGV[0] : "../geocoderdata/geocoder.db")
12
+ end
13
+
14
+ class TestDatabase < Test::Unit::TestCase
15
+ def get_db
16
+ Geocoder::US::Database.new(Geocoder::US::Database_File, {:debug => true})
17
+
18
+ end
19
+
20
+ def get_international_db
21
+ Geocoder::US::Database.new("/Users/katechapman/Desktop/geonames1.db", {:debug => true})
22
+ end
23
+
24
+ def setup
25
+ @db = get_db
26
+ @db_intl = get_international_db
27
+ assert_not_nil @db_intl
28
+ assert_not_nil @db
29
+ end
30
+
31
+ def test_load
32
+ return if @db.nil?
33
+ assert_kind_of Geocoder::US::Database, @db
34
+ end
35
+
36
+ def test_zip
37
+ return if @db.nil?
38
+ [ {:city=>"Chicago", :zip=>"60601", :state=>"IL", :precision=>:zip,
39
+ :fips_county=>"17031", :lon=>"-87.68732", :lat=>"41.811929", :score => 0.714},
40
+ {:city=>"Philadelphia", :zip=>"19019", :state=>"PA", :precision=>:zip,
41
+ :fips_county=>"42101", :lon=>"-75.11787", :lat=>"40.001811", :score => 0.714}
42
+ ].each {|record|
43
+ result = @db.geocode(record[:zip])
44
+ assert_equal result.length, 1
45
+ record.keys.each {|key| assert_equal record[key], result[0][key]}
46
+ }
47
+
48
+ end
49
+
50
+ def test_international_place
51
+ return if @db_intl.nil?
52
+ [ {:city=>"Paris", :state=>"FR"},
53
+ {:city=>"Paris", :state=>"FR"}
54
+ ].each {|record|
55
+ result = @db_intl.geocode(record)
56
+ assert_equal result.length, 1
57
+ record.keys.each {|key| assert_equal record[key], result[0][key]}
58
+ }
59
+ end
60
+
61
+ def test_place
62
+ return if @db.nil?
63
+ [ {:city=>"Chicago", :state=>"IL", :precision=>:city, :fips_county=>"17031", :score => 0.857},
64
+ {:city=>"Philadelphia", :state=>"PA", :precision=>:city, :fips_county=>"42101", :score => 0.857}
65
+ ].each {|record|
66
+ result = @db.geocode(record[:city] + ", " + record[:state])
67
+ assert_equal result.length, 1
68
+ record.keys.each {|key| assert_equal record[key], result[0][key]}
69
+ }
70
+
71
+ end
72
+
73
+ def test_international_place
74
+ return if @db_intl.nil?
75
+ [ {:city=>"Kabul", :state=>"AF", :precision=>:city},
76
+ {:city=>"Paris", :state=>"FR", :precision=>:city}
77
+ ].each {|record|
78
+ result = @db_intl.geocode({:city => record[:city] , :state => record[:state]})
79
+ puts result
80
+ assert_equal result.length, 1
81
+ record.keys.each {|key| assert_equal record[key], result[0][key]}
82
+ }
83
+ end
84
+
85
+ def test_sample
86
+ return if @db.nil?
87
+ CSV.foreach(Base + "/data/db-test.csv", {:headers=>true}) do |row|
88
+ result = @db.geocode(row[0], true)
89
+ result[0][:count] = result.map{|a|[a[:lat], a[:lon]]}.to_set.length
90
+ fields = row.headers - ["comment", "address"]
91
+ fields.each {|f|
92
+ sample = row[f] || ""
93
+ given = result[0][f.to_sym] || ""
94
+ sample = sample.to_f if given.kind_of? Float or given.kind_of? Fixnum
95
+ assert_equal sample, given, "row: #{row.inspect}\nfield: #{f.inspect} sample: #{sample.inspect}, given: #{given.inspect}"
96
+
97
+ }
98
+ end
99
+ end
100
+
101
+ def test_should_get_street_number_correctly
102
+ result = @db.geocode("460 West St, Amherst MA 01002-2964", true)
103
+ puts "all results=#{result.inspect}"
104
+ assert_equal '460', result[0][:number]
105
+ end
106
+
107
+ def test_should_geocode_with_hash
108
+ result = @db.geocode({:street => "2200 Wilson Blvd", :city => "Arlington", :region => "VA", :postal_code => "22201"}, true)
109
+ result2 = @db.geocode("2200 Wilson Blvd, Arlington, VA 22201")
110
+ assert_equal result2,result
111
+ end
112
+
113
+ def test_should_work_with_partial_hash
114
+ result = @db.geocode({:street => "2200 Wilson Blvd", :postal_code => "22201"})
115
+ assert_equal result[0][:precision],:range
116
+ end
117
+
118
+ def test_weird_edge_case_explosion
119
+ result = @db.geocode({:street => "1410 Spring Hill Rd", :postal_code => "20221"})
120
+ result1 = @db.geocode(:street => "402 Valley View Ave", :postal_code => "12345")
121
+ assert_equal result[0][:precision],:zip
122
+ end
123
+
124
+ def test_city_state_together
125
+ result = @db.geocode({:city => "Richmond", :state => "IN"})
126
+ assert_equal result[0][:precision],:city
127
+ end
128
+
129
+ def test_state_street_together
130
+ result = @db.geocode({:region => "VA", :street => "14333 Lee Jackson Memorial Hwy"})
131
+ #assert_equal result[0][:precision],:range
132
+ end
133
+
134
+
135
+
136
+
137
+ end