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