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:
# 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)
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)
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
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()