Vous utilisez la cartographie champ-RVB pour la symbologie dans QGIS?

10

Utilisation de QGIS version 1.7.

J'ai un fichier texte qui répertorie un ensemble de valeurs RVB par rapport à un code. Je souhaite utiliser cette table de couleurs pour colorer une couche de polygones en mappant l'un de ses champs d'attributs ('map_symb') à un code dans le fichier texte.

la table des couleurs est très longue et ressemble à ceci:

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

Je veux faire correspondre mon attribut 'map_symb' à une valeur dans MAPCODE et utiliser les valeurs RVB correspondantes pour colorer les polygones.

Existe-t-il un moyen intuitif de le faire?

un ben différent
la source
1
J'ai déposé une demande de fonctionnalité pour cela: hub.qgis.org/issues/4339
underdark
Voir cette question et réponses pour des solutions: gis.stackexchange.com/questions/15185/…
un autre ben
Ceci est implémenté à partir de QGIS 2.0 en tant que symbologie définie par les données: gis.stackexchange.com/questions/60450/…
AndreJ

Réponses:

10

Vous pouvez utiliser Python avec le module 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()

Le fichier de style généré par ce script est (et cela fonctionne):

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

Vous pouvez également utiliser le module shapefile ([shapefile]) 1 pour les fichiers de formes avec des colonnes RVB

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

et donc...

gène
la source
14

Sur les versions ultérieures de QGIS, il est plus facile d'effectuer la tâche demandée.

Ouvrez simplement les propriétés de calque, l'onglet Style et assurez-vous que le symbole unique est sélectionné. Cliquez sur la case à côté de la couleur "Remplir" et choisissez "Modifier".

Vous éditez la couleur de base de vos bases polygonales sur les couleurs RVB présentes sur le tableau de données, avec une couleur de bordure constante (vous pouvez appliquer les mêmes critères si besoin).

Après avoir cliqué sur "Modifier", mettez simplement les 3 noms de colonnes RVB de votre table en utilisant l'expression suivante:

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

Ok, postulez et c'est fait.

Si vous devez étiqueter et caractériser les données de la même manière (par exemple, pour créer une légende), utilisez simplement l'option Catégorisée et appliquez la même expression au Symbole et à la Colonne, identifiées dans l'image ci-dessous.

entrez la description de l'image ici

zemigl
la source
5

Si vous souhaitez classer certaines données vectorielles de manière reproductible, voici ce que vous pouvez faire:

  • Chargez votre vecteur dans QGIS.
  • Faites un clic droit sur le calque dans le volet "Calques" sur le côté gauche de l'écran.
  • Cliquez sur "Propriétés" dans le menu qui apparaît.
  • Cliquez sur l'onglet "Style" dans la fenêtre qui apparaît.
  • Il devrait y avoir un élément de liste déroulante sur l'écran qui dit "Symbole unique". Cliquez dessus et changez sa valeur en "Catégorisé".
  • La disposition de l'interface va changer, vous donnant une nouvelle option intitulée "Colonne". Cliquez dessus et sélectionnez le champ "map_symb".
  • Cliquez sur le bouton "Classifier" sous le grand champ vide. Le champ vide sera rempli avec le contenu de la colonne "map_symb" de votre jeu de données.
  • Double-cliquez sur les symboles que vous souhaitez modifier. Dans la fenêtre qui apparaît, cliquez sur le bouton intitulé "Modifier".
  • Cela vous permet de changer la couleur de la valeur d'attribut donnée.
  • Continuez ainsi jusqu'à ce que vous ayez changé les couleurs comme requis.
  • Lorsque vous avez terminé, vous pouvez enregistrer le style en cliquant sur le bouton "Enregistrer le style ...". Cela vous permettra d'appliquer le même style à tout autre ensemble de données, simplement en cliquant sur "Charger le style ..." dans cette même fenêtre. C'est peut-être ce que vous tentiez de réaliser en liant le fichier texte au jeu de données, ce qui n'est pas possible AFAIK. Cependant, une fois le style enregistré, vous pourrez l'utiliser sur tous les jeux de données suivants (en supposant qu'ils aient les mêmes valeurs d'attribut). Si vous ouvrez le fichier de sauvegarde du style, vous verrez qu'il ne s'agit que de texte brut, que vous pouvez modifier si vous le souhaitez. Il est bien sûr possible d'écrire ce fichier vous-même dans n'importe quel éditeur de texte, mais c'est plus rapide et plus facile à faire via l'interface graphique.
  • Cliquez sur "Appliquer" pour voir vos modifications et sur "OK" pour fermer la fenêtre Propriétés de la couche.
R Thiede
la source
1
Cela semble être un travail énorme quand l'OP a déjà une table des couleurs souhaitées. Existe-t-il de toute façon de passer directement du tableau d'origine au format "Save Style"?
Andy W
1
En fait, c'est facile. C'est ainsi que vous classifiez normalement les données vectorielles dans n'importe quel SIG. Je commence avec une toile vierge et décris chaque clic de souris, juste pour éviter toute confusion. Vous pouvez, bien sûr, écrire votre spécification de couleur au format Style dès le départ. C'est simple et assez lisible par l'homme. Mais ce n'est pas très portable et ne fonctionnera pas si vous faites une faute de frappe. Faites-le simplement avec l'interface graphique. Une fois que vous avez enregistré le fichier de style, vous pouvez le modifier dans un éditeur de texte et vous épargner le mal de tête de naviguer dans une interface graphique.
R Thiede
1
Andy l'a par les balles; il y a des centaines de MAPCODE. Et oui, je sais comment le faire manuellement.
un autre ben
Ah, je vois. Eh bien, dans ce cas, vous souhaiterez peut-être classer seulement une petite partie de vos MAPCODE, comme trois d'entre eux. Enregistrez ensuite le style. Ouvrez ensuite le fichier de style et regardez comment il est formaté. Il vous suffit ensuite d'écrire un script (par exemple en Python) pour parcourir le fichier MAPCODE ligne par ligne et le convertir au format du fichier de style, que vous pouvez ensuite appliquer à votre carte. Je ne suis pas au courant d'un script existant qui fait cela et, malheureusement, je suis au milieu d'un projet, donc je n'ai pas le temps de le faire moi-même pour le moment. Mais si quelqu'un pouvait le retirer, ce serait bien de l'avoir affiché ici comme réponse :)
R Thiede