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