Recettes Python pour QGis: inspecter les données vecteur

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)

# Customize this starter script by adding code
# 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

features=layer.getFeatures()
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:

pv12

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:

pv13NOTES:

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:

pv14

Et son exécution donne le résultat suivant dans la console Python:

pv15

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:

pv16

Et son exécution donne le résultat suivant dans la console Python

pv17

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *