LCOV - code coverage report
Current view: directory - ogr/ogrsf_frmts/tiger - tigerpolygon.cpp (source / functions) Found Hit Coverage
Test: gdal_filtered.info Lines: 88 66 75.0 %
Date: 2011-12-18 Functions: 9 6 66.7 %

       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                 : 

Generated by: LCOV version 1.7