#!/usr/bin/env python """ We take a Well-Known Text string and one or more KML files as parameters. We convert the WKT string to a polygon, and drag that polygon along the paths defined within the KML files. For each path, the result is another (longer) polygon, whose contained population is output. """ import os import site import sys # Basically, add '../src' to our path. # Needed for the imports that follow. site.addsitedir(os.path.dirname(os.path.abspath(sys.argv[0])) + '/../src') import Census import CLI import Configuration.Defaults import ExitCodes import Geometry import KML usage = '%prog [options] , [kml file #2,...]' # -h (help) Conflicts with -h HOSTNAME parser = CLI.default_option_parser(usage) # Use this module's docstring as the description. parser.description = __doc__.strip() parser.add_option('-s', '--srid', type="int", help="SRID of the input geometry. Defaults to %s." % Configuration.Defaults.SRID, default=Configuration.Defaults.SRID) (options, args) = parser.parse_args() if len(args) < 2: print """ ERROR: You must supply both a Well-Known Text string, and a KML file containing a linestring. """ parser.print_help() print '' # Print a newline raise SystemExit(ExitCodes.NOT_ENOUGH_ARGS) wkt_string = args[0] paths = args[1:] for path in paths: f = open(path, 'r') kml = f.read() f.close() coords = KML.LineString.tuples_from_kml(kml) p = Geometry.Polygon.from_wkt(wkt_string) death_tube = None for i in range(len(coords) - 1): # For each coordinate (except the last), we want to: # a) Translate our polygon to the coordinate. # b) Drag the polygon to the next coordinate. this_coord = Geometry.TwoVector(coords[i][0], coords[i][1]) next_coord = Geometry.TwoVector(coords[i+1][0], coords[i+1][1]) drag_vector = (next_coord - this_coord) tp = p.translate(this_coord) if (death_tube == None): death_tube = tp.drag(drag_vector) else: death_tube = death_tube.union(tp.drag(drag_vector)) cdb = Census.Database(options.host, options.database, options.username, options.srid) pop = cdb.find_contained_population(death_tube.wkt()) print "Path: %s; Population: %d" % (path, pop)