Definição De Simbologia Através De Campo RGBA

30 de Setembro, 2015

Este post aborda o processo de configuração de simbologia através do atributo RGBA, permite ultrapassar uma limitação do QGIS, que se encontra ainda por resolver (http://hub.qgis.org/issues/11491). Resultou da necessidade de produzir a simbologia oficial para a carta de ocupação de solos Corine Land Cover (CLC) com base nos valores RGB.

Objetivo inicial:

Simbolizar a carta de ocupação de solos Corine Land Cover 2006 (CLC2006), por classes utilizando o sistema de cores RGBA.

A preparação da informação consistiu:

  1. União da tabela de atributos da CLC2006 com a tabela da nomenclatura que possuía os valores RGB. (Fig. 1)
    Unir as camadas
  2. Criação de novo campo denominado [rbga] do tipo texto com a concatenação dos campos R, G, B e a criação do parâmetro A (alfa) que corresponde ao grau de opacidade (Fig. 2).
    Unir as camadas
    Nota: Os valores do campo devem variar entre 0 e 255 separados por vírgula, o valor da opacidade é 255 para todas as classes (Fig. 3)
    Unir as camadas
  3. Com a coluna rgba criada na tabela de atributos, procedeu-se à configuração do estilo.
    Unir as camadas

Problema

O mapa aparece corretamente simbolizado, mas a legenda não reflete as categorias criadas, todas aparecem a negro, não permitindo uma interpretação correta da informação.

Unir as camadas

Identificou-se que se trata-se de uma limitação do QGIS, que se encontra ainda por resolver (http://hub.qgis.org/issues/11491)

Solução

Criar um script python que faça a associação da cor à classe respetiva.

Com a ajuda do Alexandre Neto do grupo de utilizadores do QGIS PT, que produziu o seguinte script, é possível ultrapassar com sucesso o problema. Script disponível aqui.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from PyQt4.QtGui import QColor

iface = qgis.utils.iface
mc = iface.mapCanvas()

layer = mc.currentLayer()
features = layer.getFeatures()

color_dict = dict()

for feature in features:
    cat = feature.attribute('designacao')
    rgba_value = feature.attribute('rbga')
    color_dict[cat] = rgba_value

renderer = layer.rendererV2()
categories = renderer.categories()

for category in categories:
    value = category.value()
    cat_id = renderer.categoryIndexForValue(value)
    print cat_id
    if value != u'':
        rgba = color_dict[value].split(',')
        rgba = [int(i) for i in rgba ]
        color = QColor(rgba[0],rgba[1],rgba[2],rgba[3])

        symbol = category.symbol()
        symbol.setColor(color)
        renderer.updateCategorySymbol(cat_id,symbol)

mc.refresh()
qgis.utils.iface.legendInterface().refreshLayerSymbology(layer)

Procedimentos de utilização do script:

  1. Abrir a consola python (Módulos > Consola Python);
  2. Abrir consola
  3. Dentro da consola abrir o script;
  4. Abrir script
  5. Editar as linhas 12 e 13 e adaptar ao nome das colunas relativas ao campo das categorias e ao campo com os valores RBGA. Gravar.
  6. Editar campos do script
  7. Definir estilo categorizado utilizando o campo respetivo;
  8. Definir estilo categorizado
  9. Desativar a opção Substituir dados definidos;
  10. Desligar o data-defined properties
  11. Correr o script.
  12. Correr o script

Resultado final

Mapa corretamente simbolizado com a respetiva legenda!

Mapa corretamente simbolizado com a respetiva legenda

Simbologia CLC2006 em .QML

Para aqueles que apenas necessitam da legenda da CLC2006, podem descarregar aqui a simbologia no formato qml.

Espero que tenha sido útil, Bom trabalho !

Manuela Sampayo

REFERÊNCIAS

http://www.dgterritorio.pt/cartografia_e_geodesia/cartografia/cartografia_tematica/cartas_de_ocupacao_do_solo/corine_land_cover/

Manuela Sampayo
Blog desenvolvido com Octopress