mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-11-04 00:04:25 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			109 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/bin/env python3
 | 
						|
"""
 | 
						|
/***************************************************************************
 | 
						|
                               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-style.xml"
 | 
						|
dbfile = "../resources/symbology-style.db"
 | 
						|
 | 
						|
_symbol = "CREATE TABLE symbol("\
 | 
						|
          "id INTEGER PRIMARY KEY,"\
 | 
						|
          "name TEXT UNIQUE,"\
 | 
						|
          "xml TEXT,"\
 | 
						|
          "favorite INTEGER)"
 | 
						|
 | 
						|
_colorramp = "CREATE TABLE colorramp("\
 | 
						|
             "id INTEGER PRIMARY KEY,"\
 | 
						|
             "name TEXT UNIQUE,"\
 | 
						|
             "xml TEXT,"\
 | 
						|
             "favorite INTEGER)"
 | 
						|
 | 
						|
_tag = "CREATE TABLE tag("\
 | 
						|
       "id INTEGER PRIMARY KEY,"\
 | 
						|
       "name TEXT)"
 | 
						|
 | 
						|
_tagmap = "CREATE TABLE tagmap("\
 | 
						|
          "tag_id INTEGER NOT NULL,"\
 | 
						|
          "symbol_id INTEGER)"
 | 
						|
 | 
						|
_ctagmap = "CREATE TABLE ctagmap("\
 | 
						|
           "tag_id INTEGER NOT NULL,"\
 | 
						|
           "colorramp_id INTEGER)"
 | 
						|
 | 
						|
_smartgroup = "CREATE TABLE smartgroup("\
 | 
						|
              "id INTEGER PRIMARY KEY,"\
 | 
						|
              "name TEXT,"\
 | 
						|
              "xml TEXT)"
 | 
						|
 | 
						|
create_tables = [_symbol, _colorramp, _tag, _tagmap, _ctagmap, _smartgroup]
 | 
						|
 | 
						|
# 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")
 | 
						|
    symbol_favorite = symbol.getAttribute("favorite")
 | 
						|
    if not symbol_favorite:
 | 
						|
        symbol_favorite = 0
 | 
						|
 | 
						|
    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(), symbol_favorite))
 | 
						|
conn.commit()
 | 
						|
 | 
						|
 | 
						|
# ColorRamps
 | 
						|
colorramps = dom.getElementsByTagName("colorramp")
 | 
						|
for ramp in colorramps:
 | 
						|
    ramp_name = ramp.getAttribute("name")
 | 
						|
    symbol_favorite = symbol.getAttribute("favorite")
 | 
						|
    if not symbol_favorite:
 | 
						|
        symbol_favorite = 0
 | 
						|
 | 
						|
    c.execute("INSERT INTO colorramp VALUES (?,?,?,?)", (None, ramp_name, ramp.toxml(), symbol_favorite))
 | 
						|
conn.commit()
 | 
						|
 | 
						|
# Finally close the sqlite cursor
 | 
						|
c.close()
 |