Verwenden der Feld-zu-RGB-Zuordnung für die Symbologie in QGIS?

10

Verwenden von QGIS Version 1.7.

Ich habe eine einfache Textdatei, die eine Reihe von RGB-Werten für einen Code auflistet. Ich möchte diese Farbtabelle verwenden, um eine Polygonebene zu färben, indem ich eines ihrer Attributfelder ('map_symb') einem Code in der Textdatei zuordne.

Die Farbtabelle ist sehr lang und sieht folgendermaßen aus:

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

Ich möchte mein Attribut 'map_symb' einem Wert in MAPCODE zuordnen und die entsprechenden RGB-Werte zum Färben der Polygone verwenden.

Gibt es eine Möglichkeit, dies zu tun?

ein anderer ben
quelle
1
Ich habe eine Feature-Anfrage dafür eingereicht: hub.qgis.org/issues/4339
underdark
Siehe diese Frage & Antworten für Lösungen: gis.stackexchange.com/questions/15185/…
ein anderer ben
Dies wird ab QGIS 2.0 als datendefinierte
AndreJ

Antworten:

10

Sie können Python mit dem ElementTree-Modul verwenden:

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

Die von diesem Skript generierte Stildatei lautet (und funktioniert):

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

Sie können das Shapefile-Modul ([Shapefile]) 1 auch für Shapefiles mit RGB-Spalten verwenden

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

und so...

Gen
quelle
14

In einer späteren Version von QGIS ist es einfacher, die angeforderte Aufgabe auszuführen.

Öffnen Sie einfach die Ebeneneigenschaften und die Registerkarte "Stil" und stellen Sie sicher, dass "Einzelsymbol" ausgewählt ist. Klicken Sie auf das Feld neben der Farbe "Füllen" und wählen Sie "Bearbeiten".

Sie bearbeiten die Grundfarbe Ihrer Polygonbasis anhand der in der Datentabelle vorhandenen RGB-Farben mit einer konstanten Rahmenfarbe (Sie können bei Bedarf dieselben Kriterien anwenden).

Nachdem Sie auf "Bearbeiten" geklickt haben, geben Sie einfach die 3 RGB-Spaltennamen Ihrer Tabelle mit dem folgenden Ausdruck ein:

color_rgb ("R-Spalte", "G-Spalte", "B-Spalte")

Ok, bewerben und fertig.

Wenn Sie die Daten auf dieselbe Weise beschriften und charakterisieren müssen (z. B. um eine Legende zu erstellen), verwenden Sie einfach die Option Kategorisiert und wenden denselben Ausdruck auf das Symbol und die Spalte an, die im Bild unten angegeben sind.

Geben Sie hier die Bildbeschreibung ein

zemigl
quelle
5

Wenn Sie einige Vektordaten auf wiederholbare Weise klassifizieren möchten, können Sie Folgendes tun:

  • Laden Sie Ihren Vektor in QGIS.
  • Klicken Sie mit der rechten Maustaste auf die Ebene im Bereich "Ebenen" auf der linken Seite des Bildschirms.
  • Klicken Sie im angezeigten Menü auf "Eigenschaften".
  • Klicken Sie im angezeigten Fenster auf die Registerkarte "Stil".
  • Auf dem Bildschirm sollte sich ein Dropdown-Listenelement mit der Aufschrift "Einzelsymbol" befinden. Klicken Sie darauf und ändern Sie den Wert in "Kategorisiert".
  • Das Layout der Benutzeroberfläche ändert sich und Sie erhalten eine neue Option mit der Bezeichnung "Spalte". Klicken Sie darauf und wählen Sie das Feld "map_symb".
  • Klicken Sie auf die Schaltfläche "Klassifizieren" unter dem großen leeren Feld. Das leere Feld wird mit dem Inhalt der Spalte "map_symb" in Ihrem Dataset gefüllt.
  • Doppelklicken Sie auf die Symbole, die Sie ändern möchten. Klicken Sie im angezeigten Fenster auf die Schaltfläche "Ändern".
  • Auf diese Weise können Sie die Farbe für den angegebenen Attributwert ändern.
  • Machen Sie so lange weiter, bis Sie die Farben nach Bedarf geändert haben.
  • Wenn Sie fertig sind, können Sie den Stil speichern, indem Sie auf die Schaltfläche "Stil speichern ..." klicken. Auf diese Weise können Sie denselben Stil auf jedes andere Dataset anwenden, indem Sie in demselben Fenster lediglich auf "Stil laden ..." klicken. Dies haben Sie möglicherweise versucht, indem Sie die Textdatei mit dem Datensatz verknüpft haben, was AFAIK nicht möglich ist. Sobald Sie den Stil gespeichert haben, können Sie ihn für alle folgenden Datasets verwenden (vorausgesetzt, sie haben dieselben Attributwerte). Wenn Sie die Sicherungsdatei des Stils öffnen, sehen Sie, dass es sich nur um einfachen Text handelt, den Sie bei Bedarf bearbeiten können. Es ist natürlich möglich, diese Datei einfach selbst in einen beliebigen Texteditor zu schreiben, aber es ist schneller und einfacher, dies über die GUI zu tun.
  • Klicken Sie auf "Übernehmen", um Ihre Änderungen anzuzeigen, und auf "OK", um das Fenster "Ebeneneigenschaften" zu schließen.
R Thiede
quelle
1
Das scheint eine Menge Arbeit zu sein, wenn das OP bereits eine Tabelle mit den gewünschten Farben hat. Gibt es überhaupt eine Möglichkeit, von der Originaltabelle direkt zum Format "Stil speichern" zu wechseln?
Andy W
1
Eigentlich ist es einfach. So klassifizieren Sie normalerweise Vektordaten in einem GIS. Ich beginne mit einer leeren Leinwand und beschreibe jeden Mausklick, um Verwirrung zu vermeiden. Natürlich können Sie Ihre Farbspezifikation von Anfang an im Style-Format schreiben. Es ist einfach und ziemlich menschlich lesbar. Aber das ist nicht sehr portabel und funktioniert nicht, wenn Sie einen Tippfehler machen. Mach es einfach mit der GUI. Sobald Sie die Style-Datei gespeichert haben, können Sie sie in einem Texteditor ändern und sich die Kopfschmerzen beim Navigieren in einer GUI ersparen.
R Thiede
1
Andy hat es bei den Bällen; Es gibt Hunderte von MAPCODEs. Und ja, ich weiß, wie es manuell geht.
Ein anderer Ben
Ah ich sehe. In diesem Fall möchten Sie möglicherweise nur einen kleinen Teil Ihrer MAPCODEs wie drei davon klassifizieren. Speichern Sie dann den Stil. Öffnen Sie dann die Stildatei und sehen Sie sich an, wie sie formatiert ist. Schreiben Sie dann einfach ein Skript (z. B. in Python), um Ihre MAPCODE-Datei Zeile für Zeile zu durchlaufen, und konvertieren Sie es in das Format der Stildatei, das Sie dann auf Ihre Map anwenden können. Mir ist kein vorhandenes Skript bekannt, das dies tut, und leider bin ich mitten in einem Projekt. Ich habe also momentan keine Zeit, es selbst zu tun. Aber wenn jemand es schaffen könnte, wäre es schön, wenn es hier als Antwort veröffentlicht würde :)
R Thiede