Как скопировать цветовой стиль в цветной столбец в таблице атрибутов слоя?

15

У меня есть слой многоугольника в QGIS, к которому я применил произвольный стиль цвета для каждого многоугольника. В разделе Свойства слоя -> Стиль я выбрал стиль по категориям, а затем сгенерировал случайную цветовую гамму. Я добавил цветной столбец в таблицу слоев. Существует ли способ автоматического копирования цвета, назначенного в стиле, в столбец цвета для каждого многоугольника в форме "# ff0000".

В конечном итоге я хочу экспортировать его в виде слоя GeoJSON и импортировать в виде листовки. Цвет столбца будет устанавливать цвет в листовке.

user2956607
источник

Ответы:

22

Вы можете использовать PyQGIS для этого (хотя не уверен, что это лучшее решение).

Выберите (или активируйте) слой в QGIS ToC, откройте консоль QGIS Python и скопируйте этот фрагмент кода:

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 )

Я предполагаю, что ваше поле для хранения цветов называется «цвет». После запуска я получил это:

введите описание изображения здесь

Дайте мне знать, если у вас возникнут какие-либо проблемы.

Герман Каррильо
источник
Есть ли возможность сделать это для RGB?
Диого Карибе
Конечно. Вместо звонка cat.symbol().color().name()сделайте что-то вроде этого:str(cat.symbol().color().red()) +','+ str(cat.symbol().color().green()) +','+ str(cat.symbol().color().blue())
Герман Каррильо
Тем не менее действует в QGIS 3.6, кроме API переименования rendererV2 -> визуализатор
Sabas
Не работал на QGis 3.6 здесь. Я переименовал rendererV2 в renderer, но не сработал.
Паладини