]> gitweb.michael.orlitzky.com - dead/census-tools.git/blobdiff - src/SummaryFile1.py
Uppercased GeoRecord.MINIMUM_LINE_LENGTH in accordance with PEP 8: http://python...
[dead/census-tools.git] / src / SummaryFile1.py
index 50f23ad0c96a83227137d60c7ff0fd2a4057efe8..bd69d0095137d30caff160fbed0cea2567530040 100644 (file)
@@ -3,13 +3,15 @@ import os, GPS, inspect
 class RecordError(StandardError):
     pass
 
+class InvalidAreaError(StandardError):
+    pass
 
 class GeoRecord:
     """
     This class wraps one record in an SF1 geo file.
     """
 
-    MinimumLineLength = 400
+    MINIMUM_LINE_LENGTH = 400
 
 
 class Block:
@@ -25,6 +27,7 @@ class Block:
         # if the input string cannot be converted o the specified
         # type.
         self.block_number = int(geo_record.block)
+        self.tract_number = int(geo_record.tract)
         self.population = int(geo_record.pop100)
         self.area_land = float(geo_record.arealand)
         self.area_water = float(geo_record.areawatr)
@@ -33,6 +36,9 @@ class Block:
         self.coordinates.latitude = float(geo_record.intptlat)
         self.coordinates.longitude = float(geo_record.intptlon)
 
+        if (self.total_area() == 0):
+            raise InvalidAreaError('A block may not have zero area.')
+        
 
     def total_area(self):
         return (self.area_land + self.area_water)
@@ -75,6 +81,10 @@ class GeoRecordParser:
                 block = Block(record)
                 blocks.append(block)
             except ValueError:
+                # A value couldn't be converted to the appropriate type.
+                continue
+            except InvalidAreaError:
+                # Something is funny with the geometry.
                 continue
             
         return blocks
@@ -88,8 +98,8 @@ class GeoRecordParser:
         allow the GeoRecord class to parse the data meaningfully and
         throw an error if something doesn't look right.
         """
-        if (len(line) < GeoRecord.MinimumLineLength):
-            raise RecordError("The input line is too short. The SF1 specification requires a line length of %d characters; this line contains only %d characters" % (GeoRecord.MinimumLineLength, len(line)))
+        if (len(line) < GeoRecord.MINIMUM_LINE_LENGTH):
+            raise RecordError("The input line is too short. The SF1 specification requires a line length of %d characters; this line contains only %d characters" % (GeoRecord.MINIMUM_LINE_LENGTH, len(line)))
         
         record = GeoRecord()