Created
May 28, 2012 10:01
-
-
Save tecoholic/2818279 to your computer and use it in GitHub Desktop.
[GSoC] Python Script which converts the symbols XML file to a SQLite DB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
""" | |
/*************************************************************************** | |
symbol_xml2db.py | |
------------------- | |
begin : 26-5-2012 | |
copyright : (C) 2012 by Arunmozhi | |
email : aruntheguy at gmail dot com | |
***************************************************************************/ | |
/*************************************************************************** | |
* * | |
* This program is free software; you can redistribute it and/or modify * | |
* it under the terms of the GNU General Public License as published by * | |
* the Free Software Foundation; either version 2 of the License, or * | |
* (at your option) any later version. * | |
* * | |
***************************************************************************/ | |
The script creates a sqlite3 Db for storing the symbols which will be | |
shipped with QGIS by default. It then converts symbols and colorramps | |
in the symbology_ng_style.xml to the database table entries. | |
""" | |
import sqlite3 | |
from xml.dom.minidom import parse, parseString | |
xmlfile = "../resources/symbology-ng-style.xml" | |
dbfile = "../resources/symbology-ng-style.db" | |
_symbol = "CREATE TABLE symbol("\ | |
"id INTEGER PRIMARY KEY,"\ | |
"name TEXT UNIQUE,"\ | |
"xml TEXT,"\ | |
"groupid INTEGER)" | |
_colorramp = "CREATE TABLE colorramp("\ | |
"id INTEGER PRIMARY KEY,"\ | |
"name TEXT,"\ | |
"xml TEXT)" | |
_tag = "CREATE TABLE tag("\ | |
"id INTEGER PRIMARY KEY,"\ | |
"name TEXT)" | |
_tagmap = "CREATE TABLE tagmap("\ | |
"tag_id INTEGER NOT NULL,"\ | |
"symbol_id INTEGER)" | |
_symgroup = "CREATE TABLE symgroup("\ | |
"id INTEGER PRIMARY KEY,"\ | |
"name TEXT,"\ | |
"parent INTEGER)" | |
create_tables = [ _symbol, _colorramp, _tag, _tagmap, _symgroup ] | |
# Create the DB with required Schema | |
conn = sqlite3.connect( dbfile ) | |
c = conn.cursor() | |
print "Creating tables in the Database\n" | |
for table in create_tables: | |
try: | |
c.execute( table ) | |
print table | |
except sqlite3.OperationalError as e: | |
pass | |
conn.commit() | |
# parse the XML file & write symbol into DB | |
dom = parse( xmlfile ) | |
symbols = dom.getElementsByTagName( "symbol" ) | |
for symbol in symbols: | |
symbol_name = symbol.getAttribute( "name" ) | |
if '@' in symbol_name: | |
parts = symbol_name.split('@') | |
parent_name = parts[1] | |
layerno = int(parts[2]) | |
c.execute( "SELECT xml FROM symbol WHERE name=(?)", (parent_name,) ) | |
symdom = parseString( c.fetchone()[0] ).getElementsByTagName( 'symbol' )[0] | |
symdom.getElementsByTagName( "layer" )[ layerno ].appendChild( symbol ) | |
c.execute( "UPDATE symbol SET xml=? WHERE name=?", ( symdom.toxml(), parent_name )) | |
else: | |
c.execute( "INSERT INTO symbol VALUES (?,?,?,?)", ( None, symbol_name, symbol.toxml(), None ) ) | |
conn.commit() | |
# ColorRamps | |
colorramps = dom.getElementsByTagName( "colorramp" ) | |
for ramp in colorramps: | |
ramp_name = ramp.getAttribute( "name" ) | |
c.execute( "INSERT INTO colorramp VALUES (?,?,?)", ( None, ramp_name, ramp.toxml() ) ) | |
conn.commit() | |
# Finally close the sqlite cursor | |
c.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment