Usando o mapeamento de campo para RGB para simbologia no QGIS?

10

Usando o QGIS versão 1.7.

Eu tenho um arquivo de texto sem formatação que lista um conjunto de valores rgb em relação a um código. Eu quero usar essa tabela de cores para colorir uma camada de polígono, mapeando um de seus campos de atributo ('map_symb') para um código no arquivo de texto.

a tabela de cores é muito longa e fica assim:

$ head gsv1Msymbology.txt
MAPCODE RED GREEN   BLUE
Oc  143 255 255
WAT 255 255 255
Qa  244 250 202
Qdl 195 239 218
Na  248 255 238
Qd2 227 255 190
Qxw 248 255 238
Qns 255 148 83
Qn  255 202 190
.... 

Quero corresponder meu atributo 'map_symb' a um valor em MAPCODE e usar os valores RGB correspondentes para colorir os polígonos.

Existe uma maneira de fazer isso?

um ben diferente
fonte
1
Eu enviei
underdark
Veja esta pergunta e respostas para soluções: gis.stackexchange.com/questions/15185/…
um ben diferente
Isto é implementado de QGIS 2.0 em diante como dados definidos simbologia: gis.stackexchange.com/questions/60450/...
ANDREJ

Respostas:

10

Você pode usar o Python com o módulo ElementTree:

from string import *
from xml.etree import cElementTree as ET

class symbol:
    def __init__(self,b=[]):
            self.typec= typec
            self.b = b
            self.key = ['MAPCODE','R','G','B']
            self.data = dict(zip(self.key,self.b))
            self.symb = ET.SubElement(typec,"symbol")
            self.lower = ET.SubElement(self.symb, "lowervalue")
            self.upper = ET.SubElement(self.symb, "uppervalue")
            self.outline = ET.SubElement(self.symb,"outlinecolor")
            self.outsty = ET.SubElement(self.symb, "outlinestyle")
            self.outtail = ET.SubElement(self.symb, "outlinewidth")
            self.fillc = ET.SubElement(self.symb,"fillcolor")
            self.fillp = ET.SubElement(self.symb,"fillpattern")

    def creation(self):
            self.lower.text = self.data['MAPCODE']
            self.upper.text = self.data['MAPCODE']
            self.outsty.text="SolidLine"
            self.outtail.text="0.26"
            self.outline.set("red",str(self.data['R']))
            self.outline.set("green",str(self.data['G']))
            self.outline.set("blue",str(self.data['B']))
            self.fillc.set("red",str(self.data['R']))
            self.fillc.set("green",str(self.data['G']))
            self.fillc.set("blue",str(self.data['B']))
            self.fillp.text = "SolidPattern"

# QML file creation
intro = ET.Element("qgis")
transp = ET.SubElement(intro,"transparencyLevelInt")
transp.text = '255'
classatr = ET.SubElement(intro, "classificationattribute")
classatr.text= "MAPCODE"
typec = ET.SubElement(intro,"uniquevalue")
classif = ET.SubElement(typec,"classificationfield")
classif.text="MAPCODE"

# RGB file processing              
def main():
    file = "RGB.txt"
    f= open(file,"r")
    while 1 :
        line = f.readline()
        if not line :
            break
        elem = split(line,',') #or tab, or space, or
        symboltag = symbol(elem)
        symboltag.creation()
     result = ET.ElementTree(intro)
     result.write("RGB.qml")

if __name__ == '__main__':
    main()

O arquivo de estilo gerado por este script é (e funciona):

  <qgis>
  <transparencyLevelInt>255</transparencyLevelInt>
   <classificationattribute>MAPCODE</classificationattribute>
   <uniquevalue>
      <classificationfield>MAPCODE</classificationfield>
         <symbol>
             <lowervalue>Oc</lowervalue>
             <uppervalue>Oc</uppervalue>
             <outlinecolor blue="143" green="255" red="255" />
             <outlinestyle>SolidLine</outlinestyle>
             <outlinewidth>0.26</outlinewidth>
             <fillcolor blue="143" green="255" red="255"/>
             <fillpattern>SolidPattern</fillpattern>
          </symbol>
          <symbol>
             <lowervalue>WAT</lowervalue>
             <uppervalue>WAT</uppervalue>
             <outlinecolor blue="255" green="255" red="255" />
             <outlinestyle>SolidLine</outlinestyle>
             <outlinewidth>0.26</outlinewidth>
             <fillcolor blue="255" green="255" red="255" /> 
             <fillpattern>SolidPattern</fillpattern>
          </symbol>
              and so...
   </uniquevalue>
</qgis>

Você também pode usar o módulo shapefile ([shapefile]) 1 para shapefiles com colunas RGB

import shapefile ....
[....]
noduplicates = []

