Niveau | Intermédiaire |
Logiciels utilisés |
Python |
Plateforme | Windows | Mac | Linux | FreeBSD |
Récemment, deux questions similaires ont été posées sur gis.stackexchange.com/questions :
« How to use a field-to-RGB mapping for symbology in QGIS? » (gis.stackexchange.com/questions/15135/how-to-use-a-field-to-rgb-mapping-for-symbology-in-qgis/15299)
et
« How to create a style file for QGIS from a plain text file? »(gis.stackexchange.com/questions/15185/how-to-create-a-style-file-for-qgis-from-a-plain-text-file)
C'est à dire, comment utiliser les valeurs R,G,B situés dans des colonnes d'un fichier texte pour créer automatiquement un fichier style de Quantum GIS ?
Question à laquelle j'ai répondu (gis.stackexchange.com/questions/15135/how-to-use-a-field-to-rgb-mapping-for-symbology-in-qgis/15299#15299) avec des scripts en Python que je présente ici, sans utiliser QGIS.
Le type de fichier est un fichier délimité avec une colonne classe et des colonnes avec les valeurs R, G, B correspondantes. Mais il est aussi possible de le faire directement à partir de fichiers shapefiles avec les champs équivalents.
Les fichiers styles de Quantum GIS (QGIS)
Ce sont des fichiers XML qui paraissent complexes au premier abord (xxxx.qml figuré ici en partie) :
L'examen synthétique des balises utilisées est plus intéressant car il est possible de reconnaître toutes les caractéristiques disponibles dans les propriétés de QGIS :
Les balises les plus importantes, dans le cas qui nous concerne (polygones avec une couleur de fond), sont :
- <uniquevalue> -> classification par Valeur unique ;
- <classificationattribute> et <classificationfield> -> classe utilisée pour la classification (FORM ici) ;
- <uppervalue> et <lowervalue> valeur de la classe et étiquette;
- <outlinecolor> et <fillcolor> -> couleur(s) du contour et du remplissage avec les valeurs R,G,B
Il est dès lors tout à fait possible de recréer un fichier style simplifié en ne retenant que les balises désirées :
Le fichier style résultant (créé avec les scripts Python présentés dans la suite) marche avec toutes les versions de QGIS :
Création de fichiers styles avec Python
Comme ce sont des fichiers XML, il est donc possible de les créer automatiquement avec Python et le module ElementTree déjà examiné sur le Portail : « XML et Python pour les Sigistes ou pourquoi il n'y a pas besoin de réinventer la roue... », sans utiliser QGIS.
à partir d'un fichier texte délimité (colonnes : Classe, R, G, B)
Le fichier traité est le suivant (classe, valeur R, valeur G, valeur B)
AE,143,255,255
BOU,255,255,255
FAM,244,250,202
PP,195,239,218
etc.
(ce sont en fait des sigles de formations géologiques)
création automatique d'un fichier style à partir d'un fichier texte délimité
#!/usr/bin/env python # encoding: utf-8 """ creastyle.py permet la création de fichier style (.qml) de Quantum GIS à partir d'un fichier texte avec des valeurs RGB du type (FORM, R, G, B): AE,250,125,32 etc. par Martin Laloux version du 10/2011 pour le Portail SIG """ from xml.etree import cElementTree as ET from string import * """ création des élements de la balise qgis""" intro = ET.Element("qgis") transp = ET.SubElement(intro,"transparencyLevelInt") transp.text = '255' classatr = ET.SubElement(intro, "classificationattribute") classatr.text= "FORM" typec = ET.SubElement(intro,"uniquevalue") classif = ET.SubElement(typec,"classificationfield") classif.text="FORM" class symbol: """création des éléments de la balise symbole""" def __init__(self,valeurs=[]): self.typec= typec self.valeurs = valeurs self.cle = ['FORM','R','G','B'] self.donnees = dict(zip(self.cle,self.valeurs)) 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.donnees['FORM'] self.upper.text = self.donnees['FORM'] self.outsty.text="SolidLine" self.outtail.text="0.26" self.outline.set("red",self.donnees['R']) self.outline.set("green",self.donnees['G']) self.outline.set("blue",self.donnees['B']) self.fillc.set("red",self.donnees['R']) self.fillc.set("green",self.donnees['G']) self.fillc.set("blue",self.donnees['B']) self.fillp.text = "SolidPattern" def traitement(): """traitement du fichier texte et écriture du fichier style""" # ouverture du fichier texte et remplissage de la balise symbol fichier = "test.txt" for elem in [split(line,',') for line in open(fichier,"r")]: symb = symbol(elem) symb.creation() # écriture du ficher style final fich_style = ET.ElementTree(intro) fich_style.write("monstyle.qml") if __name__ == '__main__': traitement()
- 4954 lectures
Ce script génère le fichier style simplifié (qml) présenté plus haut.
à partir d'un fichier shapefile (champs : Classe, R, G, B)
Le module le plus simple à utiliser pour traiter les shapefiles en Python a aussi déjà été présenté sur le Portail : « Python et les shapefiles (suite) ou le module le plus simple à utiliser (un seul fichier, sans dépendance) ». C'est le module pyshp (Python Shapefile Library).
La table associée est la suivante (avec des doublons, courants dans les shapefiles, qu'il faut éliminer dans le fichier style résultant) :
La base du traitement est la même, hormis qu'il faut importer le module shapefile et l'utiliser dans
def traitement():
pour traiter les valeurs des champs du shapefile.
création automatique d'un fichier style à partir d'un fichier shapefile
#!/usr/bin/env python # encoding: utf-8 """ creastyle2.py permet la création de fichier style (.qml) de Quantum GIS à partir d'un fichier shapefile avec des champs du type (FORM, R, G, B): AE,250,125,32 etc. par Martin Laloux version du 10/2011 pour le Portail SIG """ from xml.etree import cElementTree as ET from string import * import shapefile _____________________________________________________ [....même script que le précédent...] _____________________________________________________ # traitement des doublons éventuels traités = [] def traitement(): """traitement du fichier shapefile et écriture du fichier style""" # ouverture du fichier shapefile et remplissage de la balise symbol sf = shapefile.Reader("essai") for rec in enumerate(sf.records()): if rec[1][0] not in traités: traités.append(rec[1][0]) symb = symbol(rec[1]) symb.creation() else: continue # écriture du ficher style final fich_style = ET.ElementTree(intro) fich_style.write("monstyle.qml") if __name__ == '__main__': traitement()
- 3714 lectures
Ce script génère aussi le fichier style simplifié (qml) présenté plus haut.
Résultat (« Charger le style »)
Conclusions
En pratique, j'utilise ces scripts depuis longtemps, mais avec un fichier-base SQLite contenant toutes les valeurs nécessaires avec les champs R,G, B, et des shapefiles, d'abord traités avec le module gdal/ogr puis avec le module shapefile (pyshp), beaucoup plus simple à utiliser. Cela me permet aussi d'ordonner les classes suivant l'ordre que je veux (stratigraphique). J'en utilise d'autres pour les éléments points et/ou (poly)lignes.
Une fois que la structure d'un fichier style est comprise et qu'on connait le résultat qu'on veut obtenir, c'est facile (il est possible de créer des fichiers pour tous les types de styles, de choisir les balises à figurer, etc.).
Tous les traitements ont été effectués sur Mac OS X et avec Python 2.6.1
Site officiel : XML et Python pour les Sigistes ou pourquoi il n'y a pas besoin de réinventer la roue...Site officiel : Python et les shapefiles (suite) ou le module le plus simple à utiliser (un seul fichier, sans dépendance)
Site officiel : pyshp (Python Shapefile Library)
licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique Commerciale 2.0 France
Commentaires
site plugin de QGIS
Les 2 scripts ont été publiés sur
plugins.qgis.org/snippets/
Poster un nouveau commentaire