3 votos

Cómo guardar el VALOR del color en una tabla de atributos en QGIS para una capa vectorial con un renderizador de símbolos graduado

Intento conseguir esto -> ¿Cómo copiar el estilo de color en una columna de color de la tabla de atributos de una capa?

guión de @Germán Carrillo

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 )

pero después de usar ese script estoy recibiendo un error

Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'QgsGraduatedSymbolRendererV2' object has no attribute 'categories'

porque es para una capa clasificada con un Renderizador de Símbolos Categorizados.

Entonces el problema es que puedo usar este script solo con color aleatorio... Pero, ¿cómo hacer lo mismo gradiente de colores como ndvi -1 / 1

¿podría esto ayudarme? -> http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html#graduated-symbol-renderer

Primera vez que trabajo con python.....

EDIT : Qgis 2.10.1 - PISA EDIT : Añadir imagen

enter image description here

0 votos

¿Qué versión de QGIS utiliza?

0 votos

@ArMoraer Qgis 2.10.1 - PISA

0 votos

El problema es que la clase de renderizador es QgsCategorizedSymbolRendererV2 en lugar de QgsGraduatedSymbolRendererV2 . Por favor, vea mi respuesta.

3voto

Yada Puntos 9489

El problema es que la clase de renderizador es QgsCategorizedSymbolRendererV2 en lugar de QgsGraduatedSymbolRendererV2 . Así que categoricé el siguiente shapefile por el campo FID:

enter image description here

y se ejecutó un código idéntico (el script de Germán Carrillo) en la consola Python de QGIS:

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 ) 

Como se puede ver en la siguiente imagen, el resultado fue completamente satisfactorio (no estoy recibiendo ningún error):

enter image description here

Nota de edición:

Este es el código para Graduated Symbol Renderer:

layer = iface.activeLayer()

provider = layer.dataProvider()

renderer = layer.rendererV2()

feats = [ feat for feat in layer.getFeatures() ]
values = [ feat.attribute('FID')  for feat in feats ] #change for 'NDVI' in case of NDVI field

n = len(feats)

color_feats = [ renderer.symbolForValue(value).color().name() for value in values ]

idx = layer.fieldNameIndex('color')

for i, feat in enumerate(feats):
    new_values = {idx : color_feats[i]}
    provider.changeAttributeValues({i:new_values})

Después de ejecutarlo en la consola Python de QGIS, los valores en el campo 'color' se colocaron como se esperaba.

enter image description here

Utilizando el campo "NDVI" también funciona perfectamente:

enter image description here

0 votos

No puedo usar Categorizado realmente necesito graduado. He editado la pregunta y añadido la imagen

0voto

ABCD Puntos 126

OK tengo respuesta

aquí está el plugin hecho por @underdark

y aquí está en GitHub

¡Funciona bien! enter image description here

0voto

Geoffrey Puntos 228

Este código debería funcionar para un render graduado:

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().ranges():
    expr = "\""+attr+"\">="+prefix+unicode(cat.lowerValue())+prefix+'AND'+"\""+attr+"\"<="+prefix+unicode(cat.upperValue())+prefix
    for f in layer.getFeatures(QgsFeatureRequest(QgsExpression(expr))):
        attrMap = { fieldIndex : cat.symbol().color().name()}
        attrFeatMap[ f.id() ] = attrMap
layer.dataProvider().changeAttributeValues( attrFeatMap ) 

La única diferencia con tu código es el uso de la función ranges() en lugar de categories() y la ligera edición del expr porque esta vez no se trata de un único valor, sino de todo un rango de valores.

0 votos

Tu código da este error <pre>File "<input>", line 6 layer.dataProvider().changeAttributeValues( attrFeatMap ) ^ SyntaxError: invalid syntax<code> mira en mi respuesta hay un plugin hecho por underdark que funciona bien

0 votos

A mí me ha funcionado, he intentado copiarlo y pegarlo de nuevo.

0 votos

Tu código está mal. No funciona cuando el número de clases es menor que el número de características. QgsCategorizedSymbolRendererV2 tiene métodos diferentes en comparación con QgsGraduatedSymbolRendererV2 y por eso no funciona un algoritmo similar al guión de Germán Carrillo. Puedes ver mi Nota de edición .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X