def main():
sf = shapefile.Reader("RGBshape")
for rec in enumerate(sf.records()):
    if rec[1][0] not in noduplicates:
        noduplicates.append(rec[1][0])
        symboltag = symbol(rec[1])
        symboltag.creation()      
    else:
        continue

e entao...

gene
fonte
14

Na versão posterior do QGIS, é mais fácil executar a tarefa solicitada.

Basta abrir Propriedades da camada, guia Estilo e verifique se Símbolo único está selecionado. Clique na caixa ao lado da cor "Preencher" e escolha "Editar".

Você estará editando a cor base de suas bases poligonais nas cores RGB presentes na tabela de dados, com uma cor de borda constante (você pode aplicar os mesmos critérios, se necessário).

Depois de pressionar "Edit", basta colocar os 3 nomes das colunas RGB da sua tabela usando a seguinte expressão:

color_rgb ("coluna R", "coluna G", "coluna B")

Ok, Aplicar e pronto.

Se você precisar rotular e caracterizar os dados da mesma maneira (por exemplo, para criar uma legenda), basta usar a opção Categorizada e aplicar a mesma expressão ao Símbolo e à Coluna, identificados na imagem abaixo.

insira a descrição da imagem aqui

zemigl
fonte
5

Se você deseja classificar alguns dados vetoriais de maneira repetitiva, eis o que você pode fazer:

  • Carregue seu vetor no QGIS.
  • Clique com o botão direito do mouse na camada no painel "Camadas", no lado esquerdo da tela.
  • Clique em "Propriedades" no menu que aparece.
  • Clique na guia "Estilo" na janela que aparece.
  • Deve haver um item da lista suspensa na tela que diz "Símbolo único". Clique nele e altere seu valor para "Categorizado".
  • O layout da interface será alterado, fornecendo uma nova opção denominada "Coluna". Clique nele e selecione o campo "map_symb".
  • Clique no botão "Classificar" abaixo do grande campo vazio. O campo vazio será preenchido com o conteúdo da coluna "map_symb" no seu conjunto de dados.
  • Clique duas vezes nos símbolos que você deseja alterar. Na janela que aparece, clique no botão "Alterar".
  • Isso permite alterar a cor para o valor do atributo especificado.
  • Continue fazendo isso até alterar as cores conforme necessário.
  • Quando terminar, convém salvar o estilo clicando no botão "Salvar estilo ...". Isso permitirá que você aplique o mesmo estilo a qualquer outro conjunto de dados, apenas clicando em "Carregar estilo ..." quando estiver na mesma janela. Isso pode ser o que você estava tentando alcançar vinculando o arquivo de texto ao conjunto de dados, o que não é possível no AFAIK. Depois de salvar o estilo, você poderá usá-lo nos seguintes conjuntos de dados (assumindo que eles tenham os mesmos valores de atributo). Se você abrir o arquivo salvo do estilo, verá que é apenas texto sem formatação, que pode ser editado, se desejar. Obviamente, é possível escrever esse arquivo em qualquer editor de texto, mas é mais rápido e fácil fazê-lo via GUI.
  • Clique em "Aplicar" para ver suas alterações e em "OK" para fechar a janela Propriedades da camada.
R Thiede
fonte
1
Parece muito trabalho quando o OP já possui uma tabela com as cores desejadas. Existe alguma maneira de ir da tabela original para o formato "Salvar estilo" diretamente?
Andy W
1
Na verdade é fácil. É assim que você normalmente classifica dados vetoriais em qualquer GIS. Estou começando com uma tela em branco e descrevendo cada clique do mouse, apenas para evitar confusão. Obviamente, você pode escrever sua especificação de cores no formato Estilo desde o início. É simples e bastante legível por humanos. Mas isso não é muito portátil e não funcionará se você digitar um erro de digitação. Apenas faça isso com a GUI. Depois de salvar o arquivo de estilo, você pode modificá-lo em um editor de texto e evitar a dor de cabeça de navegar em uma GUI.
precisa saber é o seguinte
1
Andy pega pelas bolas; existem centenas de MAPCODEs. E sim, eu sei como fazê-lo manualmente.
um ben diferente
Ah entendo. Bem, nesse caso, você pode classificar apenas uma pequena parte dos seus MAPCODEs, como três deles. Em seguida, salve o estilo. Em seguida, abra o arquivo de estilo e veja como ele está formatado. Em seguida, basta escrever um script (digamos, Python) para iterar o arquivo MAPCODE, linha por linha, e convertê-lo no formato do arquivo de estilo, que você poderá aplicar ao seu mapa. Não conheço um script existente que faça isso e, infelizmente, estou no meio de um projeto; portanto, não tenho tempo para fazê-lo agora. Mas se alguém poderia retirá-lo, seria bom tê-lo publicado aqui como uma resposta :)
R Thiede