votdist.sml

  Download

More scripts: Advanced

Syntax Highlighing:

comments, key words, predefined symbols, class members & methods, functions & classes
            
## VOTDIST.SML 
## For vector object containing Voting Districts extracted from
## 1990 Census TIGER / Line files (which lack polygon attributes).  
## Checks line attributes in the Geo_Area_Codes table
## to find and verify voting district codes (string) for each polygon and
## writes the result into the polygon attribute table "Districts".
## The "Districts" Table must be set up previously
## with fields "PolyID" (integer) and "Voting_Dist" (string),
## with the Restriction option set to "Implied One-to-One"
## (which automatically creates a "blank" record for each polygon).
## Code verification involves determining the voting district code
## for the "inside" side of each line making up a polygon, then
## checking that all lines yield the same code for the polygon.
## (Codes are stored in an array for checking, which requires that
## the code character string be converted to a number first).
## Polygons whose lines yield inconsistent voting district codes
## are left unclassified, and an error statement is printed to the
## console window and to an error log file.  
 
## AUTHOR: Randy Smith, MicroImages, Inc.
## CREATION DATE: June 24, 1997
## REQUIRED TNTmips VERSION: 5.7 or later
clear();
vector V;
GetInputVector(V);
print ("Processing....");
class FILE errtext;
array numeric linelist[10];		# define array to contain list of line numbers for current polygon
errtext = fopen( "C:/temp/disterrs.txt", "a" );
numeric i, polyid;
numeric numlines, linenum;
numeric leftpoly, rightpoly;
numeric votingdistnum, allsame;
string votingdist$;
for each poly in V begin
	polyid = V.poly.Internal.ElemNum;		# assign current polygon number to variable
	# get list of lines making up current polygon and assign number of lines to variable
	numlines = GetVectorPolyLineList(V, linelist);
	array numeric distnums[numlines];		# define array to hold list of district numbers for polygon
		for i = 1 to numlines begin
			linenum = linelist[i];
			leftpoly = V.line[linenum].Internal.LeftPoly;			# get ID of polygon to left of line
			rightpoly = V.line[linenum].Internal.RightPoly; 	# get ID of polygon to right of line
			# check which side of line is the "inside" for the current polygon, and get the voting
			# district code from the appropriate string field (Voting_Dist_L or Voting_Dist_R) 
			# in the Geo_Area_Codes table. The field specification on right side of assignment
			# statement must have "$" at end to indicate that the database field should be
			# read as a string. 
			if ( leftpoly == polyid ) then
					votingdist$ = V.line[linenum].Geo_Area_Codes.Voting_Dist_L$;
			else
					votingdist$ = V.line[linenum].Geo_Area_Codes.Voting_Dist_R$;
			# convert voting district code to number for checking
			votingdistnum = StrToNum(votingdist$);
			# store voting district number for current line in array for checking
			distnums[i] = votingdistnum;
		end
		# loop to check that all district numbers in array are the same
		allsame = 1;			# error flag
		for i = 1 to numlines begin
			if ( distnums[1] != distnums[i] ) then
				begin
					allsame = 0;
					break;
				end
		end
		# if all voting district numbers are the same, 
		# write the PolyID, and Voting District code into the
		# respective fields in the polygon attribute table "Districts"
		if ( allsame == 1 ) then
			begin
				V.poly.Districts.PolyID = polyid;						# integer field
				V.poly.Districts.Voting_Dist$ = votingdist$;		# string field
			end
		else 
			begin
				printf("\nInconsistent voting district codes for polygon %d, not classified.", polyid );
				fprintf(errtext, "\nInconsistent voting district codes for polygon number %d, not classified ", polyid );
			end
end
fclose(errtext);
printf ("\nDone");