Une fois une couche chargée, on souhaite le plus souvent accéder aux données contenues dans la couche, soit les géométries, soit les attributs. Nous verrons ici comment coder en Python l’accès à ces deux types de données.
Accéder à la géométrie d’une couche vecteur
Nous allons reprendre le script de chargement d’un shapefile crée précédemment (charger_vecteur.py)
# to the run_script function. See the Help for
# complete information on how to create a script
# and use Script Runner.
« » » Your Description of the script goes here « » »
# Some commonly used imports
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from qgis.gui import *
def run_script(iface):
qfd = QFileDialog()
title = ‘Ouvrir un fichier’
path = « C:/ »
f = QFileDialog.getOpenFileName(qfd, title, path)
layer = QgsVectorLayer(f, « Musees de la ville de New York », « ogr »)
if not layer.isValid():
print « erreur de chargement de la couche %s » % layer.name()
QgsMapLayerRegistry.instance().addMapLayers([layer])
Remplacez la dernière ligne
QgsMapLayerRegistry.instance().addMapLayers([layer])
par
feat=features.next()
g=feat.geometry()
print g.asPoint()
On évite de charger la couche dans QGis et on affiche dans la console Python les coordonnées x et y du premier point de la couche.
Le script doit ressembler à ça:
La procédure est la suivante:
features=layer.getFeatures()
Crée un pointeur nommé features sur la couche layer
feat=features.next()
On déplace le curseur sur l’entité suivante, ici c’est la première entité de la table et on charge cette entité dans l’objet feat.
g=feat.geometry()
Charge la géométrie de l’entité courante du curseur dans l’objet g.
Une fois exécuté, on obtient le résultat dans la console Python:
On pourrait accéder par d’autres moyens à la géométrie d’une entité, mais l’utilisation des pointeurs dans Python permet de travailler sur des volumes de données très importants sans charger toute la table en mémoire.
Ici on a chargé un fichier shapefile, mais quelle qu’elle soit la source de données, une fois créée la couche (layer) le code Python ne change pas.
Accéder aux attributs d’une couche vecteur
Pour accéder aux attributs non géométriques des entités, nous allons modifier le script précédent
Remplacez les deux dernières lignes
g=feat.geometry()
print g.asPoint()
par
print feat.attributes()
Le script doit ressembler à ça:
Et son exécution donne le résultat suivant dans la console Python:
On obtient bien une liste Python avec l’ensemble des attributs de la première entité de la table.
Cette information est généralement reliée aux noms des champs de la table. Pour obtenir la liste des noms des champs, remplacez dans le script précédent la ligne
print feat.attributes()
par
print [c.name() for c in feat.fields().toList()]
Le script doit ressembler à ça:
Et son exécution donne le résultat suivant dans la console Python