Skip to content

Latest commit

 

History

History
115 lines (100 loc) · 4.22 KB

How to use a field-to-RGB mapping for symbology in QGIS?.md

File metadata and controls

115 lines (100 loc) · 4.22 KB

from How to use a field-to-RGB mapping for symbology in QGIS?

You can use Python with ElementTree module :

    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()
```python

The style file generated by this script is (and it works) :

>       <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>

You can also use the shapefile module ([shapefile])[1]  for shapefiles with RGB columns 

```python
    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

and so...