6 votos

¿Por qué necesito usar etiquetado al establecer el color de relleno con un python expresión en QGIS?

Estoy teniendo problemas con una función de Python en el editor de expresiones al estilo de un polígono relleno en QGIS.

Estoy tratando de utilizar un azar de esquema de color. Sin embargo, tengo que hacerlo a través de una serie de diferentes mapas de diferentes puntos de la historia.

Necesito el color de "Noruega" a ser el mismo en todos los mapas, lo mismo que el color debe ser el mismo para "Alemania". No me importa cuál sea el color para cada país, sólo que es consistente entre las capas.

Para hacer esto, tengo una función de Python que utiliza el hash MD5 de la columna valor.

Esta función funciona, busca un atributo por su nombre y devuelve un "r,g,b,a" cadena basada en los 4 primeros bytes de la hash MD5:-

"""
Define new functions using @qgsfunction. feature and parent must always be the
last args. Use args=-1 to pass a list of values as arguments
"""

from qgis.core import *
from qgis.gui import *
import hashlib

@qgsfunction(args='auto', group='Custom')
def hashcolor(values, feature, parent):
    v = feature.attribute(values)
    if not v:
        v = "Null"
    h = hashlib.md5()
    h.update(v)
    hd = h.hexdigest()
    r = int(hd[0:2],16)
    g = int(hd[2:4],16)
    b = int(hd[4:6],16)
    return "{0},{1},{2},255".format(r,g,b)

Así, por ejemplo,

hashcolour('CNTRY') siempre devolverá 213,185,41,255 si el CNTRY campo contiene "Noruega"

Yo, a continuación, utilizar esta expresión como el color de relleno para mi polígonos.

enter image description here

Sin embargo, lo único que podría conseguir que esto funcione, si se cumplen ciertos criterios:-

  • Me han etiquetado de encendido para que la capa y
  • He utilizado "CNTRY" en algún lugar de la etiqueta de la expresión

No quiero etiquetas, y yo no sólo puede utilizar la cadena vacía, así que tuve que usar este hack en la expresión de etiqueta para que funcione:-

regexp_replace("CNTRY", '.*','')

¿Alguien puede explicar por qué necesito usar etiquetas en este modo para obtener un python-expresión definida de color a trabajar? Es esto un error, o un efectos secundarios de cómo el editor de expresiones se supone que funciona? Parece extraño que el etiquetado debe ser necesaria para permitir el polígono estilo...

(El programa de instalación : Ubuntu Trusty de 32 bits, QGIS 2.12.3-Lyon)

3voto

Ivan Petrushev Puntos 158

Puedo confirmar que el problema también en Fedora 23 de QGIS 2.10.1. Mirando función de pasar el nombre del campo a la función donde buscar el valor. La función del motor, a continuación, hace esto para cada registro en la tabla. Se puede analizar directamente el valor en uso "y no" si usted simplificar la función:

from qgis.core import *
from qgis.gui import *

import hashlib

@qgsfunction(args='auto', group='Custom')
def hashcolor(values, feature, parent):
    h = hashlib.md5()
    h.update(values)
    hd = h.hexdigest()
    r = int(hd[0:2],16)
    g = int(hd[2:4],16)
    b = int(hd[4:6],16)
    return "{0},{1},{2},255".format(r,g,b)

A continuación, pase el columnname como:

hashcolor( "CNTRY" )

Esto va a funcionar sin la extraña etiqueta truco.

En lugar de un hashcolor generador también se puede simplemente usar la normal clasificar el estilo de color en CNTRY y guardar el estilo para usar en el futuro en otros mapas donde el estilo puede ser cargado.

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