简体   繁体   中英

Set categorized symbology in vector with different colors with pyQGIS

Use: windows 11, QGIS 3.16.14, python39

My reference: https://gis.stackexchange.com/a/347097/165037

I want to create a vector with the following color symbology:

在此处输入图像描述

in my vector "zone_fuse_comune_min_corr_ok" the symbology is given by the field "CLASSE".

"CLASSE" has three attribute: "S1', 'S2' or 'S3'

I have taken the code of https://gis.stackexchange.com/a/347097/165037 and I have adapted with my needs.

Here you can see:

zone_fuse_comune_min_corr_ok = processing.run("qgis:deletecolumn",
{'INPUT':'./zone_fuse_comune_min_corr.gpkg',
'COLUMN':['OSSERVAZIONI','comune_min','layer','path'],
'OUTPUT':'ogr:dbname=\'./zone_fuse_comune_min_corr_ok.gpkg\' table=\"zone_fuse_comune_min_corr_ok\" (geom)'})
zone_fuse_comune_min_corr_ok = QgsVectorLayer("./zone_fuse_comune_min_corr_ok.gpkg", "zone_fuse_comune_min_corr_ok", "ogr")
QgsProject.instance().addMapLayer(zone_fuse_comune_min_corr_ok)

#provide file name index and field's unique values
fni = zone_fuse_comune_min_corr_ok.fields().indexFromName('CLASSE')
unique_values = zone_fuse_comune_min_corr_ok.uniqueValues(fni)

#fill categories
categories = []
for unique_value in unique_values:
    #initialize the default symbol for this geometry type
    symbol = QgsSymbol.defaultSymbol(zone_fuse_comune_min_corr_ok.geometryType())
    #configure a symbol layer
    layer_style = {}
    layer_style['color'] = '#bed2ff'
    layer_style['outline'] = '#000000'
    symbol_layer = QgsSimpleFillSymbolLayer.create(layer_style)
    #replace default symbol layer with the configured one
    if symbol_layer is not None:
        symbol.changeSymbolLayer(0, symbol_layer)
    #create renderer object
    category = QgsRendererCategory(unique_value, symbol, str(unique_value))
    #entry for the list of category items
    categories.append(category)

#create renderer object
renderer = QgsCategorizedSymbolRenderer('CLASSE', categories)

#assign the created renderer to the layer
if renderer is not None:
    zone_fuse_comune_min_corr_ok.setRenderer(renderer)

zone_fuse_comune_min_corr_ok.triggerRepaint()

The unsatisfying result is:

在此处输入图像描述

I assume the problem arises from this code:

#configure a symbol layer
layer_style = {}
layer_style['color'] = '#bed2ff'
layer_style['outline'] = '#000000'
symbol_layer = QgsSimpleFillSymbolLayer.create(layer_style)

The color represents html color '#bed2ff'

Two problems (see last image):

  • I am not able to iterate and put a variable for layer_style['color'] and 'S1', 'S2' and 'S3' have all the same color '#bed2ff'.
  • I am not able to order the display of the values.'S1', 'S3' and 'S2' are in the wrong order instead of 'S1', 'S2' and 'S3' in the label.

I wait for suggestions.

I was able to answer now.

I found this code in https://gis.stackexchange.com/a/355383/165037 .

I adapted in this way and worked!

zone_fuse_comune_min_corr_ok = processing.run("qgis:deletecolumn",
{'INPUT':'./zone_fuse_comune_min_corr.gpkg',
'COLUMN':['OSSERVAZIONI','comune_min','layer','path'],
'OUTPUT':'ogr:dbname=\'./zone_fuse_comune_min_corr_ok.gpkg\' table=\"zone_fuse_comune_min_corr_ok\" (geom)'})
zone_fuse_comune_min_corr_ok = QgsVectorLayer("./zone_fuse_comune_min_corr_ok.gpkg", "zone_fuse_comune_min_corr_ok", "ogr")

feats = [ feat for feat in zone_fuse_comune_min_corr_ok.getFeatures() ]

fields_names = zone_fuse_comune_min_corr_ok.fields().names()
idx = fields_names.index('CLASSE')

colors = ['#bed2ff', '#bee8ff', '#beffe8']
unique_values = ['S1', 'S2', 'S3']
n=len(unique_values)

square = [QgsFillSymbol.createSimple({'color': colors[i], 
                                    'outline_color': 'black'}) 
                                    for i in range(n) ]

list = [QgsRendererCategory(unique_values[i],
        square[i].clone(), 
        unique_values[i], 
        True)
        for i in range(n)]

renderer = QgsCategorizedSymbolRenderer("CLASSE", list)

zone_fuse_comune_min_corr_ok.setRenderer(renderer)

zone_fuse_comune_min_corr_ok.triggerRepaint()
QgsProject.instance().addMapLayer(zone_fuse_comune_min_corr_ok)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM