geo_coder 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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