import shapelib, dbflib, shptree
#
# The the shapefile module
#
def make_shapefile(filename):
# Create a shapefile with polygons
outfile = shapelib.create(filename, shapelib.SHPT_POLYGON)
# Create one very simple polygon and write it to the shapefile. The
# vertices should be given in clockwise order to comply with the
# shapefile specification.
obj = shapelib.SHPObject(shapelib.SHPT_POLYGON, 1,
[[(10, 10), (10, 20), (20, 20), (10, 10)]])
print obj.extents()
print obj.vertices()
outfile.write_object(-1, obj)
# Create a polygon with a hole. Note that according to the
# shapefile specification, the vertices of the outer ring have to be
# in clockwise order and the inner rings have to be in counter
# clockwise order.
#
# There's an optional fourth parameter which when given must be a
# list of part types, one for each part of the shape. For polygons,
# the part type is always shapelib.SHPP_RING, though. The part
# types are only relevant for SHPT_MULTIPATCH shapefiles.
obj = shapelib.SHPObject(shapelib.SHPT_POLYGON, 1,
[[(0, 0), (0, 40), (40, 40), (40, 0), (0, 0)],
[(10, 10), (20, 10), (20, 20), (10, 20),(10, 10)],
])
print obj.extents()
print obj.vertices()
outfile.write_object(-1, obj)
# close the file.
outfile.close()
def read_shapefile(filename):
# open the shapefile
shp = shapelib.ShapeFile(filename)
# the info method returns a tuple (num_shapes, type, min, max) where
# num_shapes is the number of shapes, type is the type code (one of
# the SHPT* constants defined in the shapelib module) and min and
# max are 4-element lists with the min. and max. values of the
# vertices.
print shp.info()
# read_object reads a shape
obj = shp.read_object(0)
# The vertices method returns the shape as a list of lists of tuples.
print obj.vertices()[0][:10]
# The extents returns a tuple with two 4-element lists with the min.
# and max. values of the vertices.
print obj.extents()
# The type attribute is the type code (one of the SHPT* constants
# defined in the shapelib module)
print obj.type
# The id attribute is the shape id
print obj.id
# the cobject method returns a PyCObject containing the shapelib
# SHPHandle. This is useful for passing shapefile objects to
# C-Python extensions.
print shp.cobject()
# build a quad tree from the shapefile. The first argument must be
# the return value of the shape file object's cobject method (this
# is currently needed to access the shape file at the C-level). The
# second argument is the dimension and the third the maximum depth.
# 0 means to guess an appropriate depth
tree = shptree.SHPTree(shp.cobject(), 2, 0)
# Retrieve the ids for a region. Here we just use the extents of the
# object previously read from the shapefile
minima, maxima = obj.extents()
print tree.find_shapes(minima[:2], maxima[:2])
make_shapefile("testfile")
read_shapefile("testfile")
#
# Test the DBF file module.
#
def make_dbf(file):
# create a new dbf file and add three fields.
dbf = dbflib.create(file)
dbf.add_field("NAME", dbflib.FTString, 20, 0)
dbf.add_field("INT", dbflib.FTInteger, 10, 0)
dbf.add_field("FLOAT", dbflib.FTDouble, 10, 4)
def add_dbf_records(file):
# add some records to file
dbf = dbflib.open(file, "r+b")
# Records can be added as a dictionary...
dbf.write_record(0, {'NAME': "Weatherwax", "INT":1, "FLOAT":3.1415926535})
# ... or as a sequence
dbf.write_record(1, ("Ogg", 2, -1000.1234))
def list_dbf(file):
# print the contents of a dbf file to stdout
dbf = dbflib.DBFFile(file)
print "%d records, %d fields" % (dbf.record_count(), dbf.field_count())
format = ""
for i in range(dbf.field_count()):
type, name, len, decc = dbf.field_info(i)
if type == 0:
format = format + " %%(%s)%ds" % (name, len)
elif type == 1:
format = format + " %%(%s)%dd" % (name, len)
elif type == 2:
format = format + " %%(%s)%dg" % (name, len)
print format
for i in range(dbf.record_count()):
print format % dbf.read_record(i)
make_dbf("testfile")
add_dbf_records("testfile")
list_dbf("testfile")