Utilisation de la propriété Action d`une couche vecteur

publicité
QGIS
Utilisation de la propriété
Action d’une couche vecteur
Décembre 2015
Crédit carte : Olivier MAURY
Ministère de l'Écologie, du Développement durable,
des Transports et du Logement
© DDTM de la Vendée – Mitra/GO Olivier MAURY
www.developpement-durable.gouv.fr
Sommaire
 1. Présentation de l’onglet et du bouton Action
 2. A quoi sert la propriété action d’une couche ?
 3. Différents types d’ actions
QGIS Fonction Action
 Ouvrir
 ouvrir une recherche google
 ouvrir un fichier
 Generique
 Lancer mspaint
 Python








Ouvrir une page web
Afficher valeur d’un champ
Coordonnées XY au clic
Identifiant d’un objet (feature)
Afficher une couche vecteur
Charger des données postgres avec requète SQL
Afficher un raster
Changer la valeur d’un champ pour un objet
© DDTM de la Vendée – Mitra/GO Olivier MAURY
2
●
1. Présentation de l’onglet et du bouton Action
QGIS Fonction Action
Pour accéder à l’onglet action dans les propriétés d’une couche, il
faut soit double cliquer sur la couche dans le gestionnaire de
couche ou faire un clic droit sur la couche et sélectionner propriété
© DDTM de la Vendée – Mitra/GO Olivier MAURY
3
QGIS Fonction Action
La fenêtre propriété s’affiche, on sélection l’onglet action :
© DDTM de la Vendée – Mitra/GO Olivier MAURY
4
Pour lancer une action, on utilise le bouton associé.
QGIS Fonction Action
Ici on retrouve le nom des actions présentes dans la couche ( d’où
l’importance de leur donner un nom qui représente bien l’action)
On choisit l’action et on clic sur un objet de la couche.
L’action définie se déclenche.
© DDTM de la Vendée – Mitra/GO Olivier MAURY
5
●
2. A quoi sert la propriété action d’une couche ?
Beaucoup de possibilité d’utilisation de l’action sont possibles.
QGIS Fonction Action
Voici les plus courantes :
 Ouvrir et afficher un document : pdf ou image
 Ouvrir un programme : lien internet
 Charger dans qgis des données vecteurs en lien avec un objet
ex : un clic sur une commune : on charge les parcelles du cadastre
 Charger des données rasters
 Charger des données Postgres/gis
 Avec python : on peut tout inventer...
© DDTM de la Vendée – Mitra/GO Olivier MAURY
6
●
3. Différents types d’ actions
QGIS Fonction Action
 Dans l’espace de création d’action, on a différent réglage
© DDTM de la Vendée – Mitra/GO Olivier MAURY
7
 Type d’action : ouvrir
 Ouvrir une recherche web « google » sur la valeur d’un champ
QGIS Fonction Action
http://www.google.com/search?q=[% "Nom_Commun" %]
On peut dans le même ordre ouvrir une adresse web en lien avec
l’objet vecteur de la couche (adresse en html, ou adresse web d’un
pdf etc)
 Ouvrir un fichier
[% "lien" %]
ici le champ lien prend l’adresse du fichier :
C:\Users\olivier.maury\Downloads\08_Epandage.pdf
idem pour une image
© DDTM de la Vendée – Mitra/GO Olivier MAURY
8
 Type d’action générique :
QGIS Fonction Action
 Lancer dans mspaint une image dont on a l’adresse dans un champ lien
C:\Windows\System32\mspaint.exe [% "lien" %]
Dans ce cas on définit le programme qui sera lancer, dans l’exemple
précédent (affichage d’image par action type ouvrir) c’est windows qui
ouvre le programme lié au type de fichier.
© DDTM de la Vendée – Mitra/GO Olivier MAURY
9
 Type d’action Python
QGIS Fonction Action
 Ouvrir une page web directement dans qgis
ex recherche google sur la valeur du champ Nom_Commun
from PyQt4.QtCore import QUrl; from PyQt4.QtWebKit import
QWebView; myWV = QWebView(None);
myWV.load(QUrl('http://www.google.com/search?q=[%
"Nom_Commun" %]')); myWV.show()
 Afficher la valeur d’un champ
QtGui.QMessageBox.information(None, "Nom_du_champ", "[%
"chemin" %]")
résultat :
ici le champ contient une adresse
© DDTM de la Vendée – Mitra/GO Olivier MAURY
10
 Coordonnées du clic
QGIS Fonction Action
QtGui.QMessageBox.information(None, "Clicked coords", "layer: [%
$layerid %]\ncoords: ([% $clickx %],[% $clicky %])")
 Identifiant de l’objet feature
QtGui.QMessageBox.information(None, "Feature id", "feature id is [%
$id %]")

© DDTM de la Vendée – Mitra/GO Olivier MAURY
11
 Ouvrir un fichier vecteur :
Le but : afficher un fichier vecteur en lien avec un objet
QGIS Fonction Action
ex : afficher les parcelles cadastres d’une commune
le code python :
import os
fic= "[% "Chemin" %]"+"[% "debut_fich" %]" + "_parcelle.tab"
couche="[% "debut_fich" %]"+"_parcelle"
layer = qgis.utils.iface.activeLayer()
qgis.utils.iface.addVectorLayer(fic,couche,"ogr")
qgis.utils.iface.setActiveLayer(layer)
© DDTM de la Vendée – Mitra/GO Olivier MAURY
12
Explication du code :
[% "Chemin" %] ex : O:/00_referentiels/cadastre_vecteur/c85001_aiguillon_sur_mer/
[% "debut_fich" %] ex : c85001
Fic = chemin d’accès au fichier vecteur
O:/00_referentiels/cadastre_vecteur/c85001_aiguillon_sur_mer/c85001_parcelle.tab
QGIS Fonction Action
couche : nom affiché dans le gestionnaire de couche
ex c85178_parcelle
On peut afficher plusieurs tables avec la même action : parcelle et
bâtiment par exemple, il suffit de répéter les 5 dernières lignes du code.
Le code et les champs sont à adapter à votre structure de données.
© DDTM de la Vendée – Mitra/GO Olivier MAURY
13
QGIS Fonction Action
 Connexion à postgres et ouverture de couche avec sql
uri = QgsDataSourceURI()
uri.setConnection("localhost", "5432", "fichiersfonciers", "postgres",
"postgres")
uri.setDataSource("ff_d85_2013", "d85_2013_pnb10_parcelle",
"geomloc","jannatmin>2010 and idcom='[% "INSEE_comm" %]'")
couche= "local_Majic_"+"[% "INSEE_comm" %]"
vlayer = QgsVectorLayer(uri.uri(), couche, "postgres")
QgsMapLayerRegistry.instance().addMapLayer(vlayer)
qgis.utils.iface.zoomToActiveLayer()
Décodage :
host :"localhost" port : "5432" nomdelabase : "fichiersfonciers"
User :"postgres"motdepasse : "postgres"
schema : "ff_d85_2013", table : "d85_2013_pnb10_parcelle", the geom
"geomloc",requete sql : "jannatmin>2010 and idcom='[%
"INSEE_comm" %]’"
[% "INSEE_comm" %] champ code insee de la couche vecteur
d’origine
Résultat : on clique sur une commune, l’action charge les locaux de la
commune dont jannatmin est supérieure à 2010
si on ne met pas de sql, toute la couche est chargée
© DDTM de la Vendée – Mitra/GO Olivier MAURY
14
 Afficher un raster
QGIS Fonction Action
But :à partir du quadrillage des rasters afficher le raster correspondant au carré ou effacer
le raster s’il est déjà affiché
import os
mapCanvas =qgis.utils. iface.mapCanvas()
macouche = qgis.utils.iface.activeLayer()
fic= "[% "CHEMIN" %]" +"\\"+ "[% "NOM" %]"
nomCouche ="[% "NOM" %]"
currentLayers = mapCanvas.layers()
present="non"
for layers in currentLayers:
if layers.name()== nomCouche :
couche_present=layers.id()
present="oui"
if present =="oui":
QgsMapLayerRegistry.instance().removeMapLayer(couche_present)
else:
layer = qgis.utils.iface.activeLayer()
qgis.utils.iface.addRasterLayer(fic,"[% "NOM" %]")
qgis.utils.iface.setActiveLayer(layer)
Ici le champ CHEMIN = O:/00_referentiels/scan25/dalles/
et le champ NOM = SC25_TOPO_0280_6640_L93.tif
Le fichier vecteur est créer via l’extension Image Boundary
© DDTM de la Vendée – Mitra/GO Olivier MAURY
15
 Modifier les attributs d’un champ par un clic :
But : modifier la valeur d’un champ en cliquant sur un objet, cela
permet de faire des mises à jour rapide. Utile pour créer des projets
QGS pour des contrôles de terrain.
Le code :
QGIS Fonction Action
from qgis.core import QgsFeatureRequest
def updateField():
maCouche = qgis.utils.iface.activeLayer()
myField = u"traitement"
if not maCouche.isEditable():
maCouche.startEditing()
for feature in
maCouche.getFeatures(QgsFeatureRequest(int([% $id %]))):
if feature[myField] == "Non":
feature[myField] = "Oui"
else:
feature[myField] = "Non"
maCouche.updateFeature(feature)
maCouche.commitChanges()
updateField()
© DDTM de la Vendée – Mitra/GO Olivier MAURY
16
Les variables :
traitement = nom du champ que l’on veut modifier
« Non» et «Oui» valeur que l’on veut affecter par un clic
QGIS Fonction Action
Pour plus d’efficacité, étiqueter vos objets avec le champ traitement
© DDTM de la Vendée – Mitra/GO Olivier MAURY
17
QGIS Fonction Action
 Utilisation plus poussée de la fonction action avec python et
Postgres/gis : recherche des propriétaires d’une parcelle du
cadastre vecteur :
Principe : on active la fonction action sur la couche parcelle du
cadastre vecteur, lorsqu’on clic sur une parcelle, le programme
enregistre l’ « idpar » de la parcelle et recherche dans la table
d85_2013_pnb10_parcelle d’une base postgres le compte communal
du propriétaire « idprocpte » qui lui correspond. Puis il recherche dans
la table d85_2013_proprietaire_droit_non_ano de la base postgres les
données propriétaires correspondant à ce compte qu’il affiche dans un
tableau .
tableau de
résultats
© DDTM de la Vendée – Mitra/GO Olivier MAURY
18
 Le code python :
QGIS Fonction Action
uri = QgsDataSourceURI()
uri.setConnection("localhost", "5432", "fichiersfonciers", "postgres", "postgres")
//connection à une base postgres
uri.setDataSource("ff_d85_2013", "d85_2013_pnb10_parcelle", "geomloc","idpar='[%
"id_par" %]'")
//interrogation de la table d85_2013_pnb10_parcelle du schéma ff_d85_2013 avec le
geom « geomloc et une requete "idpar='[% "id_par" %]'" idpar de l’objet cliqué égal
idpar de la table postgres
couche= "local_Majic"
vlayer = QgsVectorLayer(uri.uri(), couche, "postgres")
idx=vlayer.fieldNameIndex('idprocpte')
// idx prendre la valeur du champ idprocpte dans la couche chargée dans qgis
feature = vlayer.getFeatures().next()
attributs=feature.attributes()
mon_attribut=attributs[idx]
// récupération de la valeur du champ idprocpte
sql="idprocpte='"+mon_attribut+"'"
uri = QgsDataSourceURI()
uri.setConnection("localhost", "5432", "fichiersfonciers", "postgres", "postgres")
uri.setDataSource("ff_prop_non_anonyme", "d85_2013_proprietaire_droit_non_ano",
None,sql)
//interrogation de la table d85_2013_proprietaire_droit_non_ano du schéma
ff_d85_2013 sans le geom « None et une requete sql sur l’idprocpte
couche= "propretaires_Majic_"+mon_attribut
wlayer = QgsVectorLayer(uri.uri(), couche, "postgres")
QgsMapLayerRegistry.instance().addMapLayer(wlayer)
qgis.utils.iface.zoomToActiveLayer()
//création de la couche de résultat « propretaires_Majic_XXXXXXX »
© DDTM de la Vendée – Mitra/GO Olivier MAURY
19
QGIS Fonction Action
A vous de jouer !!
Merci à tous ceux qui m’ont aidé pour la collecte et la réalisation des
codes.
© DDTM de la Vendée – Mitra/GO Olivier MAURY
20
Téléchargement