#!/usr/bin/perl # http://www.census.gov/support/SF1ASCII.html %CENSUSSTATES = (1 => AL, 2 => AK, 4 => AZ, 5 => AR, 6 => CA, 8 => CO, 9 => CT, 10 => DE, 11 => DC, 12 => FL, 13 => GA, 15 => HI, 16 => ID, 17 => IL, 18 => IN, 19 => IA, 20 => KS, 21 => KY, 22 => LA, 23 => ME, 24 => MD, 25 => MA, 26 => MI, 27 => MN, 28 => MS, 29 => MO, 30 => MT, 31 => NE, 32 => NV, 33 => NH, 34 => NJ, 35 => NM, 36 => NY, 37 => NC, 38 => ND, 39 => OH, 40 => OK, 41 => OR, 42 => PA, 44 => RI, 45 => SC, 46 => SD, 47 => TN, 48 => TX, 49 => UT, 50 => VT, 51 => VA, 53 => WA, 54 => WV, 55 => WI, 56 => WY, 60 => AS, 66 => GU, 69 => MP, 72 => PR, 78 => VI); my @FIELDS = split(/,/, "FILEID:6,STUSAB:2,SUMLEV:3,GEOCOMP:2,CHARITER:3,CIFSN:2,LOGRECNO:7,REGION:1,DIVISION:1,STATECE:2,STATE:2,COUNTY:3,COUNTYSC:2,COUSUB:5,COUSUBCC:2,COUSUBSC:2,PLACE:5,PLACECC:2,PLACEDC:1,PLACESC:2,TRACT:6,BLKGRP:1,BLOCK:4,IUC:2,CONCIT:5,CONCITCC:2,CONCITSC:2,AIANHH:4,AIANHHFP:5,AIANHHCC:2,AIHHTLI:1,AITSCE:3,AITS:5,AITSCC:2,ANRC:5,ANRCCC:2,MSACMSA:4,MASC:2,CMSA:2,MACCI:1,PMSA:4,NECMA:4,NECMACCI:1,NECMASC:2,EXI:1,UA:5,UASC:2,UATYPE:1,UR:1,CD106:2,CD108:2,CD109:2,CD110:2,SLDU:3,SLDL:3,VTD:6,VTDI:1,ZCTA3:3,ZCTA5:5,SUBMCD:5,SUBMCDCC:2,AREALAND:14,AREAWATR:14,NAME:90,FUNCSTAT:1,GCUNI:1,POP100:9,HU100:9,INTPLAT:9,INTPLON:10,LSADC:2,PARTFLAG:1,SDELEM:5,SDSEC:5,SDUNI:5,TAZ:6,UGA:5,PUMA5:5,PUMA1:5,RESERVE2:15,MACC:5,UACP:5,RESERVED:7"); foreach my $f (@FIELDS) { $f =~ /(\w+):(\d+)/; $f = $1; $FIELDSIZE{$f} = $2; } my %URI; # tracks the last state seen, the last county seen, etc. open STATE, ">states.n3"; open COUNTY, ">counties.n3"; open COUNTYSUB, ">towns.n3"; open COUNTYSUBPLACE, ">villages.n3"; foreach my $file (STATE, COUNTY, COUNTYSUB, COUNTYSUBPLACE) { print $file < . \@prefix dc: . \@prefix dcterms: . \@prefix geo: . \@prefix census: . \@prefix usgovt: . EOF } open CENSUS, "; chop $line; my $start = 0; my %info; foreach my $f (@FIELDS) { my $val = substr($line, $start, $FIELDSIZE{$f}); $val =~ s/^\s+//; $val =~ s/\s+$//; $start += $FIELDSIZE{$f}; $info{$f} = ESC($val); } if ($info{GEOCOMP} ne "00") { next; } if ($info{NAME} =~ / \(part\)/) { next; } my $file; my $isa; my $uri; my $parent; if ($info{SUMLEV} eq "010") { $file = "US"; $uri = "tag:govshare.info,2005:data/us"; $isa = ""; } elsif ($info{SUMLEV} eq "040") { $file = "STATE"; $parent = $URI{US}; $uri = "$URI{US}/" . lc($CENSUSSTATES{0+$info{STATE}}); $isa = "usgovt:State"; print lc($CENSUSSTATES{0+$info{STATE}}) . "\n"; } elsif ($info{SUMLEV} eq "050") { $file = "COUNTY"; $parent = $URI{STATE}; $uri = "$URI{STATE}/counties/" . URI($info{NAME}); $isa = "usgovt:County"; } elsif ($info{SUMLEV} eq "060") { $file = "COUNTYSUB"; $parent = $URI{COUNTY}; $uri = "$URI{COUNTY}/" . URI($info{NAME}); $isa = "usgovt:Town"; } elsif ($info{SUMLEV} eq "070") { $file = "COUNTYSUBPLACE"; if ($info{NAME} =~ /Remainder of/) { next; } $parent = $URI{COUNTYSUB}; $uri = "$URI{COUNTYSUB}/" . URI($info{NAME}); $isa = "usgovt:Village"; } else { next; } $URI{$file} = $uri; $info{STATEUSPS} = $CENSUSSTATES{0+$info{STATE}}; my $file2 = $file; if ($file eq "US") { $file = "STATE" } # Put the US node in the states file $info{INTPLAT} /= 1000000; $info{INTPLON} /= 1000000; print $file "<$uri> \n"; print $file " rdf:type $isa ;\n"; print $file " usgovt:censusStateCode \"$info{STATECE}\" ;\n" if ($file2 eq "STATE"); print $file " usgovt:fipsStateCode \"$info{STATE}\" ;\n" if ($file2 eq "STATE"); print $file " usgovt:uspsStateCode \"$info{STATEUSPS}\" ;\n" if ($file2 eq "STATE"); print $file " usgovt:fipsCountyCode \"$info{COUNTY}\" ;\n" if ($file2 eq "COUNTY"); print $file " usgovt:fipsStateCountyCode \"$info{STATE}:$info{COUNTY}\" ;\n" if ($file2 eq "COUNTY"); print $file " dc:title \"$info{NAME}\" ;\n" if ($file2 ne "US"); print $file " dcterms:isPartOf <$parent> ;\n" if ($file2 ne "US"); print $file " geo:lat \"$info{INTPLAT}\" ;\n" if ($file ne "STATE"); print $file " geo:long \"$info{INTPLON}\" ;\n" if ($file ne "STATE"); print $file " census:population \"$info{POP100}\" ;\n"; print $file " census:households \"$info{HU100}\" ;\n"; print $file " census:landArea \"$info{AREALAND} m^2\" ;\n"; print $file " census:waterArea \"$info{AREAWATR} m^2\" .\n"; } close CENSUS; close STATE; close COUNTY; close COUNTYSUB; close COUNTYSUBPLACE; sub ESC { my $lit = shift; $lit =~ /([^ A-Za-z0-9\+\-().,\/'#x])/; #if (defined($1)) { warn $1; } return $lit; } sub URI { my $name = shift; $name = lc($name); $name =~ s/\.//g; $name =~ s/ county//g; $name =~ s/ town//g; $name =~ s/ city//g; $name =~ s/ ccd//g; $name =~ s/ cdp//g; $name =~ s/\W/_/g; return $name; }