interior 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/README.md +461 -0
- data/Rakefile +10 -0
- data/interior.gemspec +25 -0
- data/lib/interior/geocoder.rb +51 -0
- data/lib/interior/response.rb +10 -0
- data/lib/interior/version.rb +3 -0
- data/lib/interior.rb +2 -0
- data/maps/meridians.jpg +0 -0
- data/maps/meridians_small.jpg +0 -0
- data/spec/fixtures/az.xml +24 -0
- data/spec/fixtures/co.xml +24 -0
- data/spec/lib/interior/geocoder_spec.rb +122 -0
- data/spec/lib/interior/response_spec.rb +28 -0
- data/spec/spec_helper.rb +3 -0
- metadata +127 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm ruby-1.8.7-p352@interior
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,461 @@
|
|
1
|
+
Interior
|
2
|
+
========
|
3
|
+
|
4
|
+
Township GeoCoder Web Service
|
5
|
+
-----------------------------
|
6
|
+
This gem uses the GeoCommunicator GeoCoder Web Service provided by the
|
7
|
+
[US Department of the Interior](http://www.geocommunicator.gov/GeoComm/lsis_home/townshipdecoder/index.htm).
|
8
|
+
For detailed documentation on the web service API, consult the
|
9
|
+
[Methods, Parameters, and Results PDF](http://www.blm.gov/nils/GeoComm/documents/NILS_GeoCommunicator_Web_Services_TGC_Formats.pdf).
|
10
|
+
|
11
|
+
US Meridian Map
|
12
|
+
---------------
|
13
|
+
The US is divided into several meridians. A [larger map](https://github.com/climate/interior/raw/master/maps/meridians.jpg)
|
14
|
+
is also available for reference.
|
15
|
+
|
16
|
+
![USA Meridians](https://github.com/climate/interior/raw/master/maps/meridians_small.jpg "USA Meridians")
|
17
|
+
|
18
|
+
Each meridian has a corresponding numeric key mapping:
|
19
|
+
|
20
|
+
<table>
|
21
|
+
<tr>
|
22
|
+
<th>State</th>
|
23
|
+
<th>Meridian</th>
|
24
|
+
<th>Code</th>
|
25
|
+
</tr>
|
26
|
+
<tr>
|
27
|
+
<td>AL</td>
|
28
|
+
<td>HUNTSVILLE MER</td>
|
29
|
+
<td>16</td>
|
30
|
+
</tr>
|
31
|
+
<tr>
|
32
|
+
<td>AL</td>
|
33
|
+
<td>ST. STEPHENS MER</td>
|
34
|
+
<td>25</td>
|
35
|
+
</tr>
|
36
|
+
<tr>
|
37
|
+
<td>AL</td>
|
38
|
+
<td>TALLAHASEE MER</td>
|
39
|
+
<td>29</td>
|
40
|
+
</tr>
|
41
|
+
<tr>
|
42
|
+
<td>AR</td>
|
43
|
+
<td>5TH PM</td>
|
44
|
+
<td>05</td>
|
45
|
+
</tr>
|
46
|
+
<tr>
|
47
|
+
<td>AZ</td>
|
48
|
+
<td>GILA-SALT RIVER MER</td>
|
49
|
+
<td>14</td>
|
50
|
+
</tr>
|
51
|
+
<tr>
|
52
|
+
<td>AZ</td>
|
53
|
+
<td>NAVAJO MER</td>
|
54
|
+
<td>22</td>
|
55
|
+
</tr>
|
56
|
+
<tr>
|
57
|
+
<td>AZ</td>
|
58
|
+
<td>SAN BERNARDINO MER</td>
|
59
|
+
<td>27</td>
|
60
|
+
</tr>
|
61
|
+
<tr>
|
62
|
+
<td>CA</td>
|
63
|
+
<td>GILA-SALT RIVER MER</td>
|
64
|
+
<td>14</td>
|
65
|
+
</tr>
|
66
|
+
<tr>
|
67
|
+
<td>CA</td>
|
68
|
+
<td>HUMBOLDT MER</td>
|
69
|
+
<td>15</td>
|
70
|
+
</tr>
|
71
|
+
<tr>
|
72
|
+
<td>CA</td>
|
73
|
+
<td>MOUNT DIABLO MER</td>
|
74
|
+
<td>21</td>
|
75
|
+
</tr>
|
76
|
+
<tr>
|
77
|
+
<td>CA</td>
|
78
|
+
<td>SAN BERNARDINO MER</td>
|
79
|
+
<td>27</td>
|
80
|
+
</tr>
|
81
|
+
<tr>
|
82
|
+
<td>CO</td>
|
83
|
+
<td>6TH PM</td>
|
84
|
+
<td>06</td>
|
85
|
+
</tr>
|
86
|
+
<tr>
|
87
|
+
<td>CO</td>
|
88
|
+
<td>NEW MEX PM</td>
|
89
|
+
<td>23</td>
|
90
|
+
</tr>
|
91
|
+
<tr>
|
92
|
+
<td>CO</td>
|
93
|
+
<td>UTE MER</td>
|
94
|
+
<td>31</td>
|
95
|
+
</tr>
|
96
|
+
<tr>
|
97
|
+
<td>CT</td>
|
98
|
+
<td>CONNECTICUT</td>
|
99
|
+
<td>CT</td>
|
100
|
+
</tr>
|
101
|
+
<tr>
|
102
|
+
<td>DE</td>
|
103
|
+
<td>DELAWARE</td>
|
104
|
+
<td>DE</td>
|
105
|
+
</tr>
|
106
|
+
<tr>
|
107
|
+
<td>FL</td>
|
108
|
+
<td>TALLAHASEE MER</td>
|
109
|
+
<td>29</td>
|
110
|
+
</tr>
|
111
|
+
<tr>
|
112
|
+
<td>GA</td>
|
113
|
+
<td>GEORGIA</td>
|
114
|
+
<td>GA</td>
|
115
|
+
</tr>
|
116
|
+
<tr>
|
117
|
+
<td>IA</td>
|
118
|
+
<td>5TH PM</td>
|
119
|
+
<td>05</td>
|
120
|
+
</tr>
|
121
|
+
<tr>
|
122
|
+
<td>ID</td>
|
123
|
+
<td>BOISE MER</td>
|
124
|
+
<td>08</td>
|
125
|
+
</tr>
|
126
|
+
<tr>
|
127
|
+
<td>IL</td>
|
128
|
+
<td>2ND PM</td>
|
129
|
+
<td>02</td>
|
130
|
+
</tr>
|
131
|
+
<tr>
|
132
|
+
<td>IL</td>
|
133
|
+
<td>3RD PM</td>
|
134
|
+
<td>03</td>
|
135
|
+
</tr>
|
136
|
+
<tr>
|
137
|
+
<td>IL</td>
|
138
|
+
<td>4TH PM ILLINOIS</td>
|
139
|
+
<td>04</td>
|
140
|
+
</tr>
|
141
|
+
<tr>
|
142
|
+
<td>IN</td>
|
143
|
+
<td>1ST PM</td>
|
144
|
+
<td>01</td>
|
145
|
+
</tr>
|
146
|
+
<tr>
|
147
|
+
<td>IN</td>
|
148
|
+
<td>2ND PM</td>
|
149
|
+
<td>02</td>
|
150
|
+
</tr>
|
151
|
+
<tr>
|
152
|
+
<td>KS</td>
|
153
|
+
<td>6TH PM</td>
|
154
|
+
<td>06</td>
|
155
|
+
</tr>
|
156
|
+
<tr>
|
157
|
+
<td>KY</td>
|
158
|
+
<td>KENTUCKY</td>
|
159
|
+
<td>KY</td>
|
160
|
+
</tr>
|
161
|
+
<tr>
|
162
|
+
<td>LA</td>
|
163
|
+
<td>LOUISIANA MER</td>
|
164
|
+
<td>18</td>
|
165
|
+
</tr>
|
166
|
+
<tr>
|
167
|
+
<td>LA</td>
|
168
|
+
<td>ST. HELENA MER</td>
|
169
|
+
<td>24</td>
|
170
|
+
</tr>
|
171
|
+
<tr>
|
172
|
+
<td>MA</td>
|
173
|
+
<td>MASSACHUSETS</td>
|
174
|
+
<td>MA</td>
|
175
|
+
</tr>
|
176
|
+
<tr>
|
177
|
+
<td>MD</td>
|
178
|
+
<td>MARYLAND</td>
|
179
|
+
<td>MD</td>
|
180
|
+
</tr>
|
181
|
+
<tr>
|
182
|
+
<td>ME</td>
|
183
|
+
<td>MAINE</td>
|
184
|
+
<td>ME</td>
|
185
|
+
</tr>
|
186
|
+
<tr>
|
187
|
+
<td>MI</td>
|
188
|
+
<td>MICHIGAN MER</td>
|
189
|
+
<td>19</td>
|
190
|
+
</tr>
|
191
|
+
<tr>
|
192
|
+
<td>MN</td>
|
193
|
+
<td>5TH PM</td>
|
194
|
+
<td>05</td>
|
195
|
+
</tr>
|
196
|
+
<tr>
|
197
|
+
<td>MN</td>
|
198
|
+
<td>4TH PM MN-WI</td>
|
199
|
+
<td>46</td>
|
200
|
+
</tr>
|
201
|
+
<tr>
|
202
|
+
<td>MO</td>
|
203
|
+
<td>5TH PM</td>
|
204
|
+
<td>05</td>
|
205
|
+
</tr>
|
206
|
+
<tr>
|
207
|
+
<td>MS</td>
|
208
|
+
<td>CHICKASAW MER</td>
|
209
|
+
<td>09</td>
|
210
|
+
</tr>
|
211
|
+
<tr>
|
212
|
+
<td>MS</td>
|
213
|
+
<td>CHOCTAW MER</td>
|
214
|
+
<td>10</td>
|
215
|
+
</tr>
|
216
|
+
<tr>
|
217
|
+
<td>MS</td>
|
218
|
+
<td>HUNTSVILLE MER</td>
|
219
|
+
<td>16</td>
|
220
|
+
</tr>
|
221
|
+
<tr>
|
222
|
+
<td>MS</td>
|
223
|
+
<td>ST. STEPHENS MER</td>
|
224
|
+
<td>25</td>
|
225
|
+
</tr>
|
226
|
+
<tr>
|
227
|
+
<td>MS</td>
|
228
|
+
<td>WASHINGTON MER</td>
|
229
|
+
<td>32</td>
|
230
|
+
</tr>
|
231
|
+
<tr>
|
232
|
+
<td>MT</td>
|
233
|
+
<td>PRIN MER, MT</td>
|
234
|
+
<td>20</td>
|
235
|
+
</tr>
|
236
|
+
<tr>
|
237
|
+
<td>NC</td>
|
238
|
+
<td>NO CAROLINA</td>
|
239
|
+
<td>NC</td>
|
240
|
+
</tr>
|
241
|
+
<tr>
|
242
|
+
<td>ND</td>
|
243
|
+
<td>5TH PM</td>
|
244
|
+
<td>05</td>
|
245
|
+
</tr>
|
246
|
+
<tr>
|
247
|
+
<td>NE</td>
|
248
|
+
<td>6TH PM</td>
|
249
|
+
<td>06</td>
|
250
|
+
</tr>
|
251
|
+
<tr>
|
252
|
+
<td>NH</td>
|
253
|
+
<td>NEW HAMPSHIRE</td>
|
254
|
+
<td>NH</td>
|
255
|
+
</tr>
|
256
|
+
<tr>
|
257
|
+
<td>NJ</td>
|
258
|
+
<td>NEW JERSEY</td>
|
259
|
+
<td>NJ</td>
|
260
|
+
</tr>
|
261
|
+
<tr>
|
262
|
+
<td>NM</td>
|
263
|
+
<td>NEW MEX PM</td>
|
264
|
+
<td>23</td>
|
265
|
+
</tr>
|
266
|
+
<tr>
|
267
|
+
<td>NV</td>
|
268
|
+
<td>MOUNT DIABLO MER</td>
|
269
|
+
<td>21</td>
|
270
|
+
</tr>
|
271
|
+
<tr>
|
272
|
+
<td>NV</td>
|
273
|
+
<td>SAN BERNARDINO MER</td>
|
274
|
+
<td>27</td>
|
275
|
+
</tr>
|
276
|
+
<tr>
|
277
|
+
<td>NY</td>
|
278
|
+
<td>NEW YORK</td>
|
279
|
+
<td>NY</td>
|
280
|
+
</tr>
|
281
|
+
<tr>
|
282
|
+
<td>OH</td>
|
283
|
+
<td>1ST PM</td>
|
284
|
+
<td>01</td>
|
285
|
+
</tr>
|
286
|
+
<tr>
|
287
|
+
<td>OH</td>
|
288
|
+
<td>MICHIGAN MER</td>
|
289
|
+
<td>19</td>
|
290
|
+
</tr>
|
291
|
+
<tr>
|
292
|
+
<td>OH</td>
|
293
|
+
<td>OHIO RIVER SURVEY</td>
|
294
|
+
<td>35</td>
|
295
|
+
</tr>
|
296
|
+
<tr>
|
297
|
+
<td>OH</td>
|
298
|
+
<td>BETWEEN THE MIAMIS</td>
|
299
|
+
<td>36</td>
|
300
|
+
</tr>
|
301
|
+
<tr>
|
302
|
+
<td>OH</td>
|
303
|
+
<td>MUSKINGUM RIVER BASIN</td>
|
304
|
+
<td>37</td>
|
305
|
+
</tr>
|
306
|
+
<tr>
|
307
|
+
<td>OH</td>
|
308
|
+
<td>OHIO RIVER BASIN</td>
|
309
|
+
<td>38</td>
|
310
|
+
</tr>
|
311
|
+
<tr>
|
312
|
+
<td>OH</td>
|
313
|
+
<td>1ST SCIOTO RIVER BASE</td>
|
314
|
+
<td>39</td>
|
315
|
+
</tr>
|
316
|
+
<tr>
|
317
|
+
<td>OH</td>
|
318
|
+
<td>2ND SCIOTO RIVER BASE</td>
|
319
|
+
<td>40</td>
|
320
|
+
</tr>
|
321
|
+
<tr>
|
322
|
+
<td>OH</td>
|
323
|
+
<td>3RD SCIOTO RIVER BASE</td>
|
324
|
+
<td>41</td>
|
325
|
+
</tr>
|
326
|
+
<tr>
|
327
|
+
<td>OH</td>
|
328
|
+
<td>TWELVE MILE SQUARE</td>
|
329
|
+
<td>43</td>
|
330
|
+
</tr>
|
331
|
+
<tr>
|
332
|
+
<td>OH</td>
|
333
|
+
<td>WEST OF GREAT MIAMI</td>
|
334
|
+
<td>47</td>
|
335
|
+
</tr>
|
336
|
+
<tr>
|
337
|
+
<td>OH</td>
|
338
|
+
<td>US MILITARY SURVEY</td>
|
339
|
+
<td>48</td>
|
340
|
+
</tr>
|
341
|
+
<tr>
|
342
|
+
<td>OH</td>
|
343
|
+
<td>CT WEST RES-OHIO</td>
|
344
|
+
<td>91</td>
|
345
|
+
</tr>
|
346
|
+
<tr>
|
347
|
+
<td>OH</td>
|
348
|
+
<td>OHIO CO PUR-OHIO</td>
|
349
|
+
<td>92</td>
|
350
|
+
</tr>
|
351
|
+
<tr>
|
352
|
+
<td>OH</td>
|
353
|
+
<td>VA MILITARY SURVEY-OHIO</td>
|
354
|
+
<td>93</td>
|
355
|
+
</tr>
|
356
|
+
<tr>
|
357
|
+
<td>OH</td>
|
358
|
+
<td>OHIO</td>
|
359
|
+
<td>OH</td>
|
360
|
+
</tr>
|
361
|
+
<tr>
|
362
|
+
<td>OK</td>
|
363
|
+
<td>CIMARRON MER</td>
|
364
|
+
<td>11</td>
|
365
|
+
</tr>
|
366
|
+
<tr>
|
367
|
+
<td>OK</td>
|
368
|
+
<td>INDIAN MER</td>
|
369
|
+
<td>17</td>
|
370
|
+
</tr>
|
371
|
+
<tr>
|
372
|
+
<td>OR</td>
|
373
|
+
<td>WILLAMETTE MER</td>
|
374
|
+
<td>33</td>
|
375
|
+
</tr>
|
376
|
+
<tr>
|
377
|
+
<td>PA</td>
|
378
|
+
<td>PENNSYLVANIA</td>
|
379
|
+
<td>PA</td>
|
380
|
+
</tr>
|
381
|
+
<tr>
|
382
|
+
<td>RI</td>
|
383
|
+
<td>RHODE ISLAND</td>
|
384
|
+
<td>RI</td>
|
385
|
+
</tr>
|
386
|
+
<tr>
|
387
|
+
<td>SC</td>
|
388
|
+
<td>SO CAROLINA</td>
|
389
|
+
<td>SC</td>
|
390
|
+
</tr>
|
391
|
+
<tr>
|
392
|
+
<td>SD</td>
|
393
|
+
<td>5TH PM</td>
|
394
|
+
<td>05</td>
|
395
|
+
</tr>
|
396
|
+
<tr>
|
397
|
+
<td>SD</td>
|
398
|
+
<td>6TH PM</td>
|
399
|
+
<td>06</td>
|
400
|
+
</tr>
|
401
|
+
<tr>
|
402
|
+
<td>SD</td>
|
403
|
+
<td>BLACK HILLS MER</td>
|
404
|
+
<td>07</td>
|
405
|
+
</tr>
|
406
|
+
<tr>
|
407
|
+
<td>TN</td>
|
408
|
+
<td>TENNESSEE</td>
|
409
|
+
<td>TN</td>
|
410
|
+
</tr>
|
411
|
+
<tr>
|
412
|
+
<td>TX</td>
|
413
|
+
<td>TEXAS</td>
|
414
|
+
<td>TX</td>
|
415
|
+
</tr>
|
416
|
+
<tr>
|
417
|
+
<td>UT</td>
|
418
|
+
<td>SALT LAKE MER</td>
|
419
|
+
<td>26</td>
|
420
|
+
</tr>
|
421
|
+
<tr>
|
422
|
+
<td>UT</td>
|
423
|
+
<td>UINTAH SPEC MER</td>
|
424
|
+
<td>30</td>
|
425
|
+
</tr>
|
426
|
+
<tr>
|
427
|
+
<td>VA</td>
|
428
|
+
<td>VIRGINIA</td>
|
429
|
+
<td>VA</td>
|
430
|
+
</tr>
|
431
|
+
<tr>
|
432
|
+
<td>VT</td>
|
433
|
+
<td>VERMONT</td>
|
434
|
+
<td>VT</td>
|
435
|
+
</tr>
|
436
|
+
<tr>
|
437
|
+
<td>WA</td>
|
438
|
+
<td>WILLAMETTE MER</td>
|
439
|
+
<td>33</td>
|
440
|
+
</tr>
|
441
|
+
<tr>
|
442
|
+
<td>WI</td>
|
443
|
+
<td>4TH PM MN-WI</td>
|
444
|
+
<td>46</td>
|
445
|
+
</tr>
|
446
|
+
<tr>
|
447
|
+
<td>WV</td>
|
448
|
+
<td>WEST VIRGINIA</td>
|
449
|
+
<td>WV</td>
|
450
|
+
</tr>
|
451
|
+
<tr>
|
452
|
+
<td>WY</td>
|
453
|
+
<td>6TH PM</td>
|
454
|
+
<td>06</td>
|
455
|
+
</tr>
|
456
|
+
<tr>
|
457
|
+
<td>WY</td>
|
458
|
+
<td>WIND RIVER MER</td>
|
459
|
+
<td>34</td>
|
460
|
+
</tr>
|
461
|
+
</table>
|
data/Rakefile
ADDED
data/interior.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "interior/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "interior"
|
7
|
+
s.version = Interior::VERSION
|
8
|
+
s.authors = ["Chris Hunt"]
|
9
|
+
s.email = ["chunt@climate.com"]
|
10
|
+
s.homepage = "http://climate.com"
|
11
|
+
s.summary = %q{Convert PLSS to latitude and longitude}
|
12
|
+
s.description = %q{Find the center latitude/longitude for any grid in the PLSS given township, range, and section.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "interior"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "rspec"
|
22
|
+
s.add_development_dependency "ruby-debug"
|
23
|
+
|
24
|
+
s.add_runtime_dependency "nokogiri"
|
25
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'cgi'
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'interior/response'
|
5
|
+
|
6
|
+
module Interior
|
7
|
+
class Geocoder
|
8
|
+
API_DOMAIN = 'www.geocommunicator.gov'
|
9
|
+
API_PATH = 'TownshipGeocoder/TownshipGeocoder.asmx/GetLatLon'
|
10
|
+
API_PARAM = 'TRS'
|
11
|
+
|
12
|
+
# st : state
|
13
|
+
# me : meridian
|
14
|
+
# to : township
|
15
|
+
# to_dir : township direction
|
16
|
+
# ra : range
|
17
|
+
# ra_dir : range_direction
|
18
|
+
# se : section
|
19
|
+
def self.get_lat_lon(st, me, to, to_dir, ra, ra_dir, se)
|
20
|
+
trs = build_trs_param(st, me, to, to_dir, ra, ra_dir, se)
|
21
|
+
xml = get_response_body(trs)
|
22
|
+
result = parse_xml(xml)
|
23
|
+
result ? Interior::Response.new(result[:lat], result[:lon]) : nil
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def self.build_trs_param(st, me, to, to_dir, ra, ra_dir, se = nil)
|
29
|
+
"#{st},#{me},#{to},0,#{to_dir},#{ra},0,#{ra_dir},#{se ? se : 0},,0"
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.get_response_body(trs)
|
33
|
+
url = "http://#{API_DOMAIN}/#{API_PATH}?#{API_PARAM}=#{CGI::escape(trs.to_s)}"
|
34
|
+
uri = URI.parse(url)
|
35
|
+
Net::HTTP.get_response(uri).body
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.parse_xml(xml)
|
39
|
+
begin
|
40
|
+
doc = Nokogiri::XML(xml)
|
41
|
+
data = Nokogiri::XML(doc.children[0].children[5].text)
|
42
|
+
points = data.xpath('//georss:point').first.child.text.split
|
43
|
+
lon, lat = points
|
44
|
+
|
45
|
+
{ :lat => lat.to_f, :lon => lon.to_f }
|
46
|
+
rescue
|
47
|
+
nil # if XML is the wrong format, return nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/interior.rb
ADDED
data/maps/meridians.jpg
ADDED
Binary file
|
Binary file
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<TownshipGeocoderResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.esri.com/">
|
3
|
+
<CompletionStatus>true</CompletionStatus>
|
4
|
+
<Message>Ok</Message>
|
5
|
+
<Data><?xml version="1.0" encoding="UTF-8"?>
|
6
|
+
|
7
|
+
<rss version="2.0" xmlns:georss="http://www.georss.org/georss">
|
8
|
+
<channel>
|
9
|
+
<title>Township GeoCoder</title>
|
10
|
+
<item>
|
11
|
+
<title>Lat Lon</title>
|
12
|
+
<link>http://www.geocommunicator.gov</link>
|
13
|
+
<description>Latitude(33.384549272498), Longitude(-112.228362739723)</description>
|
14
|
+
<pubDate>1/17/2012 1:45:18 PM</pubDate>
|
15
|
+
<georss:point>-112.228362739723 33.384549272498</georss:point>
|
16
|
+
</item>
|
17
|
+
|
18
|
+
<item><title>Township Range Section</title>
|
19
|
+
<link>http://www.geocommunicator.gov</link>
|
20
|
+
<description>AZ,14,1,0,N,1,0,E,35,,0</description>
|
21
|
+
<pubDate>1/17/2012 1:45:18 PM</pubDate>
|
22
|
+
<georss:polygon>33.377309949200253,-112.22473576975602,33.377309762935738,-112.22508655240432,33.377309134293,-112.22616916833266,33.37730785372446,-112.22833437690633,33.377306363608341,-112.22906648958326,33.377305152888994,-112.23266758802146,33.377303662772874,-112.23339967741532,33.3773024054874,-112.23700079913641,33.380924970911053,-112.2369908107018,33.38454753633448,-112.23698082226719,33.387510306279239,-112.23697386063094,33.388168308962179,-112.23697292930837,33.39085871361948,-112.23697462897206,33.3917808161018,-112.23697244036401,33.391802213237952,-112.23269233791888,33.3918235638082,-112.22841218890744,33.391844751396775,-112.22413655681072,33.391865892419219,-112.21986092471394,33.388228751797271,-112.21980846796981,33.384591634458559,-112.21975596465961,33.380954284289089,-112.21970516101294,33.377316934119563,-112.21965433408343,33.377315932947795,-112.22005654902097,33.377313464942972,-112.22295871314896,33.3773114858825,-112.22400412274044,33.377309949200253,-112.22473576975602</georss:polygon>
|
23
|
+
</item></channel></rss></Data>
|
24
|
+
</TownshipGeocoderResult>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<TownshipGeocoderResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.esri.com/">
|
3
|
+
<CompletionStatus>true</CompletionStatus>
|
4
|
+
<Message>Ok</Message>
|
5
|
+
<Data><?xml version="1.0" encoding="UTF-8"?>
|
6
|
+
|
7
|
+
<rss version="2.0" xmlns:georss="http://www.georss.org/georss">
|
8
|
+
<channel>
|
9
|
+
<title>Township GeoCoder</title>
|
10
|
+
<item>
|
11
|
+
<title>Lat Lon</title>
|
12
|
+
<link>http://www.geocommunicator.gov</link>
|
13
|
+
<description>Latitude(39.9648046692517), Longitude(-105.006276849858)</description>
|
14
|
+
<pubDate>1/17/2012 2:56:49 PM</pubDate>
|
15
|
+
<georss:point>-105.006276849858 39.9648046692517</georss:point>
|
16
|
+
</item>
|
17
|
+
|
18
|
+
<item><title>Township Range Section</title>
|
19
|
+
<link>http://www.geocommunicator.gov</link>
|
20
|
+
<description>CO,6,1,0,S,68,0,W,16,,0</description>
|
21
|
+
<pubDate>1/17/2012 2:56:49 PM</pubDate>
|
22
|
+
<georss:polygon>39.957606675977047,-105.015652857276,39.961226610414428,-105.01565895743886,39.9648465681347,-105.01566508088479,39.968466525855092,-105.01567120433072,39.9720864602923,-105.01567728121052,39.9720635264739,-105.01097910806089,39.9720405926555,-105.00628093491133,39.972017635554039,-105.00158276176188,39.971994701735639,-104.99688458861243,39.968376862774051,-104.99688568291646,39.964759047095754,-104.99688682378661,39.961141208134165,-104.99688791809064,39.957523392455812,-104.99688905896079,39.957544207515355,-105.00158001436029,39.957565045857962,-105.00627096975978,39.95758583763444,-105.01096192515939,39.957606675977047,-105.015652857276</georss:polygon>
|
23
|
+
</item></channel></rss></Data>
|
24
|
+
</TownshipGeocoderResult>
|
@@ -0,0 +1,122 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
require 'interior/geocoder.rb'
|
3
|
+
|
4
|
+
describe Interior::Geocoder do
|
5
|
+
let(:coder) { Interior::Geocoder }
|
6
|
+
|
7
|
+
describe '#get_lat_lon' do
|
8
|
+
subject { coder.get_lat_lon(st, me, to, to_dir, ra, ra_dir, se) }
|
9
|
+
|
10
|
+
context 'when in Arizona' do
|
11
|
+
let (:st) { 'AZ' }
|
12
|
+
let (:me) { 14 }
|
13
|
+
let (:to) { 1 }
|
14
|
+
let (:to_dir) { 'N' }
|
15
|
+
let (:ra) { 1 }
|
16
|
+
let (:ra_dir) { 'E' }
|
17
|
+
let (:se) { 35 }
|
18
|
+
|
19
|
+
it 'returns the correct latitude and longitude' do
|
20
|
+
subject.latitude.should == 33.384549272498
|
21
|
+
subject.longitude.should == -112.228362739723
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#build_trs_param' do
|
27
|
+
subject { coder.send(:build_trs_param, st, me, to, to_dir, ra, ra_dir, se) }
|
28
|
+
|
29
|
+
context 'when in Arizona' do
|
30
|
+
let (:st) { 'AZ' }
|
31
|
+
let (:me) { 14 }
|
32
|
+
let (:to) { 1 }
|
33
|
+
let (:to_dir) { 'N' }
|
34
|
+
let (:ra) { 1 }
|
35
|
+
let (:ra_dir) { 'E' }
|
36
|
+
let (:se) { 35 }
|
37
|
+
|
38
|
+
it 'returns the correct trs param' do
|
39
|
+
subject.should == "AZ,14,1,0,N,1,0,E,35,,0"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when in Colorado' do
|
44
|
+
let (:st) { 'CO' }
|
45
|
+
let (:me) { 06 }
|
46
|
+
let (:to) { 1 }
|
47
|
+
let (:to_dir) { 'S' }
|
48
|
+
let (:ra) { 68 }
|
49
|
+
let (:ra_dir) { 'W' }
|
50
|
+
let (:se) { 16 }
|
51
|
+
|
52
|
+
it 'returns the correct trs param' do
|
53
|
+
subject.should == "CO,6,1,0,S,68,0,W,16,,0"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when missing section' do
|
58
|
+
let (:st) { 'AZ' }
|
59
|
+
let (:me) { 14 }
|
60
|
+
let (:to) { 1 }
|
61
|
+
let (:to_dir) { 'N' }
|
62
|
+
let (:ra) { 1 }
|
63
|
+
let (:ra_dir) { 'E' }
|
64
|
+
let (:se) { nil }
|
65
|
+
|
66
|
+
it 'defaults to section 0' do
|
67
|
+
subject.should == "AZ,14,1,0,N,1,0,E,0,,0"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#get_response_body' do
|
73
|
+
subject do
|
74
|
+
Net::HTTP.stub(:get_response => double('response', :body => body))
|
75
|
+
coder.send(:get_response_body, "AZ,14,1,0,N,1,0,E,0,,0")
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when the response contains a body' do
|
79
|
+
let(:body) { 'response_body' }
|
80
|
+
|
81
|
+
it 'returns the body' do
|
82
|
+
subject.should == 'response_body'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'when the response does not contain a body' do
|
87
|
+
let(:body) { nil }
|
88
|
+
|
89
|
+
it 'returns nil' do
|
90
|
+
subject.should == nil
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe '#parse_xml' do
|
96
|
+
subject { coder.send(:parse_xml, xml) }
|
97
|
+
|
98
|
+
context 'when in Arizona' do
|
99
|
+
let(:xml) { File.open('spec/fixtures/az.xml').read }
|
100
|
+
|
101
|
+
it 'returns the correct latitude and longitude' do
|
102
|
+
subject.should == { :lat => 33.384549272498, :lon => -112.228362739723 }
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'when in Colorado' do
|
107
|
+
let(:xml) { File.open('spec/fixtures/co.xml').read }
|
108
|
+
|
109
|
+
it 'returns the correct latitude and longitude' do
|
110
|
+
subject.should == { :lat => 39.9648046692517, :lon => -105.006276849858 }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context 'when no xml is provided' do
|
115
|
+
let(:xml) { nil }
|
116
|
+
|
117
|
+
it 'returns nil' do
|
118
|
+
subject.should == nil
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
require 'interior/response.rb'
|
3
|
+
|
4
|
+
describe Interior::Response do
|
5
|
+
let(:latitude) { 30 }
|
6
|
+
let(:longitude) { 60 }
|
7
|
+
let(:response) { Interior::Response.new(latitude, longitude) }
|
8
|
+
|
9
|
+
describe('#latitude') do
|
10
|
+
it 'can be initialized' do
|
11
|
+
response.latitude.should == latitude
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'is readonly' do
|
15
|
+
lambda { response.latitude = 100 }.should raise_error
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe('#longitude') do
|
20
|
+
it 'can be initialized' do
|
21
|
+
response.longitude.should == longitude
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'is readonly' do
|
25
|
+
lambda { response.longitude = 100 }.should raise_error
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: interior
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 63
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 8
|
9
|
+
- 0
|
10
|
+
version: 0.8.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Chris Hunt
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-01-18 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: ruby-debug
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: nokogiri
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
type: :runtime
|
61
|
+
version_requirements: *id003
|
62
|
+
description: Find the center latitude/longitude for any grid in the PLSS given township, range, and section.
|
63
|
+
email:
|
64
|
+
- chunt@climate.com
|
65
|
+
executables: []
|
66
|
+
|
67
|
+
extensions: []
|
68
|
+
|
69
|
+
extra_rdoc_files: []
|
70
|
+
|
71
|
+
files:
|
72
|
+
- .gitignore
|
73
|
+
- .rvmrc
|
74
|
+
- Gemfile
|
75
|
+
- README.md
|
76
|
+
- Rakefile
|
77
|
+
- interior.gemspec
|
78
|
+
- lib/interior.rb
|
79
|
+
- lib/interior/geocoder.rb
|
80
|
+
- lib/interior/response.rb
|
81
|
+
- lib/interior/version.rb
|
82
|
+
- maps/meridians.jpg
|
83
|
+
- maps/meridians_small.jpg
|
84
|
+
- spec/fixtures/az.xml
|
85
|
+
- spec/fixtures/co.xml
|
86
|
+
- spec/lib/interior/geocoder_spec.rb
|
87
|
+
- spec/lib/interior/response_spec.rb
|
88
|
+
- spec/spec_helper.rb
|
89
|
+
homepage: http://climate.com
|
90
|
+
licenses: []
|
91
|
+
|
92
|
+
post_install_message:
|
93
|
+
rdoc_options: []
|
94
|
+
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
none: false
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
hash: 3
|
103
|
+
segments:
|
104
|
+
- 0
|
105
|
+
version: "0"
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
hash: 3
|
112
|
+
segments:
|
113
|
+
- 0
|
114
|
+
version: "0"
|
115
|
+
requirements: []
|
116
|
+
|
117
|
+
rubyforge_project: interior
|
118
|
+
rubygems_version: 1.8.10
|
119
|
+
signing_key:
|
120
|
+
specification_version: 3
|
121
|
+
summary: Convert PLSS to latitude and longitude
|
122
|
+
test_files:
|
123
|
+
- spec/fixtures/az.xml
|
124
|
+
- spec/fixtures/co.xml
|
125
|
+
- spec/lib/interior/geocoder_spec.rb
|
126
|
+
- spec/lib/interior/response_spec.rb
|
127
|
+
- spec/spec_helper.rb
|