¿Cómo copiar el estilo de color a una columna de color en la tabla de atributos de una capa?

15

Tengo una capa de polígono en QGIS en la que he aplicado un estilo de color aleatorio a cada polígono. En Propiedades de capa -> Estilo, seleccioné un estilo categorizado y luego generé una rampa de color aleatorio. Agregué una columna de color a la tabla de capas. ¿Hay alguna manera de copiar automáticamente el color asignado en el estilo a la columna de color para cada polígono en la forma "# ff0000".

En última instancia, quiero exportarlo como una capa GeoJSON e importarlo en un mapa de folleto. La columna de color establecerá el color en el folleto.

usuario2956607
fuente

Respuestas:

22

Podría usar PyQGIS para eso (aunque no estoy seguro de cuál es la mejor solución).

Seleccione (o active) la capa en el QGIS ToC, abra la consola QGIS Python y copie este fragmento de código:

prefix = "'"
layer = iface.activeLayer()
attr = layer.rendererV2().classAttribute()
attrColor = 'color' # Name of the field to store colors
fieldIndex = layer.dataProvider().fieldNameIndex(attrColor)
attrFeatMap = {}

for cat in layer.rendererV2().categories(): 
  expr = "\""+attr+"\"="+prefix+unicode(cat.value())+prefix
  for f in layer.getFeatures(QgsFeatureRequest(QgsExpression(expr))):
    attrMap = { fieldIndex : cat.symbol().color().name()}
    attrFeatMap[ f.id() ] = attrMap

layer.dataProvider().changeAttributeValues( attrFeatMap )

Supongo que su campo para almacenar colores se llama 'color'. Después de ejecutarlo, obtuve esto:

ingrese la descripción de la imagen aquí

Avísame si tienes algún problema.

Germán Carrillo
fuente
¿Existe la posibilidad de hacerlo por RGB?
Diogo Caribé
Seguro. En lugar de llamar cat.symbol().color().name(), haga algo como esto:str(cat.symbol().color().red()) +','+ str(cat.symbol().color().green()) +','+ str(cat.symbol().color().blue())
Germán Carrillo
Todavía válido en qgis 3.6, aparte del cambio de nombre de la API rendererV2 -> renderer
sabas
No funcionó en QGis 3.6 aquí. Cambié el nombre de rendererV2 a renderer, pero no funcionó.
Paladini