Generating a KML with data from postgis and libkml
So right now I am working on an experimental project to produce a mashup with the electoral data down to the polling station level.
Right now, I imported the data from the Shapefile provided free of charge on Geogratis to a PostgreSQL w/ Postgis database.
I am then using the libkml library (with SWIG bindings) to merge the data from postgis. Postgis conveniently has a SQL function called "ST_AsKML()" that outputs the geometry as the corresponding KML code. Here is the code that I used:
#!/usr/bin/env python import sys import pg import kmlbase import kmldom import kmlengine def usage(): return 'usage: riding.py [fed_num]' def main(): if len(sys.argv) > 1: if len(sys.argv[1]) != 5: print usage() return False factory = kmldom.KmlFactory_GetFactory() docu = factory.CreateDocument() docu.set_name(sys.argv[1]) kml = factory.CreateKml() kml.set_feature(docu) conn = pg.connect('postgis', '127.0.0.1', 5432, None, None, 'DB_NAME', 'DB_PASS') rows = conn.query('SELECT pd_id, pd_num, pd_nbr_sfx, pd_type, adv_poll, ed_id, fed_num, ST_AsKML(the_geom) as boundary FROM pd308_a WHERE fed_num = %05d ORDER BY pd_num ' % int(sys.argv[1])) res = rows.dictresult() for poll in res: pl = factory.CreatePlacemark() pl.set_name(str(poll['pd_num'])) kmlfile,errors = kmlengine.KmlFile.CreateFromParse(poll['boundary']) mg = kmldom.AsMultiGeometry(kmlfile.get_root()) pl.set_geometry(mg) docu.add_feature(pl) print kmldom.SerializePretty(kml) else: print usage() if __name__ == '__main__': main()
Run this on the command line with python (my version is 2.6). This code generates a KML file with all the different polls as separate placemarks for any given federal riding. For now, there is no styling or balloons.
Edit (2009-08-17): Here is the result if I randomize the polygon's colors.Download this generated KML (for Westmount--Ville-Marie - 24075)
Leave a comment