Indirizzo 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,666 @@
1
+ # coding: utf-8
2
+ require 'set'
3
+ require 'indirizzo/numbers'
4
+
5
+ module Indirizzo
6
+ class Map < Hash
7
+ # The Map class provides a two-way mapping between postal abbreviations
8
+ # and their fully written equivalents.
9
+ #attr_accessor :partial
10
+ attr_accessor :regexp
11
+ def self.[] (*items)
12
+ hash = super(*items)
13
+ #hash.build_partial
14
+ hash.build_match
15
+ hash.keys.each {|k| hash[k.downcase] = hash.fetch(k)}
16
+ hash.values.each {|v| hash[v.downcase] = v}
17
+ hash.freeze
18
+ end
19
+ # The build_partial method constructs a hash of case-insensitive,
20
+ # whitespace-delimited prefixes to keys and values in the two-way Map.
21
+ def build_partial
22
+ @partial = Set.new()
23
+ [keys, values].flatten.each {|item|
24
+ @partial << item.downcase
25
+ item.downcase.split.each {|token| @partial << token}
26
+ }
27
+ end
28
+ def build_match
29
+ @regexp = Regexp.new(
30
+ '\b(' + [keys,values].flatten.join("|") + ')\b',
31
+ Regexp::IGNORECASE)
32
+ end
33
+ # The partial? method returns true if the key is a prefix of some
34
+ # key in the Map.
35
+ def partial? (key)
36
+ @partial.member? key.downcase
37
+ end
38
+ def key? (key)
39
+ super(key.downcase)
40
+ end
41
+ def [] (key)
42
+ super(key.downcase)
43
+ end
44
+ end
45
+
46
+ # The Directional constant maps compass direction words in English and
47
+ # Spanish to their 1- or 2- letter abbreviations. See 2008 TIGER/Line
48
+ # technical documentation Appendix C for more details.
49
+ Directional = Map[
50
+ "North" => "N",
51
+ "South" => "S",
52
+ "East" => "E",
53
+ "West" => "W",
54
+ "Northeast" => "NE",
55
+ "Northwest" => "NW",
56
+ "Southeast" => "SE",
57
+ "Southwest" => "SW",
58
+ "Norte" => "N",
59
+ "Sur" => "S",
60
+ "Este" => "E",
61
+ "Oeste" => "O",
62
+ "Noreste" => "NE",
63
+ "Noroeste" => "NO",
64
+ "Sudeste" => "SE",
65
+ "Sudoeste" => "SO"
66
+ ]
67
+
68
+ # The Prefix_Qualifier constant maps feature prefix qualifiers to their
69
+ # abbreviations. See 2008 TIGER/Line technical documentation Appendix D.
70
+ Prefix_Qualifier = Map[
71
+ "Alternate" => "Alt",
72
+ "Business" => "Bus",
73
+ "Bypass" => "Byp",
74
+ "Extended" => "Exd",
75
+ "Historic" => "Hst",
76
+ "Loop" => "Lp",
77
+ "Old" => "Old",
78
+ "Private" => "Pvt",
79
+ "Public" => "Pub",
80
+ "Spur" => "Spr",
81
+ ]
82
+
83
+ # The Suffix_Qualifier constant maps feature suffix qualifiers to their
84
+ # abbreviations. See 2008 TIGER/Line technical documentation Appendix D.
85
+ Suffix_Qualifier = Map[
86
+ "Access" => "Acc",
87
+ "Alternate" => "Alt",
88
+ "Business" => "Bus",
89
+ "Bypass" => "Byp",
90
+ "Connector" => "Con",
91
+ "Extended" => "Exd",
92
+ "Extension" => "Exn",
93
+ "Loop" => "Lp",
94
+ "Private" => "Pvt",
95
+ "Public" => "Pub",
96
+ "Scenic" => "Scn",
97
+ "Spur" => "Spr",
98
+ "Ramp" => "Rmp",
99
+ "Underpass" => "Unp",
100
+ "Overpass" => "Ovp",
101
+ ]
102
+
103
+ # The Prefix_Canonical constant maps canonical TIGER/Line street type
104
+ # prefixes to their abbreviations. This list is the subset of the list from
105
+ # 2008 TIGER/Line technical documentation Appendix E that was extracted from
106
+ # a TIGER/Line database import.
107
+ Prefix_Canonical = {
108
+ "Arcade" => "Arc",
109
+ "Autopista" => "Autopista",
110
+ "Avenida" => "Ave",
111
+ "Avenue" => "Ave",
112
+ "Boulevard" => "Blvd",
113
+ "Bulevar" => "Bulevar",
114
+ "Bureau of Indian Affairs Highway" => "BIA Hwy",
115
+ "Bureau of Indian Affairs Road" => "BIA Rd",
116
+ "Bureau of Indian Affairs Route" => "BIA Rte",
117
+ "Bureau of Land Management Road" => "BLM Rd",
118
+ "Bypass" => "Byp",
119
+ "Calle" => "Cll",
120
+ "Calleja" => "Calleja",
121
+ "Callejón" => "Callejón",
122
+ "Caminito" => "Cmt",
123
+ "Camino" => "Cam",
124
+ "Carretera" => "Carr",
125
+ "Cerrada" => "Cer",
126
+ "Círculo" => "Cír",
127
+ "Commons" => "Cmns",
128
+ "Corte" => "Corte",
129
+ "County Highway" => "Co Hwy",
130
+ "County Lane" => "Co Ln",
131
+ "County Road" => "Co Rd",
132
+ "County Route" => "Co Rte",
133
+ "County State Aid Highway" => "Co St Aid Hwy",
134
+ "County Trunk Highway" => "Co Trunk Hwy",
135
+ "County Trunk Road" => "Co Trunk Rd",
136
+ "Court" => "Ct",
137
+ "Delta Road" => "Delta Rd",
138
+ "District of Columbia Highway" => "DC Hwy",
139
+ "Driveway" => "Driveway",
140
+ "Entrada" => "Ent",
141
+ "Expreso" => "Expreso",
142
+ "Expressway" => "Expy",
143
+ "Farm Road" => "Farm Rd",
144
+ "Farm-to-Market Road" => "FM",
145
+ "Fire Control Road" => "Fire Cntrl Rd",
146
+ "Fire District Road" => "Fire Dist Rd",
147
+ "Fire Lane" => "Fire Ln",
148
+ "Fire Road" => "Fire Rd",
149
+ "Fire Route" => "Fire Rte",
150
+ "Fire Trail" => "Fire Trl",
151
+ "Forest Highway" => "Forest Hwy",
152
+ "Forest Road" => "Forest Rd",
153
+ "Forest Route" => "Forest Rte",
154
+ "Forest Service Road" => "FS Rd",
155
+ "Highway" => "Hwy",
156
+ "Indian Route" => "Indian Rte",
157
+ "Indian Service Route" => "Indian Svc Rte",
158
+ "Interstate Highway" => "I-",
159
+ "Lane" => "Ln",
160
+ "Logging Road" => "Logging Rd",
161
+ "Loop" => "Loop",
162
+ "National Forest Development Road" => "Nat For Dev Rd",
163
+ "Navajo Service Route" => "Navajo Svc Rte",
164
+ "Parish Road" => "Parish Rd",
165
+ "Pasaje" => "Pasaje",
166
+ "Paseo" => "Pso",
167
+ "Passage" => "Psge",
168
+ "Placita" => "Pla",
169
+ "Plaza" => "Plz",
170
+ "Point" => "Pt",
171
+ "Puente" => "Puente",
172
+ "Ranch Road" => "Ranch Rd",
173
+ "Ranch to Market Road" => "RM",
174
+ "Reservation Highway" => "Resvn Hwy",
175
+ "Road" => "Rd",
176
+ "Route" => "Rte",
177
+ "Row" => "Row",
178
+ "Rue" => "Rue",
179
+ "Ruta" => "Ruta",
180
+ "Sector" => "Sec",
181
+ "Sendero" => "Sendero",
182
+ "Service Road" => "Svc Rd",
183
+ "Skyway" => "Skwy",
184
+ "Square" => "Sq",
185
+ "State Forest Service Road" => "St FS Rd",
186
+ "State Highway" => "State Hwy",
187
+ "State Loop" => "State Loop",
188
+ "State Road" => "State Rd",
189
+ "State Route" => "State Rte",
190
+ "State Spur" => "State Spur",
191
+ "State Trunk Highway" => "St Trunk Hwy",
192
+ "Terrace" => "Ter",
193
+ "Town Highway" => "Town Hwy",
194
+ "Town Road" => "Town Rd",
195
+ "Township Highway" => "Twp Hwy",
196
+ "Township Road" => "Twp Rd",
197
+ "Trail" => "Trl",
198
+ "Tribal Road" => "Tribal Rd",
199
+ "Tunnel" => "Tunl",
200
+ "US Forest Service Highway" => "USFS Hwy",
201
+ "US Forest Service Road" => "USFS Rd",
202
+ "US Highway" => "US Hwy",
203
+ "US Route" => "US Rte",
204
+ "Vereda" => "Ver",
205
+ "Via" => "Via",
206
+ "Vista" => "Vis",
207
+ }
208
+
209
+ # The Prefix_Alternate constant maps alternate prefix street types to
210
+ # their canonical abbreviations. This list was merged in from the USPS
211
+ # list at http://www.usps.com/ncsc/lookups/abbr_suffix.txt.
212
+ Prefix_Alternate = {
213
+ "Av" => "Ave",
214
+ "Aven" => "Ave",
215
+ "Avenu" => "Ave",
216
+ "Avenue" => "Ave",
217
+ "Avn" => "Ave",
218
+ "Avnue" => "Ave",
219
+ "Boul" => "Blvd",
220
+ "Boulv" => "Blvd",
221
+ "Bypa" => "Byp",
222
+ "Bypas" => "Byp",
223
+ "Byps" => "Byp",
224
+ "Crt" => "Ct",
225
+ "Exp" => "Expy",
226
+ "Expr" => "Expy",
227
+ "Express" => "Expy",
228
+ "Expw" => "Expy",
229
+ "Highwy" => "Hwy",
230
+ "Hiway" => "Hwy",
231
+ "Hiwy" => "Hwy",
232
+ "Hway" => "Hwy",
233
+ #"La" => "Ln", # causes problems with Spanglish place names
234
+ "Lanes" => "Ln",
235
+ "Loops" => "Loop",
236
+ "Plza" => "Plz",
237
+ "Sqr" => "Sq",
238
+ "Sqre" => "Sq",
239
+ "Squ" => "Sq",
240
+ "Terr" => "Ter",
241
+ "Tr" => "Trl",
242
+ "Trails" => "Trl",
243
+ "Trls" => "Trl",
244
+ "Tunel" => "Tunl",
245
+ "Tunls" => "Tunl",
246
+ "Tunnels" => "Tunl",
247
+ "Tunnl" => "Tunl",
248
+ "Vdct" => "Via",
249
+ "Viadct" => "Via",
250
+ "Viaduct" => "Via",
251
+ "Vist" => "Vis",
252
+ "Vst" => "Vis",
253
+ "Vsta" => "Vis"
254
+ }
255
+
256
+ # The Prefix_Type constant merges the canonical prefix type abbreviations
257
+ # with their USPS accepted alternates.
258
+ Prefix_Type = Map[ Prefix_Canonical.merge(Prefix_Alternate) ]
259
+
260
+ # The Suffix_Canonical constant maps canonical TIGER/Line street type
261
+ # suffixes to their abbreviations. This list is the subset of the list from
262
+ # 2008 TIGER/Line technical documentation Appendix E that was extracted from
263
+ # a TIGER/Line database import.
264
+ Suffix_Canonical = {
265
+ "Alley" => "Aly",
266
+ "Arcade" => "Arc",
267
+ "Avenida" => "Ave",
268
+ "Avenue" => "Ave",
269
+ "Beltway" => "Beltway",
270
+ "Boulevard" => "Blvd",
271
+ "Bridge" => "Brg",
272
+ "Bypass" => "Byp",
273
+ "Causeway" => "Cswy",
274
+ "Circle" => "Cir",
275
+ "Common" => "Cmn",
276
+ "Commons" => "Cmns",
277
+ "Corners" => "Cors",
278
+ "Court" => "Ct",
279
+ "Courts" => "Cts",
280
+ "Crescent" => "Cres",
281
+ "Crest" => "Crst",
282
+ "Crossing" => "Xing",
283
+ "Cutoff" => "Cutoff",
284
+ "Drive" => "Dr",
285
+ "Driveway" => "Driveway",
286
+ "Esplanade" => "Esplanade",
287
+ "Estates" => "Ests",
288
+ "Expressway" => "Expy",
289
+ "Forest Highway" => "Forest Hwy",
290
+ "Fork" => "Frk",
291
+ "Four-Wheel Drive Trail" => "4WD Trl",
292
+ "Freeway" => "Fwy",
293
+ "Grade" => "Grade",
294
+ "Heights" => "Hts",
295
+ "Highway" => "Hwy",
296
+ "Jeep Trail" => "Jeep Trl",
297
+ "Landing" => "Lndg",
298
+ "Lane" => "Ln",
299
+ "Logging Road" => "Logging Rd",
300
+ "Loop" => "Loop",
301
+ "Motorway" => "Mtwy",
302
+ "Oval" => "Oval",
303
+ "Overpass" => "Opas",
304
+ "Parkway" => "Pkwy",
305
+ "Pass" => "Pass",
306
+ "Passage" => "Psge",
307
+ "Path" => "Path",
308
+ "Pike" => "Pike",
309
+ "Place" => "Pl",
310
+ "Plaza" => "Plz",
311
+ "Point" => "Pt",
312
+ "Pointe" => "Pointe",
313
+ "Promenade" => "Promenade",
314
+ "Railroad" => "RR",
315
+ "Railway" => "Rlwy",
316
+ "Ramp" => "Ramp",
317
+ "River" => "Riv",
318
+ "Road" => "Rd",
319
+ "Roadway" => "Roadway",
320
+ "Route" => "Rte",
321
+ "Row" => "Row",
322
+ "Rue" => "Rue",
323
+ "Service Road" => "Svc Rd",
324
+ "Skyway" => "Skwy",
325
+ "Spur" => "Spur",
326
+ "Square" => "Sq",
327
+ "Stravenue" => "Stra",
328
+ "Street" => "St",
329
+ "Strip" => "Strip",
330
+ "Terrace" => "Ter",
331
+ "Thoroughfare" => "Thoroughfare",
332
+ "Tollway" => "Tollway",
333
+ "Trace" => "Trce",
334
+ "Trafficway" => "Trfy",
335
+ "Trail" => "Trl",
336
+ "Trolley" => "Trolley",
337
+ "Truck Trail" => "Truck Trl",
338
+ "Tunnel" => "Tunl",
339
+ "Turnpike" => "Tpke",
340
+ "Viaduct" => "Viaduct",
341
+ "View" => "Vw",
342
+ "Vista" => "Vis",
343
+ "Walk" => "Walk",
344
+ "Walkway" => "Walkway",
345
+ "Way" => "Way",
346
+ }
347
+
348
+ # The Suffix_Alternate constant maps alternate suffix street types to
349
+ # their canonical abbreviations. This list was merged in from the USPS
350
+ # list at http://www.usps.com/ncsc/lookups/abbr_suffix.txt.
351
+ Suffix_Alternate = {
352
+ "Allee" => "Aly",
353
+ "Ally" => "Aly",
354
+ "Av" => "Ave",
355
+ "Aven" => "Ave",
356
+ "Avenu" => "Ave",
357
+ "Avenue" => "Ave",
358
+ "Avn" => "Ave",
359
+ "Avnue" => "Ave",
360
+ "Boul" => "Blvd",
361
+ "Boulv" => "Blvd",
362
+ "Brdge" => "Brg",
363
+ "Bypa" => "Byp",
364
+ "Bypas" => "Byp",
365
+ "Byps" => "Byp",
366
+ "Causway" => "Cswy",
367
+ "Circ" => "Cir",
368
+ "Circl" => "Cir",
369
+ "Crcl" => "Cir",
370
+ "Crcle" => "Cir",
371
+ "Crecent" => "Cres",
372
+ "Cresent" => "Cres",
373
+ "Crscnt" => "Cres",
374
+ "Crsent" => "Cres",
375
+ "Crsnt" => "Cres",
376
+ "Crssing" => "Xing",
377
+ "Crssng" => "Xing",
378
+ "Crt" => "Ct",
379
+ "Driv" => "Dr",
380
+ "Drv" => "Dr",
381
+ "Exp" => "Expy",
382
+ "Expr" => "Expy",
383
+ "Express" => "Expy",
384
+ "Expw" => "Expy",
385
+ "Freewy" => "Fwy",
386
+ "Frway" => "Fwy",
387
+ "Frwy" => "Fwy",
388
+ "Height" => "Hts",
389
+ "Hgts" => "Hts",
390
+ "Highwy" => "Hwy",
391
+ "Hiway" => "Hwy",
392
+ "Hiwy" => "Hwy",
393
+ "Ht" => "Hts",
394
+ "Hway" => "Hwy",
395
+ "La" => "Ln",
396
+ "Lanes" => "Ln",
397
+ "Lndng" => "Lndg",
398
+ "Loops" => "Loop",
399
+ "Ovl" => "Oval",
400
+ "Parkways" => "Pkwy",
401
+ "Parkwy" => "Pkwy",
402
+ "Paths" => "Path",
403
+ "Pikes" => "Pike",
404
+ "Pkway" => "Pkwy",
405
+ "Pkwys" => "Pkwy",
406
+ "Pky" => "Pkwy",
407
+ "Plza" => "Plz",
408
+ "Rivr" => "Riv",
409
+ "Rvr" => "Riv",
410
+ "Spurs" => "Spur",
411
+ "Sqr" => "Sq",
412
+ "Sqre" => "Sq",
413
+ "Squ" => "Sq",
414
+ "Str" => "St",
415
+ "Strav" => "Stra",
416
+ "Strave" => "Stra",
417
+ "Straven" => "Stra",
418
+ "Stravn" => "Stra",
419
+ "Strt" => "St",
420
+ "Strvn" => "Stra",
421
+ "Strvnue" => "Stra",
422
+ "Terr" => "Ter",
423
+ "Tpk" => "Tpke",
424
+ "Tr" => "Trl",
425
+ "Traces" => "Trce",
426
+ "Trails" => "Trl",
427
+ "Trls" => "Trl",
428
+ "Trnpk" => "Tpke",
429
+ "Trpk" => "Tpke",
430
+ "Tunel" => "Tunl",
431
+ "Tunls" => "Tunl",
432
+ "Tunnels" => "Tunl",
433
+ "Tunnl" => "Tunl",
434
+ "Turnpk" => "Tpke",
435
+ "Vist" => "Vis",
436
+ "Vst" => "Vis",
437
+ "Vsta" => "Vis",
438
+ "Walks" => "Walk",
439
+ "Wy" => "Way",
440
+ }
441
+
442
+ # The Suffix_Type constant merges the canonical suffix type abbreviations
443
+ # with their USPS accepted alternates.
444
+ Suffix_Type = Map[ Suffix_Canonical.merge(Suffix_Alternate) ]
445
+
446
+ # The Unit_Type constant lists acceptable USPS unit type abbreviations
447
+ # from http://www.usps.com/ncsc/lookups/abbr_sud.txt.
448
+ Unit_Type = Map[
449
+ "Apartment" => "Apt",
450
+ "Basement" => "Bsmt",
451
+ "Building" => "Bldg",
452
+ "Department"=> "Dept",
453
+ "Floor" => "Fl",
454
+ "Front" => "Frnt",
455
+ "Hangar" => "Hngr",
456
+ "Lobby" => "Lbby",
457
+ "Lot" => "Lot",
458
+ "Lower" => "Lowr",
459
+ "Office" => "Ofc",
460
+ "Penthouse" => "Ph",
461
+ "Pier" => "Pier",
462
+ "Rear" => "Rear",
463
+ "Room" => "Rm",
464
+ "Side" => "Side",
465
+ "Slip" => "Slip",
466
+ "Space" => "Spc",
467
+ "Stop" => "Stop",
468
+ "Suite" => "Ste",
469
+ "Trailer" => "Trlr",
470
+ "Unit" => "Unit",
471
+ "Upper" => "Uppr",
472
+ ]
473
+
474
+ Std_Abbr = Map[
475
+ [Directional, Prefix_Qualifier, Suffix_Qualifier,
476
+ Prefix_Type, Suffix_Type].inject({}) {|x,y|x.merge y}
477
+ ]
478
+
479
+ # The Name_Abbr constant maps common toponym abbreviations to their
480
+ # full word equivalents. This list was constructed partly by hand, and
481
+ # partly by matching USPS alternate abbreviations with feature names
482
+ # found in the TIGER/Line dataset.
483
+ Name_Abbr = Map[
484
+ "Av" => "Avenue",
485
+ "Ave" => "Avenue",
486
+ "Blvd" => "Boulevard",
487
+ "Bot" => "Bottom",
488
+ "Boul" => "Boulevard",
489
+ "Boulv" => "Boulevard",
490
+ "Br" => "Branch",
491
+ "Brg" => "Bridge",
492
+ "Canyn" => "Canyon",
493
+ "Cen" => "Center",
494
+ "Cent" => "Center",
495
+ "Cir" => "Circle",
496
+ "Circ" => "Circle",
497
+ "Ck" => "Creek",
498
+ "Cnter" => "Center",
499
+ "Cntr" => "Center",
500
+ "Cnyn" => "Canyon",
501
+ "Cor" => "Corner",
502
+ "Cors" => "Corners",
503
+ "Cp" => "Camp",
504
+ "Cr" => "Creek",
505
+ "Crcl" => "Circle",
506
+ "Crcle" => "Circle",
507
+ "Cres" => "Crescent",
508
+ "Crscnt" => "Crescent",
509
+ "Ct" => "Court",
510
+ "Ctr" => "Center",
511
+ "Cts" => "Courts",
512
+ "Cyn" => "Canyon",
513
+ "Div" => "Divide",
514
+ "Dr" => "Drive",
515
+ "Dv" => "Divide",
516
+ "Est" => "Estate",
517
+ "Ests" => "Estates",
518
+ "Ext" => "Extension",
519
+ "Extn" => "Extension",
520
+ "Extnsn" => "Extension",
521
+ "Forests" => "Forest",
522
+ "Forg" => "Forge",
523
+ "Frg" => "Forge",
524
+ "Ft" => "Fort",
525
+ "Gatewy" => "Gateway",
526
+ "Gdn" => "Garden",
527
+ "Gdns" => "Gardens",
528
+ "Gtwy" => "Gateway",
529
+ "Harb" => "Harbor",
530
+ "Hbr" => "Harbor",
531
+ "Height" => "Heights",
532
+ "Hgts" => "Heights",
533
+ "Highwy" => "Highway",
534
+ "Hiway" => "Highway",
535
+ "Hiwy" => "Highway",
536
+ "Holws" => "Hollow",
537
+ "Ht" => "Heights",
538
+ "Hway" => "Highway",
539
+ "Hwy" => "Highway",
540
+ "Is" => "Island",
541
+ "Iss" => "Islands",
542
+ "Jct" => "Junction",
543
+ "Jction" => "Junction",
544
+ "Jctn" => "Junction",
545
+ "Junctn" => "Junction",
546
+ "Juncton" => "Junction",
547
+ "Ldg" => "Lodge",
548
+ "Lgt" => "Light",
549
+ "Lndg" => "Landing",
550
+ "Lodg" => "Lodge",
551
+ "Loops" => "Loop",
552
+ "Mt" => "Mount",
553
+ "Mtin" => "Mountain",
554
+ "Mtn" => "Mountain",
555
+ "Orch" => "Orchard",
556
+ "Parkwy" => "Parkway",
557
+ "Pk" => "Park",
558
+ "Pkway" => "Parkway",
559
+ "Pkwy" => "Parkway",
560
+ "Pky" => "Parkway",
561
+ "Pl" => "Place",
562
+ "Pnes" => "Pines",
563
+ "Pr" => "Prairie",
564
+ "Prr" => "Prairie",
565
+ "Pt" => "Point",
566
+ "Pts" => "Points",
567
+ "Rdg" => "Ridge",
568
+ "Riv" => "River",
569
+ "Rnchs" => "Ranch",
570
+ "Spg" => "Spring",
571
+ "Spgs" => "Springs",
572
+ "Spng" => "Spring",
573
+ "Spngs" => "Springs",
574
+ "Sq" => "Square",
575
+ "Squ" => "Square",
576
+ # "St" => "Saint",
577
+ "Sta" => "Station",
578
+ "Statn" => "Station",
579
+ "Ste" => "Sainte",
580
+ "Stn" => "Station",
581
+ "Str" => "Street",
582
+ "Ter" => "Terrace",
583
+ "Terr" => "Terrace",
584
+ "Tpk" => "Turnpike",
585
+ "Tpke" => "Turnpike",
586
+ "Tr" => "Trail",
587
+ "Trls" => "Trail",
588
+ "Trpk" => "Turnpike",
589
+ "Tunls" => "Tunnel",
590
+ "Un" => "Union",
591
+ "Vill" => "Village",
592
+ "Villag" => "Village",
593
+ "Villg" => "Village",
594
+ "Vis" => "Vista",
595
+ "Vlg" => "Village",
596
+ "Vlgs" => "Villages",
597
+ "Wls" => "Wells",
598
+ "Wy" => "Way",
599
+ "Xing" => "Crossing",
600
+ ]
601
+
602
+ # The State constant maps US state and territory names to their 2-letter
603
+ # USPS abbreviations.
604
+ State = Map[
605
+ "Alabama" => "AL",
606
+ "Alaska" => "AK",
607
+ "American Samoa" => "AS",
608
+ "Arizona" => "AZ",
609
+ "Arkansas" => "AR",
610
+ "California" => "CA",
611
+ "Colorado" => "CO",
612
+ "Connecticut" => "CT",
613
+ "Delaware" => "DE",
614
+ "District of Columbia" => "DC",
615
+ "Federated States of Micronesia" => "FM",
616
+ "Florida" => "FL",
617
+ "Georgia" => "GA",
618
+ "Guam" => "GU",
619
+ "Hawaii" => "HI",
620
+ "Idaho" => "ID",
621
+ "Illinois" => "IL",
622
+ "Indiana" => "IN",
623
+ "Iowa" => "IA",
624
+ "Kansas" => "KS",
625
+ "Kentucky" => "KY",
626
+ "Louisiana" => "LA",
627
+ "Maine" => "ME",
628
+ "Marshall Islands" => "MH",
629
+ "Maryland" => "MD",
630
+ "Massachusetts" => "MA",
631
+ "Michigan" => "MI",
632
+ "Minnesota" => "MN",
633
+ "Mississippi" => "MS",
634
+ "Missouri" => "MO",
635
+ "Montana" => "MT",
636
+ "Nebraska" => "NE",
637
+ "Nevada" => "NV",
638
+ "New Hampshire" => "NH",
639
+ "New Jersey" => "NJ",
640
+ "New Mexico" => "NM",
641
+ "New York" => "NY",
642
+ "North Carolina" => "NC",
643
+ "North Dakota" => "ND",
644
+ "Northern Mariana Islands" => "MP",
645
+ "Ohio" => "OH",
646
+ "Oklahoma" => "OK",
647
+ "Oregon" => "OR",
648
+ "Palau" => "PW",
649
+ "Pennsylvania" => "PA",
650
+ "Puerto Rico" => "PR",
651
+ "Rhode Island" => "RI",
652
+ "South Carolina" => "SC",
653
+ "South Dakota" => "SD",
654
+ "Tennessee" => "TN",
655
+ "Texas" => "TX",
656
+ "Utah" => "UT",
657
+ "Vermont" => "VT",
658
+ "Virgin Islands" => "VI",
659
+ "Virginia" => "VA",
660
+ "Washington" => "WA",
661
+ "West Virginia" => "WV",
662
+ "Wisconsin" => "WI",
663
+ "Wyoming" => "WY"
664
+ ]
665
+
666
+ end