Como copiar o estilo de cores para uma coluna de cores na tabela de atributos de uma camada?

15

Eu tenho uma camada de polígono no QGIS que apliquei um estilo aleatório de cores em cada polígono. Em Propriedades da camada -> Estilo, selecionei um estilo categorizado e gerei uma rampa de cores aleatória. Adicionei uma coluna de cores à tabela de camadas. Existe uma maneira de copiar automaticamente a cor atribuída no estilo para a coluna de cores para cada polígono no formato "# ff0000".

Por fim, quero exportá-lo como uma camada GeoJSON e importá-lo para um mapa de folheto. A coluna de cores definirá a cor no folheto.

user2956607
fonte

Respostas:

22

Você pode usar o PyQGIS para isso (embora não tenha certeza da melhor solução).

Selecione (ou ative) a camada no QGIS ToC, abra o console do QGIS Python e copie este trecho 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 )

Presumo que seu campo para armazenar cores seja chamado de 'cor'. Depois de executá-lo, obtive o seguinte:

insira a descrição da imagem aqui

Deixe-me saber se você enfrentar algum problema.

Germán Carrillo
fonte
Existe a possibilidade de fazer isso para RGB?
Diogo Caribé
Certo. Em vez de ligar cat.symbol().color().name(), faça algo parecido com isto:str(cat.symbol().color().red()) +','+ str(cat.symbol().color().green()) +','+ str(cat.symbol().color().blue())
Germán Carrillo
Ainda no válida qgis 3.6, além do rendererV2 API renomeação -> processador
Sabas
Não funcionou no QGis 3.6 aqui. Renomeei o rendererV2 para renderizador, mas não funcionou.
Paladini