Puede usar Python con el módulo ElementTree:
from string import *
from xml.etree import cElementTree as ET
class symbol:
def __init__(self,b=[]):
self.typec= typec
self.b = b
self.key = ['MAPCODE','R','G','B']
self.data = dict(zip(self.key,self.b))
self.symb = ET.SubElement(typec,"symbol")
self.lower = ET.SubElement(self.symb, "lowervalue")
self.upper = ET.SubElement(self.symb, "uppervalue")
self.outline = ET.SubElement(self.symb,"outlinecolor")
self.outsty = ET.SubElement(self.symb, "outlinestyle")
self.outtail = ET.SubElement(self.symb, "outlinewidth")
self.fillc = ET.SubElement(self.symb,"fillcolor")
self.fillp = ET.SubElement(self.symb,"fillpattern")
def creation(self):
self.lower.text = self.data['MAPCODE']
self.upper.text = self.data['MAPCODE']
self.outsty.text="SolidLine"
self.outtail.text="0.26"
self.outline.set("red",str(self.data['R']))
self.outline.set("green",str(self.data['G']))
self.outline.set("blue",str(self.data['B']))
self.fillc.set("red",str(self.data['R']))
self.fillc.set("green",str(self.data['G']))
self.fillc.set("blue",str(self.data['B']))
self.fillp.text = "SolidPattern"
# QML file creation
intro = ET.Element("qgis")
transp = ET.SubElement(intro,"transparencyLevelInt")
transp.text = '255'
classatr = ET.SubElement(intro, "classificationattribute")
classatr.text= "MAPCODE"
typec = ET.SubElement(intro,"uniquevalue")
classif = ET.SubElement(typec,"classificationfield")
classif.text="MAPCODE"
# RGB file processing
def main():
file = "RGB.txt"
f= open(file,"r")
while 1 :
line = f.readline()
if not line :
break
elem = split(line,',') #or tab, or space, or
symboltag = symbol(elem)
symboltag.creation()
result = ET.ElementTree(intro)
result.write("RGB.qml")
if __name__ == '__main__':
main()
El archivo de estilo generado por este script es (y funciona):
<qgis>
<transparencyLevelInt>255</transparencyLevelInt>
<classificationattribute>MAPCODE</classificationattribute>
<uniquevalue>
<classificationfield>MAPCODE</classificationfield>
<symbol>
<lowervalue>Oc</lowervalue>
<uppervalue>Oc</uppervalue>
<outlinecolor blue="143" green="255" red="255" />
<outlinestyle>SolidLine</outlinestyle>
<outlinewidth>0.26</outlinewidth>
<fillcolor blue="143" green="255" red="255"/>
<fillpattern>SolidPattern</fillpattern>
</symbol>
<symbol>
<lowervalue>WAT</lowervalue>
<uppervalue>WAT</uppervalue>
<outlinecolor blue="255" green="255" red="255" />
<outlinestyle>SolidLine</outlinestyle>
<outlinewidth>0.26</outlinewidth>
<fillcolor blue="255" green="255" red="255" />
<fillpattern>SolidPattern</fillpattern>
</symbol>
and so...
</uniquevalue>
</qgis>
También puede usar el módulo shapefile ([shapefile]) 1 para shapefiles con columnas RGB
import shapefile ....
[....]
noduplicates = []
def main():
sf = shapefile.Reader("RGBshape")
for rec in enumerate(sf.records()):
if rec[1][0] not in noduplicates:
noduplicates.append(rec[1][0])
symboltag = symbol(rec[1])
symboltag.creation()
else:
continue
y entonces...