Usando la mappatura da campo a RGB per la simbologia in QGIS?


10

Utilizzo di QGIS versione 1.7.

Ho un semplice file di testo che elenca un insieme di valori rgb rispetto a un codice. Voglio usare questa tabella di colori per colorare un livello poligonale mappando uno dei suoi campi degli attributi ('map_symb') su un codice nel file di testo.

la tabella dei colori è molto lunga e si presenta così:

$ 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
.... 

Voglio abbinare il mio attributo "map_symb" a un valore in MAPCODE e utilizzare i valori RGB corrispondenti per colorare i poligoni.

C'è un modo gui per farlo?


1
Ho presentato una richiesta di funzionalità per questo: hub.qgis.org/issues/4339
Sottosuolo

Vedi questa domanda e risposte per soluzioni: gis.stackexchange.com/questions/15185/…
un diverso ben

Questo è implementato da QGIS 2.0 in poi come simbologia definita dai dati: gis.stackexchange.com/questions/60450/…
AndreJ

Risposte:


10

Puoi usare Python con il modulo 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()

Il file di stile generato da questo script è (e funziona):

  <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>

È inoltre possibile utilizzare il modulo shapefile ([shapefile]) 1 per shapefile con colonne 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 così...


14

Nella versione successiva di QGIS è più semplice eseguire l'attività richiesta.

Basta aprire Proprietà livello, scheda Stile e assicurarsi che sia selezionato Singolo simbolo. Fai clic sulla casella accanto al colore "Riempi" e scegli "Modifica.

Modificherai il colore di base delle tue basi poligonali sui colori RGB presenti nella tabella dei dati, con un colore del bordo costante (puoi applicare gli stessi criteri se necessario).

Dopo aver premuto "Modifica" basta inserire i 3 nomi di colonne RGB della tabella usando la seguente espressione:

color_rgb ( "R-column", "G-column", "B-colonna")

Ok, applica e il gioco è fatto.

Se è necessario etichettare e caratterizzare i dati nello stesso modo (ad esempio, per creare una legenda), utilizzare l'opzione Classificata e applicare la stessa espressione al simbolo e alla colonna, identificati nell'immagine qui sotto.

inserisci qui la descrizione dell'immagine


5

Se vuoi classificare alcuni dati vettoriali in modo ripetibile, ecco cosa puoi fare:

  • Carica il tuo vettore in QGIS.
  • Fai clic con il pulsante destro del mouse sul livello nel riquadro "Livelli" sul lato sinistro dello schermo.
  • Fai clic su "Proprietà" nel menu visualizzato.
  • Fai clic sulla scheda "Stile" nella finestra visualizzata.
  • Dovrebbe esserci una voce di elenco a discesa sullo schermo che dice "Simbolo singolo". Cliccaci sopra e cambia il suo valore in "classificato".
  • Il layout dell'interfaccia cambierà, offrendoti una nuova opzione chiamata "Colonna". Cliccaci sopra e seleziona il campo "map_symb".
  • Fai clic sul pulsante "Classifica" sotto il campo vuoto grande. Il campo vuoto verrà popolato con il contenuto della colonna "map_symb" nel tuo set di dati.
  • Fare doppio clic sui simboli che si desidera modificare. Nella finestra che appare, fai clic sul pulsante "Modifica".
  • Ciò consente di modificare il colore per il valore dell'attributo indicato.
  • Continua fino a quando non hai cambiato i colori come richiesto.
  • Al termine, potresti voler salvare lo stile facendo clic sul pulsante "Salva stile ...". Ciò ti consentirà di applicare lo stesso stile a qualsiasi altro set di dati, semplicemente facendo clic su "Carica stile ..." nella stessa finestra. Questo potrebbe essere quello che stavi cercando di ottenere collegando il file di testo con il set di dati, il che non è possibile AFAIK. Dopo aver salvato lo stile, tuttavia, sarà possibile utilizzarlo su tutti i set di dati seguenti (supponendo che abbiano gli stessi valori di attributo). Se apri il file di salvataggio dello stile, vedrai che è solo un semplice testo, che puoi modificare se vuoi. È ovviamente possibile scrivere questo file da soli in qualsiasi editor di testo, ma è più facile e veloce farlo tramite la GUI.
  • Fai clic su "Applica" per visualizzare le modifiche e "OK" per chiudere la finestra Proprietà livello.

1
Sembra un sacco di lavoro quando l'OP ha già una tabella dei colori desiderati. Esiste un modo per passare dalla tabella originale a quello che è direttamente il formato "Salva stile"?
Andy W,

1
In realtà è facile. È così che classifichi normalmente i dati vettoriali in qualsiasi GIS. Sto iniziando con una tela bianca e descrivendo ogni clic del mouse, solo per evitare confusione. Ovviamente puoi scrivere le specifiche del colore nel formato Stile sin dall'inizio. È semplice e abbastanza leggibile dall'uomo. Ma non è molto portatile e non funzionerà se fai un refuso. Fallo solo con la GUI. Dopo aver salvato il file di stile, puoi modificarlo in un editor di testo e risparmiarti il ​​mal di testa di navigare in una GUI.
R Thiede,

1
Andy ce l'ha per le palle; ci sono centinaia di MAPCODE. E sì, so come farlo manualmente.
un diverso ben

Ah, capisco. Bene, in tal caso, potresti voler classificare solo una piccola parte dei tuoi MAPCODE, come tre di essi. Quindi salva lo stile. Quindi apri il file di stile e osserva come è formattato. Quindi basta scrivere uno script (in, diciamo, Python) per scorrere il file MAPCODE riga per riga e convertirlo nel formato del file di stile, che è quindi possibile applicare alla mappa. Non sono a conoscenza di uno script esistente che lo fa e sfortunatamente sono nel mezzo di un progetto, quindi non ho tempo di farlo da solo adesso. Ma se qualcuno potesse farlo, sarebbe bello averlo pubblicato qui come risposta :)
R Thiede
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.