1 : /******************************************************************************
2 : * $Id: tigerpolygon.cpp 22961 2011-08-20 17:09:59Z rouault $
3 : *
4 : * Project: TIGER/Line Translator
5 : * Purpose: Implements TigerPolygon, providing access to .RTA files.
6 : * Author: Frank Warmerdam, warmerdam@pobox.com
7 : *
8 : ******************************************************************************
9 : * Copyright (c) 1999, Frank Warmerdam
10 : *
11 : * Permission is hereby granted, free of charge, to any person obtaining a
12 : * copy of this software and associated documentation files (the "Software"),
13 : * to deal in the Software without restriction, including without limitation
14 : * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 : * and/or sell copies of the Software, and to permit persons to whom the
16 : * Software is furnished to do so, subject to the following conditions:
17 : *
18 : * The above copyright notice and this permission notice shall be included
19 : * in all copies or substantial portions of the Software.
20 : *
21 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 : * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 : * DEALINGS IN THE SOFTWARE.
28 : ****************************************************************************/
29 :
30 : #include "ogr_tiger.h"
31 : #include "cpl_conv.h"
32 :
33 : CPL_CVSID("$Id: tigerpolygon.cpp 22961 2011-08-20 17:09:59Z rouault $");
34 :
35 : static const TigerFieldInfo rtA_2002_fields[] = {
36 : // fieldname fmt type OFTType beg end len bDefine bSet bWrite
37 : { "MODULE", ' ', ' ', OFTString, 0, 0, 8, 1, 0, 0 },
38 : { "FILE", 'L', 'N', OFTInteger, 6, 10, 5, 1, 1, 1 },
39 : { "CENID", 'L', 'A', OFTString, 11, 15, 5, 1, 1, 1 },
40 : { "POLYID", 'R', 'N', OFTInteger, 16, 25, 10, 1, 1, 1 },
41 : { "STATECU", 'L', 'N', OFTInteger, 26, 27, 2, 1, 1, 1 },
42 : { "COUNTYCU", 'L', 'N', OFTInteger, 28, 30, 3, 1, 1, 1 },
43 :
44 : { "TRACT", 'L', 'N', OFTInteger, 31, 36, 6, 1, 1, 1 },
45 : { "BLOCK", 'L', 'N', OFTInteger, 37, 40, 4, 1, 1, 1 },
46 : { "BLOCKSUFCU", 'L', 'A', OFTString, 41, 41, 1, 1, 1, 1 },
47 :
48 : { "RS_A1", 'L', 'A', OFTString, 42, 42, 1, 1, 1, 1 },
49 : { "AIANHHFPCU", 'L', 'N', OFTInteger, 43, 47, 5, 1, 1, 1 },
50 : { "AIANHHCU", 'L', 'N', OFTInteger, 48, 51, 4, 1, 1, 1 },
51 : { "AIHHTLICU", 'L', 'A', OFTString, 52, 52, 1, 1, 1, 1 },
52 : { "ANRCCU", 'L', 'N', OFTInteger, 53, 57, 5, 1, 1, 1 },
53 : { "AITSCECU", 'L', 'N', OFTInteger, 58, 60, 3, 1, 1, 1 },
54 : { "AITSCU", 'L', 'N', OFTInteger, 61, 65, 5, 1, 1, 1 },
55 : { "CONCITCU", 'L', 'N', OFTInteger, 66, 70, 5, 1, 1, 1 },
56 : { "COUSUBCU", 'L', 'N', OFTInteger, 71, 75, 5, 1, 1, 1 },
57 : { "SUBMCDCU", 'L', 'N', OFTInteger, 76, 80, 5, 1, 1, 1 },
58 : { "PLACECU", 'L', 'N', OFTInteger, 81, 85, 5, 1, 1, 1 },
59 : { "SDELMCU", 'L', 'A', OFTString, 86, 90, 5, 1, 1, 1 },
60 : { "SDSECCU", 'L', 'A', OFTString, 91, 95, 5, 1, 1, 1 },
61 : { "SDUNICU", 'L', 'A', OFTString, 96, 100, 5, 1, 1, 1 },
62 : { "MSACMSACU", 'L', 'N', OFTInteger, 101, 104, 4, 1, 1, 1 },
63 : { "PMSACU", 'L', 'N', OFTInteger, 105, 108, 4, 1, 1, 1 },
64 : { "NECMACU", 'L', 'N', OFTInteger, 109, 112, 4, 1, 1, 1 },
65 : { "CDCU", 'R', 'N', OFTInteger, 113, 114, 2, 1, 1, 1 },
66 : { "RS_A2", 'L', 'A', OFTString, 115, 119, 5, 1, 1, 1 },
67 : { "RS_A3", 'R', 'A', OFTString, 120, 122, 3, 1, 1, 1 },
68 : { "RS_A4", 'R', 'A', OFTString, 123, 128, 6, 1, 1, 1 },
69 : { "RS_A5", 'R', 'A', OFTString, 129, 131, 3, 1, 1, 1 },
70 : { "RS_A6", 'R', 'A', OFTString, 132, 134, 3, 1, 1, 1 },
71 : { "RS_A7", 'R', 'A', OFTString, 135, 139, 5, 1, 1, 1 },
72 : { "RS_A8", 'R', 'A', OFTString, 140, 145, 6, 1, 1, 1 },
73 : { "RS_A9", 'L', 'A', OFTString, 146, 151, 6, 1, 1, 1 },
74 : { "RS_A10", 'L', 'A', OFTString, 152, 157, 6, 1, 1, 1 },
75 : { "RS_A11", 'L', 'A', OFTString, 158, 163, 6, 1, 1, 1 },
76 : { "RS_A12", 'L', 'A', OFTString, 164, 169, 6, 1, 1, 1 },
77 : { "RS_A13", 'L', 'A', OFTString, 170, 175, 6, 1, 1, 1 },
78 : { "RS_A14", 'L', 'A', OFTString, 176, 181, 6, 1, 1, 1 },
79 : { "RS_A15", 'L', 'A', OFTString, 182, 186, 5, 1, 1, 1 },
80 : { "RS_A16", 'L', 'A', OFTString, 187, 187, 1, 1, 1, 1 },
81 : { "RS_A17", 'L', 'A', OFTString, 188, 193, 6, 1, 1, 1 },
82 : { "RS_A18", 'L', 'A', OFTString, 194, 199, 6, 1, 1, 1 },
83 : { "RS_A19", 'L', 'A', OFTString, 200, 210, 11, 1, 1, 1 },
84 : };
85 : static const TigerRecordInfo rtA_2002_info =
86 : {
87 : rtA_2002_fields,
88 : sizeof(rtA_2002_fields) / sizeof(TigerFieldInfo),
89 : 210
90 : };
91 :
92 :
93 : static const TigerFieldInfo rtA_2003_fields[] = {
94 : // fieldname fmt type OFTType beg end len bDefine bSet bWrite
95 : { "MODULE", ' ', ' ', OFTString, 0, 0, 8, 1, 0, 0 },
96 : { "FILE", 'L', 'N', OFTInteger, 6, 10, 5, 1, 1, 1 },
97 : { "CENID", 'L', 'A', OFTString, 11, 15, 5, 1, 1, 1 },
98 : { "POLYID", 'R', 'N', OFTInteger, 16, 25, 10, 1, 1, 1 },
99 : { "STATECU", 'L', 'N', OFTInteger, 26, 27, 2, 1, 1, 1 },
100 : { "COUNTYCU", 'L', 'N', OFTInteger, 28, 30, 3, 1, 1, 1 },
101 :
102 : { "TRACT", 'L', 'N', OFTInteger, 31, 36, 6, 1, 1, 1 },
103 : { "BLOCK", 'L', 'N', OFTInteger, 37, 40, 4, 1, 1, 1 },
104 : { "BLOCKSUFCU", 'L', 'A', OFTString, 41, 41, 1, 1, 1, 1 },
105 :
106 : { "RS_A1", 'L', 'A', OFTString, 42, 42, 1, 1, 1, 1 },
107 : { "AIANHHFPCU", 'L', 'N', OFTInteger, 43, 47, 5, 1, 1, 1 },
108 : { "AIANHHCU", 'L', 'N', OFTInteger, 48, 51, 4, 1, 1, 1 },
109 : { "AIHHTLICU", 'L', 'A', OFTString, 52, 52, 1, 1, 1, 1 },
110 : { "ANRCCU", 'L', 'N', OFTInteger, 53, 57, 5, 1, 1, 1 },
111 : { "AITSCECU", 'L', 'N', OFTInteger, 58, 60, 3, 1, 1, 1 },
112 : { "AITSCU", 'L', 'N', OFTInteger, 61, 65, 5, 1, 1, 1 },
113 : { "CONCITCU", 'L', 'N', OFTInteger, 66, 70, 5, 1, 1, 1 },
114 : { "COUSUBCU", 'L', 'N', OFTInteger, 71, 75, 5, 1, 1, 1 },
115 : { "SUBMCDCU", 'L', 'N', OFTInteger, 76, 80, 5, 1, 1, 1 },
116 : { "PLACECU", 'L', 'N', OFTInteger, 81, 85, 5, 1, 1, 1 },
117 : { "SDELMCU", 'L', 'A', OFTString, 86, 90, 5, 1, 1, 1 },
118 : { "SDSECCU", 'L', 'A', OFTString, 91, 95, 5, 1, 1, 1 },
119 : { "SDUNICU", 'L', 'A', OFTString, 96, 100, 5, 1, 1, 1 },
120 : { "RS_A20", 'L', 'A', OFTString, 101, 104, 4, 1, 1, 1 },
121 : { "RS_A21", 'L', 'A', OFTString, 105, 108, 4, 1, 1, 1 },
122 : { "RS_A22", 'L', 'A', OFTString, 109, 112, 4, 1, 1, 1 },
123 : { "CDCU", 'R', 'N', OFTInteger, 113, 114, 2, 1, 1, 1 },
124 : { "ZCTA5CU", 'L', 'A', OFTString, 115, 119, 5, 1, 1, 1 },
125 : { "ZCTA3CU", 'R', 'A', OFTString, 120, 122, 3, 1, 1, 1 },
126 : { "RS_A4", 'R', 'A', OFTString, 123, 128, 6, 1, 1, 1 },
127 : { "RS_A5", 'R', 'A', OFTString, 129, 131, 3, 1, 1, 1 },
128 : { "RS_A6", 'R', 'A', OFTString, 132, 134, 3, 1, 1, 1 },
129 : { "RS_A7", 'R', 'A', OFTString, 135, 139, 5, 1, 1, 1 },
130 : { "RS_A8", 'R', 'A', OFTString, 140, 145, 6, 1, 1, 1 },
131 : { "RS_A9", 'L', 'A', OFTString, 146, 151, 6, 1, 1, 1 },
132 : { "CBSACU", 'L', 'A', OFTInteger, 152, 156, 5, 1, 1, 1 },
133 : { "CSACU", 'L', 'A', OFTInteger, 157, 159, 3, 1, 1, 1 },
134 : { "NECTACU", 'L', 'A', OFTInteger, 160, 164, 5, 1, 1, 1 },
135 : { "CNECTACU", 'L', 'A', OFTInteger, 165, 167, 3, 1, 1, 1 },
136 : { "METDIVCU", 'L', 'A', OFTInteger, 168, 172, 5, 1, 1, 1 },
137 : { "NECTADIVCU", 'L', 'A', OFTInteger, 173, 177, 5, 1, 1, 1 },
138 : { "RS_A14", 'L', 'A', OFTString, 178, 181, 4, 1, 1, 1 },
139 : { "RS_A15", 'L', 'A', OFTString, 182, 186, 5, 1, 1, 1 },
140 : { "RS_A16", 'L', 'A', OFTString, 187, 187, 1, 1, 1, 1 },
141 : { "RS_A17", 'L', 'A', OFTString, 188, 193, 6, 1, 1, 1 },
142 : { "RS_A18", 'L', 'A', OFTString, 194, 199, 6, 1, 1, 1 },
143 : { "RS_A19", 'L', 'A', OFTString, 200, 210, 11, 1, 1, 1 },
144 : };
145 : static const TigerRecordInfo rtA_2003_info =
146 : {
147 : rtA_2003_fields,
148 : sizeof(rtA_2003_fields) / sizeof(TigerFieldInfo),
149 : 210
150 : };
151 :
152 :
153 : static const TigerFieldInfo rtA_2004_fields[] = {
154 : // fieldname fmt type OFTType beg end len bDefine bSet bWrite
155 : { "MODULE", ' ', ' ', OFTString, 0, 0, 8, 1, 0, 0 },
156 : { "FILE", 'L', 'N', OFTInteger, 6, 10, 5, 1, 1, 1 },
157 : { "CENID", 'L', 'A', OFTString, 11, 15, 5, 1, 1, 1 },
158 : { "POLYID", 'R', 'N', OFTInteger, 16, 25, 10, 1, 1, 1 },
159 : { "STATECU", 'L', 'N', OFTInteger, 26, 27, 2, 1, 1, 1 },
160 : { "COUNTYCU", 'L', 'N', OFTInteger, 28, 30, 3, 1, 1, 1 },
161 :
162 : { "TRACT", 'L', 'N', OFTInteger, 31, 36, 6, 1, 1, 1 },
163 : { "BLOCK", 'L', 'N', OFTInteger, 37, 40, 4, 1, 1, 1 },
164 : { "BLOCKSUFCU", 'L', 'A', OFTString, 41, 41, 1, 1, 1, 1 },
165 :
166 : { "RS_A1", 'L', 'A', OFTString, 42, 42, 1, 1, 1, 1 },
167 : { "AIANHHFPCU", 'L', 'N', OFTInteger, 43, 47, 5, 1, 1, 1 },
168 : { "AIANHHCU", 'L', 'N', OFTInteger, 48, 51, 4, 1, 1, 1 },
169 : { "AIHHTLICU", 'L', 'A', OFTString, 52, 52, 1, 1, 1, 1 },
170 : { "ANRCCU", 'L', 'N', OFTInteger, 53, 57, 5, 1, 1, 1 },
171 : { "AITSCECU", 'L', 'N', OFTInteger, 58, 60, 3, 1, 1, 1 },
172 : { "AITSCU", 'L', 'N', OFTInteger, 61, 65, 5, 1, 1, 1 },
173 : { "CONCITCU", 'L', 'N', OFTInteger, 66, 70, 5, 1, 1, 1 },
174 : { "COUSUBCU", 'L', 'N', OFTInteger, 71, 75, 5, 1, 1, 1 },
175 : { "SUBMCDCU", 'L', 'N', OFTInteger, 76, 80, 5, 1, 1, 1 },
176 : { "PLACECU", 'L', 'N', OFTInteger, 81, 85, 5, 1, 1, 1 },
177 : { "SDELMCU", 'L', 'A', OFTString, 86, 90, 5, 1, 1, 1 },
178 : { "SDSECCU", 'L', 'A', OFTString, 91, 95, 5, 1, 1, 1 },
179 : { "SDUNICU", 'L', 'A', OFTString, 96, 100, 5, 1, 1, 1 },
180 : { "RS_A20", 'L', 'A', OFTString, 101, 104, 4, 1, 1, 1 },
181 : { "RS_A21", 'L', 'A', OFTString, 105, 108, 4, 1, 1, 1 },
182 : { "RS_A22", 'L', 'A', OFTString, 109, 112, 4, 1, 1, 1 },
183 : { "CDCU", 'R', 'N', OFTInteger, 113, 114, 2, 1, 1, 1 },
184 : { "ZCTA5CU", 'L', 'A', OFTString, 115, 119, 5, 1, 1, 1 },
185 : { "ZCTA3CU", 'R', 'A', OFTString, 120, 122, 3, 1, 1, 1 },
186 : { "RS_A4", 'R', 'A', OFTString, 123, 128, 6, 1, 1, 1 },
187 : { "RS_A5", 'R', 'A', OFTString, 129, 131, 3, 1, 1, 1 },
188 : { "RS_A6", 'R', 'A', OFTString, 132, 134, 3, 1, 1, 1 },
189 : { "RS_A7", 'R', 'A', OFTString, 135, 139, 5, 1, 1, 1 },
190 : { "RS_A8", 'R', 'A', OFTString, 140, 145, 6, 1, 1, 1 },
191 : { "RS_A9", 'L', 'A', OFTString, 146, 151, 6, 1, 1, 1 },
192 : { "CBSACU", 'L', 'A', OFTInteger, 152, 156, 5, 1, 1, 1 },
193 : { "CSACU", 'L', 'A', OFTInteger, 157, 159, 3, 1, 1, 1 },
194 : { "NECTACU", 'L', 'A', OFTInteger, 160, 164, 5, 1, 1, 1 },
195 : { "CNECTACU", 'L', 'A', OFTInteger, 165, 167, 3, 1, 1, 1 },
196 : { "METDIVCU", 'L', 'A', OFTInteger, 168, 172, 5, 1, 1, 1 },
197 : { "NECTADIVCU", 'L', 'A', OFTInteger, 173, 177, 5, 1, 1, 1 },
198 : { "RS_A14", 'L', 'A', OFTString, 178, 181, 4, 1, 1, 1 },
199 : { "UACU", 'L', 'N', OFTInteger, 182, 186, 5, 1, 1, 1 },
200 : { "URCU", 'L', 'A', OFTString, 187, 187, 1, 1, 1, 1 },
201 : { "RS_A17", 'L', 'A', OFTString, 188, 193, 6, 1, 1, 1 },
202 : { "RS_A18", 'L', 'A', OFTString, 194, 199, 6, 1, 1, 1 },
203 : { "RS_A19", 'L', 'A', OFTString, 200, 210, 11, 1, 1, 1 },
204 : };
205 : static const TigerRecordInfo rtA_2004_info =
206 : {
207 : rtA_2004_fields,
208 : sizeof(rtA_2004_fields) / sizeof(TigerFieldInfo),
209 : 210
210 : };
211 :
212 :
213 : static const TigerFieldInfo rtA_fields[] = {
214 : // fieldname fmt type OFTType beg end len bDefine bSet bWrite
215 : { "MODULE", ' ', ' ', OFTString, 0, 0, 8, 1, 0, 0 },
216 : { "FILE", 'L', 'N', OFTString, 6, 10, 5, 1, 1, 1 },
217 : { "STATE", 'L', 'N', OFTInteger, 6, 7, 2, 1, 1, 1 },
218 : { "COUNTY", 'L', 'N', OFTInteger, 8, 10, 3, 1, 1, 1 },
219 : { "CENID", 'L', 'A', OFTString, 11, 15, 5, 1, 1, 1 },
220 : { "POLYID", 'R', 'N', OFTInteger, 16, 25, 10, 1, 1, 1 },
221 : { "FAIR", 'L', 'N', OFTInteger, 26, 30, 5, 1, 1, 1 },
222 : { "FMCD", 'L', 'N', OFTInteger, 31, 35, 5, 1, 1, 1 },
223 : { "FPL", 'L', 'N', OFTInteger, 36, 40, 5, 1, 1, 1 },
224 : { "CTBNA90", 'L', 'N', OFTInteger, 41, 46, 6, 1, 1, 1 },
225 : { "BLK90", 'L', 'A', OFTString, 47, 50, 4, 1, 1, 1 },
226 : { "CD106", 'L', 'N', OFTInteger, 51, 52, 2, 1, 1, 1 },
227 : { "CD108", 'L', 'N', OFTInteger, 53, 54, 2, 1, 1, 1 },
228 : { "SDELM", 'L', 'A', OFTString, 55, 59, 5, 1, 1, 1 },
229 : { "SDSEC", 'L', 'N', OFTString, 65, 69, 5, 1, 1, 1 },
230 : { "SDUNI", 'L', 'A', OFTString, 70, 74, 5, 1, 1, 1 },
231 : { "TAZ", 'R', 'A', OFTString, 75, 80, 6, 1, 1, 1 },
232 : { "UA", 'L', 'N', OFTInteger, 81, 84, 4, 1, 1, 1 },
233 : { "URBFLAG", 'L', 'A', OFTString, 85, 85, 1, 1, 1, 1 },
234 : { "CTPP", 'L', 'A', OFTString, 86, 89, 4, 1, 1, 1 },
235 : { "STATE90", 'L', 'N', OFTInteger, 90, 91, 2, 1, 1, 1 },
236 : { "COUN90", 'L', 'N', OFTInteger, 92, 94, 3, 1, 1, 1 },
237 : { "AIR90", 'L', 'N', OFTInteger, 95, 98, 4, 1, 1, 1 }
238 : };
239 :
240 : static const TigerRecordInfo rtA_info =
241 : {
242 : rtA_fields,
243 : sizeof(rtA_fields) / sizeof(TigerFieldInfo),
244 : 98
245 : };
246 :
247 :
248 : static const TigerFieldInfo rtS_2002_fields[] = {
249 : // fieldname fmt type OFTType beg end len bDefine bSet bWrite
250 : { "FILE", 'L', 'N', OFTInteger, 6, 10, 5, 0, 0, 1 },
251 : { "CENID", 'L', 'A', OFTString, 11, 15, 5, 0, 0, 1 },
252 : { "POLYID", 'R', 'N', OFTInteger, 16, 25, 10, 0, 0, 1 },
253 : { "STATE", 'L', 'N', OFTInteger, 26, 27, 2, 1, 1, 1 },
254 : { "COUNTY", 'L', 'N', OFTInteger, 28, 30, 3, 1, 1, 1 },
255 : { "TRACT", 'L', 'N', OFTInteger, 31, 36, 6, 0, 0, 1 },
256 : { "BLOCK", 'L', 'N', OFTInteger, 37, 40, 4, 0, 0, 1 },
257 : { "BLKGRP", 'L', 'N', OFTInteger, 41, 41, 1, 1, 1, 1 },
258 : { "AIANHHFP", 'L', 'N', OFTInteger, 42, 46, 5, 1, 1, 1 },
259 : { "AIANHH", 'L', 'N', OFTInteger, 47, 50, 4, 1, 1, 1 },
260 : { "AIHHTLI", 'L', 'A', OFTString, 51, 51, 1, 1, 1, 1 },
261 : { "ANRC", 'L', 'N', OFTInteger, 52, 56, 5, 1, 1, 1 },
262 : { "AITSCE", 'L', 'N', OFTInteger, 57, 59, 3, 1, 1, 1 },
263 : { "AITS", 'L', 'N', OFTInteger, 60, 64, 5, 1, 1, 1 },
264 : { "CONCIT", 'L', 'N', OFTInteger, 65, 69, 5, 1, 1, 1 },
265 : { "COUSUB", 'L', 'N', OFTInteger, 70, 74, 5, 1, 1, 1 },
266 : { "SUBMCD", 'L', 'N', OFTInteger, 75, 79, 5, 1, 1, 1 },
267 : { "PLACE", 'L', 'N', OFTInteger, 80, 84, 5, 1, 1, 1 },
268 : { "SDELM", 'L', 'N', OFTInteger, 85, 89, 5, 1, 1, 1 },
269 : { "SDSEC", 'L', 'N', OFTInteger, 90, 94, 5, 1, 1, 1 },
270 : { "SDUNI", 'L', 'N', OFTInteger, 95, 99, 5, 1, 1, 1 },
271 : { "MSACMSA", 'L', 'N', OFTInteger, 100, 103, 4, 1, 1, 1 },
272 : { "PMSA", 'L', 'N', OFTInteger, 104, 107, 4, 1, 1, 1 },
273 : { "NECMA", 'L', 'N', OFTInteger, 108, 111, 4, 1, 1, 1 },
274 : { "CD106", 'L', 'N', OFTInteger, 112, 113, 2, 1, 1, 1 },
275 : // Note: spec has CD106 with 'R', but sample data file (08005) seems to
276 : // have been written with 'L', so I'm using 'L' here. mbp Tue Dec 24 19:03:40 2002
277 : { "CD108", 'R', 'N', OFTInteger, 114, 115, 2, 1, 1, 1 },
278 : { "PUMA5", 'L', 'N', OFTInteger, 116, 120, 5, 1, 1, 1 },
279 : { "PUMA1", 'L', 'N', OFTInteger, 121, 125, 5, 1, 1, 1 },
280 : { "ZCTA5", 'L', 'A', OFTString, 126, 130, 5, 1, 1, 1 },
281 : { "ZCTA3", 'L', 'A', OFTString, 131, 133, 3, 1, 1, 1 },
282 : { "TAZ", 'L', 'A', OFTString, 134, 139, 6, 1, 1, 1 },
283 : { "TAZCOMB", 'L', 'A', OFTString, 140, 145, 6, 1, 1, 1 },
284 : { "UA", 'L', 'N', OFTInteger, 146, 150, 5, 1, 1, 1 },
285 : { "UR", 'L', 'A', OFTString, 151, 151, 1, 1, 1, 1 },
286 : { "VTD", 'R', 'A', OFTString, 152, 157, 6, 1, 1, 1 },
287 : { "SLDU", 'R', 'A', OFTString, 158, 160, 3, 1, 1, 1 },
288 : { "SLDL", 'R', 'A', OFTString, 161, 163, 3, 1, 1, 1 },
289 : { "UGA", 'L', 'A', OFTString, 164, 168, 5, 1, 1, 1 },
290 : };
291 : static const TigerRecordInfo rtS_2002_info =
292 : {
293 : rtS_2002_fields,
294 : sizeof(rtS_2002_fields) / sizeof(TigerFieldInfo),
295 : 168
296 : };
297 :
298 :
299 : static const TigerFieldInfo rtS_2000_Redistricting_fields[] = {
300 : { "FILE", 'L', 'N', OFTString, 6, 10, 5, 0, 0, 1 },
301 : { "STATE", 'L', 'N', OFTInteger, 6, 7, 2, 0, 0, 1 },
302 : { "COUNTY", 'L', 'N', OFTInteger, 8, 10, 3, 0, 0, 1 },
303 : { "CENID", 'L', 'A', OFTString, 11, 15, 5, 0, 0, 1 },
304 : { "POLYID", 'R', 'N', OFTInteger, 16, 25, 10, 0, 0, 1 },
305 : { "WATER", 'L', 'N', OFTString, 26, 26, 1, 1, 1, 1 },
306 : { "CMSAMSA", 'L', 'N', OFTInteger, 27, 30, 4, 1, 1, 1 },
307 : { "PMSA", 'L', 'N', OFTInteger, 31, 34, 4, 1, 1, 1 },
308 : { "AIANHH", 'L', 'N', OFTInteger, 35, 39, 5, 1, 1, 1 },
309 : { "AIR", 'L', 'N', OFTInteger, 40, 43, 4, 1, 1, 1 },
310 : { "TRUST", 'L', 'A', OFTString, 44, 44, 1, 1, 1, 1 },
311 : { "ANRC", 'L', 'A', OFTInteger, 45, 46, 2, 1, 1, 1 },
312 : { "STATECU", 'L', 'N', OFTInteger, 47, 48, 2, 1, 1, 1 },
313 : { "COUNTYCU", 'L', 'N', OFTInteger, 49, 51, 3, 1, 1, 1 },
314 : { "FCCITY", 'L', 'N', OFTInteger, 52, 56, 5, 1, 1, 1 },
315 : { "FMCD", 'L', 'N', OFTInteger, 57, 61, 5, 0, 0, 1 },
316 : { "FSMCD", 'L', 'N', OFTInteger, 62, 66, 5, 1, 1, 1 },
317 : { "PLACE", 'L', 'N', OFTInteger, 67, 71, 5, 1, 1, 1 },
318 : { "CTBNA00", 'L', 'N', OFTInteger, 72, 77, 6, 1, 1, 1 },
319 : { "BLK00", 'L', 'N', OFTString, 78, 81, 4, 1, 1, 1 },
320 : { "RS10", 'R', 'N', OFTInteger, 82, 82, 0, 0, 1, 1 },
321 : { "CDCU", 'L', 'N', OFTInteger, 83, 84, 2, 1, 1, 1 },
322 :
323 : { "SLDU", 'R', 'A', OFTString, 85, 87, 3, 1, 1, 1 },
324 : { "SLDL", 'R', 'A', OFTString, 88, 90, 3, 1, 1, 1 },
325 : { "UGA", 'L', 'A', OFTString, 91, 95, 5, 1, 1, 1 },
326 : { "BLKGRP", 'L', 'N', OFTInteger, 96, 96, 1, 1, 1, 1 },
327 : { "VTD", 'R', 'A', OFTString, 97, 102, 6, 1, 1, 1 },
328 : { "STATECOL", 'L', 'N', OFTInteger, 103, 104, 2, 1, 1, 1 },
329 : { "COUNTYCOL", 'L', 'N', OFTInteger, 105, 107, 3, 1, 1, 1 },
330 : { "BLOCKCOL", 'R', 'N', OFTInteger, 108, 112, 5, 1, 1, 1 },
331 : { "BLKSUFCOL", 'L', 'A', OFTString, 113, 113, 1, 1, 1, 1 },
332 : { "ZCTA5", 'L', 'A', OFTString, 114, 118, 5, 1, 1, 1 }
333 :
334 : };
335 :
336 : static const TigerRecordInfo rtS_2000_Redistricting_info =
337 : {
338 : rtS_2000_Redistricting_fields,
339 : sizeof(rtS_2000_Redistricting_fields) / sizeof(TigerFieldInfo),
340 : 120
341 : };
342 :
343 : static const TigerFieldInfo rtS_fields[] = {
344 : { "FILE", 'L', 'N', OFTString, 6, 10, 5, 0, 0, 1 },
345 : { "STATE", 'L', 'N', OFTInteger, 6, 7, 2, 0, 0, 1 },
346 : { "COUNTY", 'L', 'N', OFTInteger, 8, 10, 3, 0, 0, 1 },
347 : { "CENID", 'L', 'A', OFTString, 11, 15, 5, 0, 0, 1 },
348 : { "POLYID", 'R', 'N', OFTInteger, 16, 25, 10, 0, 0, 1 },
349 :
350 : { "WATER", 'L', 'N', OFTString, 26, 26, 1, 1, 1, 1 },
351 : { "CMSAMSA", 'L', 'N', OFTInteger, 27, 30, 4, 1, 1, 1 },
352 : { "PMSA", 'L', 'N', OFTInteger, 31, 34, 4, 1, 1, 1 },
353 : { "AIANHH", 'L', 'N', OFTInteger, 35, 39, 5, 1, 1, 1 },
354 : { "AIR", 'L', 'N', OFTInteger, 40, 43, 4, 1, 1, 1 },
355 : { "TRUST", 'L', 'A', OFTString, 44, 44, 1, 1, 1, 1 },
356 : { "ANRC", 'L', 'A', OFTInteger, 45, 46, 2, 1, 1, 1 },
357 : { "STATECU", 'L', 'N', OFTInteger, 47, 48, 2, 1, 1, 1 },
358 : { "COUNTYCU", 'L', 'N', OFTInteger, 49, 51, 3, 1, 1, 1 },
359 : { "FCCITY", 'L', 'N', OFTInteger, 52, 56, 5, 1, 1, 1 },
360 : { "FMCD", 'L', 'N', OFTInteger, 57, 61, 5, 0, 0, 1 },
361 : { "FSMCD", 'L', 'N', OFTInteger, 62, 66, 5, 1, 1, 1 },
362 : { "PLACE", 'L', 'N', OFTInteger, 67, 71, 5, 1, 1, 1 },
363 : { "CTBNA00", 'L', 'N', OFTInteger, 72, 77, 6, 1, 1, 1 },
364 : { "BLK00", 'L', 'N', OFTString, 78, 81, 4, 1, 1, 1 },
365 : { "RS10", 'R', 'N', OFTInteger, 82, 82, 0, 0, 1, 1 },
366 : { "CDCU", 'L', 'N', OFTInteger, 83, 84, 2, 1, 1, 1 },
367 :
368 : { "STSENATE", 'L', 'A', OFTString, 85, 90, 6, 1, 1, 1 },
369 : { "STHOUSE", 'L', 'A', OFTString, 91, 96, 6, 1, 1, 1 },
370 : { "VTD00", 'L', 'A', OFTString, 97, 102, 6, 1, 1, 1 }
371 : };
372 : static const TigerRecordInfo rtS_info =
373 : {
374 : rtS_fields,
375 : sizeof(rtS_fields) / sizeof(TigerFieldInfo),
376 : 120
377 : };
378 :
379 : /************************************************************************/
380 : /* TigerPolygon() */
381 : /************************************************************************/
382 :
383 7 : TigerPolygon::TigerPolygon( OGRTigerDataSource * poDSIn,
384 7 : const char * pszPrototypeModule )
385 :
386 : {
387 7 : poDS = poDSIn;
388 7 : poFeatureDefn = new OGRFeatureDefn( "Polygon" );
389 7 : poFeatureDefn->Reference();
390 7 : poFeatureDefn->SetGeomType( wkbNone );
391 :
392 7 : fpRTS = NULL;
393 7 : bUsingRTS = TRUE;
394 :
395 7 : if( poDS->GetVersion() >= TIGER_2004 ) {
396 7 : psRTAInfo = &rtA_2004_info;
397 0 : } else if( poDS->GetVersion() >= TIGER_2003 ) {
398 0 : psRTAInfo = &rtA_2003_info;
399 0 : } else if( poDS->GetVersion() >= TIGER_2002 ) {
400 0 : psRTAInfo = &rtA_2002_info;
401 : } else {
402 0 : psRTAInfo = &rtA_info;
403 : }
404 :
405 7 : if( poDS->GetVersion() >= TIGER_2002 ) {
406 7 : psRTSInfo = &rtS_2002_info;
407 0 : } else if( poDS->GetVersion() >= TIGER_2000_Redistricting ) {
408 0 : psRTSInfo = &rtS_2000_Redistricting_info;
409 : } else {
410 0 : psRTSInfo = &rtS_info;
411 : }
412 :
413 : /* -------------------------------------------------------------------- */
414 : /* Fields from type A record. */
415 : /* -------------------------------------------------------------------- */
416 :
417 7 : AddFieldDefns(psRTAInfo, poFeatureDefn);
418 :
419 : /* -------------------------------------------------------------------- */
420 : /* Add the RTS records if it is available. */
421 : /* -------------------------------------------------------------------- */
422 :
423 7 : if( bUsingRTS ) {
424 7 : AddFieldDefns(psRTSInfo, poFeatureDefn);
425 : }
426 7 : }
427 :
428 : /************************************************************************/
429 : /* ~TigerPolygon() */
430 : /************************************************************************/
431 :
432 7 : TigerPolygon::~TigerPolygon()
433 :
434 : {
435 7 : if( fpRTS != NULL )
436 3 : VSIFClose( fpRTS );
437 7 : }
438 :
439 : /************************************************************************/
440 : /* SetModule() */
441 : /************************************************************************/
442 :
443 23 : int TigerPolygon::SetModule( const char * pszModule )
444 :
445 : {
446 23 : if( !OpenFile( pszModule, "A" ) )
447 0 : return FALSE;
448 :
449 23 : EstablishFeatureCount();
450 :
451 : /* -------------------------------------------------------------------- */
452 : /* Open the RTS file */
453 : /* -------------------------------------------------------------------- */
454 23 : if( bUsingRTS )
455 : {
456 23 : if( fpRTS != NULL )
457 : {
458 14 : VSIFClose( fpRTS );
459 14 : fpRTS = NULL;
460 : }
461 :
462 23 : if( pszModule )
463 : {
464 : char *pszFilename;
465 :
466 16 : pszFilename = poDS->BuildFilename( pszModule, "S" );
467 :
468 16 : fpRTS = VSIFOpen( pszFilename, "rb" );
469 :
470 16 : CPLFree( pszFilename );
471 :
472 16 : nRTSRecLen = EstablishRecordLength( fpRTS );
473 : }
474 : }
475 :
476 23 : return TRUE;
477 : }
478 :
479 : /************************************************************************/
480 : /* GetFeature() */
481 : /************************************************************************/
482 :
483 26674 : OGRFeature *TigerPolygon::GetFeature( int nRecordId )
484 :
485 : {
486 : char achRecord[OGR_TIGER_RECBUF_LEN];
487 :
488 26674 : if( nRecordId < 0 || nRecordId >= nFeatures )
489 : {
490 : CPLError( CE_Failure, CPLE_FileIO,
491 : "Request for out-of-range feature %d of %sA",
492 0 : nRecordId, pszModule );
493 0 : return NULL;
494 : }
495 :
496 : /* -------------------------------------------------------------------- */
497 : /* Read the raw record data from the file. */
498 : /* -------------------------------------------------------------------- */
499 26674 : if( fpPrimary == NULL )
500 0 : return NULL;
501 :
502 26674 : if( VSIFSeek( fpPrimary, nRecordId * nRecordLength, SEEK_SET ) != 0 )
503 : {
504 : CPLError( CE_Failure, CPLE_FileIO,
505 : "Failed to seek to %d of %sA",
506 0 : nRecordId * nRecordLength, pszModule );
507 0 : return NULL;
508 : }
509 :
510 26674 : if( VSIFRead( achRecord, nRecordLength, 1, fpPrimary ) != 1 )
511 : {
512 : CPLError( CE_Failure, CPLE_FileIO,
513 : "Failed to read record %d of %sA",
514 0 : nRecordId, pszModule );
515 0 : return NULL;
516 : }
517 :
518 : /* -------------------------------------------------------------------- */
519 : /* Set fields. */
520 : /* -------------------------------------------------------------------- */
521 :
522 26674 : OGRFeature *poFeature = new OGRFeature( poFeatureDefn );
523 :
524 26674 : SetFields( psRTAInfo, poFeature, achRecord );
525 :
526 : /* -------------------------------------------------------------------- */
527 : /* Read RTS record, and apply fields. */
528 : /* -------------------------------------------------------------------- */
529 :
530 26674 : if( fpRTS != NULL )
531 : {
532 : char achRTSRec[OGR_TIGER_RECBUF_LEN];
533 :
534 26674 : if( VSIFSeek( fpRTS, nRecordId * nRTSRecLen, SEEK_SET ) != 0 )
535 : {
536 : CPLError( CE_Failure, CPLE_FileIO,
537 : "Failed to seek to %d of %sS",
538 0 : nRecordId * nRTSRecLen, pszModule );
539 0 : return NULL;
540 : }
541 :
542 26674 : if( VSIFRead( achRTSRec, psRTSInfo->nRecordLength, 1, fpRTS ) != 1 )
543 : {
544 : CPLError( CE_Failure, CPLE_FileIO,
545 : "Failed to read record %d of %sS",
546 0 : nRecordId, pszModule );
547 0 : return NULL;
548 : }
549 :
550 26674 : SetFields( psRTSInfo, poFeature, achRTSRec );
551 :
552 : }
553 :
554 26674 : return poFeature;
555 : }
556 :
557 : /************************************************************************/
558 : /* SetWriteModule() */
559 : /************************************************************************/
560 :
561 4444 : int TigerPolygon::SetWriteModule( const char *pszFileCode, int nRecLen,
562 : OGRFeature *poFeature )
563 :
564 : {
565 : int bSuccess;
566 :
567 4444 : bSuccess = TigerFileBase::SetWriteModule( pszFileCode, nRecLen, poFeature);
568 4444 : if( !bSuccess )
569 0 : return bSuccess;
570 :
571 : /* -------------------------------------------------------------------- */
572 : /* Open the RT3 file */
573 : /* -------------------------------------------------------------------- */
574 4444 : if( bUsingRTS )
575 : {
576 4444 : if( fpRTS != NULL )
577 : {
578 4443 : VSIFClose( fpRTS );
579 4443 : fpRTS = NULL;
580 : }
581 :
582 4444 : if( pszModule )
583 : {
584 : char *pszFilename;
585 :
586 4444 : pszFilename = poDS->BuildFilename( pszModule, "S" );
587 :
588 4444 : fpRTS = VSIFOpen( pszFilename, "ab" );
589 :
590 4444 : CPLFree( pszFilename );
591 : }
592 : }
593 :
594 4444 : return TRUE;
595 : }
596 :
597 : /************************************************************************/
598 : /* CreateFeature() */
599 : /************************************************************************/
600 :
601 4444 : OGRErr TigerPolygon::CreateFeature( OGRFeature *poFeature )
602 :
603 : {
604 : char szRecord[OGR_TIGER_RECBUF_LEN];
605 :
606 : /* -------------------------------------------------------------------- */
607 : /* Write basic data record ("RTA") */
608 : /* -------------------------------------------------------------------- */
609 :
610 4444 : if( !SetWriteModule( "A", psRTAInfo->nRecordLength+2, poFeature ) )
611 0 : return OGRERR_FAILURE;
612 :
613 4444 : memset( szRecord, ' ', psRTAInfo->nRecordLength );
614 :
615 4444 : WriteFields( psRTAInfo, poFeature, szRecord );
616 4444 : WriteRecord( szRecord, psRTAInfo->nRecordLength, "A" );
617 :
618 : /* -------------------------------------------------------------------- */
619 : /* Prepare S record. */
620 : /* -------------------------------------------------------------------- */
621 :
622 4444 : memset( szRecord, ' ', psRTSInfo->nRecordLength );
623 :
624 4444 : WriteFields( psRTSInfo, poFeature, szRecord );
625 4444 : WriteRecord( szRecord, psRTSInfo->nRecordLength, "S", fpRTS );
626 :
627 :
628 4444 : return OGRERR_NONE;
629 : }
630 :
|