#1 Tue 30 May 2017 12:54
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
QGIS Actions: Buffer automatique
Bonjour,
J'aimerais pouvoir crée une actions sur une couche de point ; a chaque clic sur un point, un buffer s'effectue (et si possible disparaît quand on reclic dessus).
Pour cela dans le menu Actions de ma couche j'ai écris en type python :
import processing
processing.runalg('qgis:fixeddistancebuffer', 'ma couche',distance, segment, dissolution ,'couche en sortie')
Mais cela ne m'effectue juste le buffer sur toute la couche, et non seulement sur l'entité cliqué ( ce qui devrait etre le principe de l'actions non ?)
Il y a peut d'aide approfondie sur les actions qgis sur le net, si quelqu'un aurait deux trois info à me donner je suis preneur
bien à vous
Hors ligne
#2 Tue 30 May 2017 15:07
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
J'ai trouvé ce code sur un autre forum : (http://www.forumsig.org/showthread.php/ … tilisateur)
Je pensais avoir trouver mon saint graal mais en l'adaptant pour mon cas ça ne marche pas :
j'ai une couche d'etablissement et une couche de zones tampon de 1500 m autour de ceux ci qui s’appelle respectivement Ferme et 1500.
Voici mon code :
Code:
#mon champ contenant mon identifiant de zone tampon id = [% "NumPac" %] #le nom de ma couche de tampon nom = '1500' #je récupère l'ensemble des couches affichées dans ma légende couches = qgis.utils.iface.legendInterface().layers() #je cherche celle qui s'appelle 1500 for couche in couches: if layer.name() == nom: macouche = couche requete = '"NumPac" = '+str(id) #selection dans la couche it = macouche.getFeatures(QgsFeatureRequest().setFilterExpression ( unicode(requete) ) ) macouche.setSelectedFeatures([ f.id() for f in it ])
A vrai dire je ne comprend pas les subtilité de ce code, quand je lance l'action rien ne se passe, ni message d'erreur ni buffer qui devrait apparaître...
Hors ligne
#3 Tue 30 May 2017 16:38
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS Actions: Buffer automatique
Bonjour,
ce code ne permettrait que de sélectionner l'objet de la couche 1500 dont l'id a la valeur NumPac.
Code:
id = [% "NumPac" %] #on recupere les couches dans des variable for couche in qgis.utils.iface.legendInterface().layers(): if couche.name() == '1500': macouchebuffer = couche if couche.name() == 'Ferme': macouchepoint = couche #on recupere l'objet a traiter for elem in macouchepoint.getFeatures(): index = macouchepoint.fieldNameIndex('NumPac') if elem.attributeValues[index] == id: #on crée le buffer de cet objet et on l'enregistre dans une variable buffer = elem.geometry().buffer(1500) #on ajoute l'objet buffer dans la couche buffer macouchebuffer.startEditing() macouchebuffer.addFeature(buffer)
Ca donne l'idée de la methodo mais je ne dis pas que c'est fonctionnel en l'etat
Dernière modification par YoLecomte (Tue 30 May 2017 16:51)
Hors ligne
#4 Tue 30 May 2017 18:27
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS Actions: Buffer automatique
Bonjour,
Vous souhaitez avoir une couche de tampons ou
simplement voir vos tampons à l écran suffirait ?
Cordialement,
Hors ligne
#5 Wed 31 May 2017 09:57
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
Bonjour,
Merci de vos réponses !
YoLecomte merci pour ton aide, je comprend ton code et je vais essayer de l'adapter pour qu'il fonctionne, le code tel que tu me la donné me donne ça :
Code:
File "", line 14, in AttributeError: 'QgsFeature' object has no attribute 'attributeValues'
LeJedi76, Les voirs simplement me suffirais, j'ai déjà une couche tampon mais étant données qu'ils se superposent parfois la lisibilité de la carte en est fortement réduite.
Bien à vous
Hors ligne
#6 Wed 31 May 2017 10:12
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS Actions: Buffer automatique
Ah oui c'est plutôt
Code:
elem.attribute[index]
cf: https://qgis.org/api/classQgsFeature.html
Dernière modification par YoLecomte (Wed 31 May 2017 10:12)
Hors ligne
#7 Wed 31 May 2017 10:22
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
J'ai pas envie de t’embêter trop avec ça donc si tu en à marre dis le moi je finirais pas trouver un jour haha.
En remplaçant par : elem.attribute[index]
J'obtiens ça :
Code:
Traceback (most recent call last): File "", line 14, in TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'
Je suis vraiment pas au point sur python..
Hors ligne
#8 Wed 31 May 2017 10:29
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS Actions: Buffer automatique
Alors peut être plutôt ça:
Code:
elem.attributes()[index]
selon ces gens : https://gis.stackexchange.com/questions … gis/138027
Hors ligne
#9 Wed 31 May 2017 10:39
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
Tres bien merci ! je sent que le schmilblick avance : Il me manque des "arguments" maintenant, c'est pour la construction du buffer ?
Code:
Traceback (most recent call last): File "", line 14, in TypeError: QgsFeature.attribute(QString): not enough arguments
Hors ligne
#10 Wed 31 May 2017 10:56
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS Actions: Buffer automatique
OK effectivement on récupère la valeur a partir du nom du champ en fait
Code:
id = [% "NumPac" %] #on recupere les couches dans des variable for couche in qgis.utils.iface.legendInterface().layers(): if couche.name() == '1500': macouchebuffer = couche if couche.name() == 'Ferme': macouchepoint = couche #on recupere l'objet a traiter for elem in macouchepoint.getFeatures(): if elem.attribute('NumPac') == id: #on crée le buffer de cet objet et on l'enregistre dans une variable buffer = elem.geometry().buffer(1500,5) # ou 1500 est la distance et 5 le nombre de segment pour l'approxiamtion print buffer #le polygone est dans la variable buffer, on peut en faire ce qu'on veut
Voila avec ce code est la console python ouverte, il devrait y avoir un message dans la console quand vous lancez l'action du style:
<qgis._core.QgsGeometry object at 0x0000000018F2C510>
Hors ligne
#11 Wed 31 May 2017 11:08
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
La du coup je n'ai plus de message d'erreur mais rien ne se passe,aucun message de la console python. La couche buffer doit être paramétré comment, elle doit etre vide ?
Hors ligne
#12 Wed 31 May 2017 13:49
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS Actions: Buffer automatique
le code ne permet que de récupérer la geométrie du polygone dans la variable buffer.
Après, à vous de voir ce que vous voulez en faire.
Hors ligne
#13 Wed 31 May 2017 13:53
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS Actions: Buffer automatique
Et si le print n'apparait pas dans la console python, il faut s'assurer que la valeur de NumPac est bien rigoureusement égale à l'id en les printant aussi au cours du script:
par exemple:
Code:
id = [% "NumPac" %] #on recupere les couches dans des variable for couche in qgis.utils.iface.legendInterface().layers(): if couche.name() == '1500': macouchebuffer = couche if couche.name() == 'Ferme': macouchepoint = couche #on recupere l'objet a traiter for elem in macouchepoint.getFeatures(): print elem.attribute('NumPac'), id if elem.attribute('NumPac') == id: #on crée le buffer de cet objet et on l'enregistre dans une variable buffer = elem.geometry().buffer(1500,5) # ou 1500 est la distance et 5 le nombre de segment pour l'approxiamtion print buffer #le polygone est dans la variable buffer, on peut en faire ce qu'on veut
Dernière modification par YoLecomte (Wed 31 May 2017 13:53)
Hors ligne
#14 Wed 31 May 2017 14:03
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
J'ai bien un champs NumPac rigoureusement identique, le print me donne chaque NumPac de chaque entité de chaque couche, il me ressort donc 5 222 code ( j'ai 2611 NumPac dans mes tables ) il ne me print pas les codes côte a côte ( c'est bien l'idée de ton print rajouté ?)
Code:
1008092 1019036 1015920 1019036 1016455 1019036 1019147 1019036 1019301 1019036 Etc...
Hors ligne
#15 Wed 31 May 2017 16:11
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS Actions: Buffer automatique
Oui c'est ça, est ce que vous pouvez envoyer un imprim ecran du parametrage de votre action.
Le print sert a comparer la variable id avec l'ensemble des numpac, il doit y avoir une ligne ou les deux sont identiques et pour cette ligne l'action doit generer le buffer.
Si le print est fait deux fois, vous avez du imbriquer les deux boucles... ce qui ne doit pas etre le cas normalement.
la première boucle sert a recuperer les couches sur lesquellles on travaille.
la deuxieme permet de faire le travail.
Hors ligne
#16 Thu 01 June 2017 10:59
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
Voila l'imprim écran :
[img]http://imageshack.com/a/img922/4858/AK2EmE.jpg[/img]
Hors ligne
#17 Thu 01 June 2017 11:38
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS Actions: Buffer automatique
Ca laisse penser que l'id n'est pas récuperer... si on rajouter print id à la ligne 2 est ce qu'il l'écrit bien dans la console?
Hors ligne
#18 Thu 01 June 2017 15:42
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
en rajoutant le print ligne 2, il m'ecrit bien le numero pac du point selectionné
Hors ligne
#19 Thu 01 June 2017 17:16
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS Actions: Buffer automatique
OK, alors on peut enlever le print ligne 12 et voir si il print bien le buffer pour l'élément sélectionné!
Hors ligne
#20 Thu 01 June 2017 18:11
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
Il ne print pas de buffer, ou alors je comprend mal, il doit créer un buffer visible sur l'interface ?
Hors ligne
#21 Thu 01 June 2017 18:39
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS Actions: Buffer automatique
Peux tu mettre à disposition tes couches, ça peut être un extrait, et je te le fais ?
Hors ligne
#22 Fri 02 June 2017 08:44
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
Voila un extrait de mes deux couche, la couche ferme en point et 1500 en buffer
Hors ligne
#23 Fri 02 June 2017 23:24
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS Actions: Buffer automatique
Bonsoir,
voici le code :
Code:
# coding:utf-8 # @Author: jd # @Date: 2017-06-02T22:54:35+02:00 # @Filename: buffer.py # @Last modified by: jd # @Last modified time: 2017-06-02T23:21:58+02:00 # @License: GPL # action pour ajouter un buffer de xm automatiquement dans une couche de buffer from qgis.utils import iface from qgis.core import (QgsMapLayerRegistry, QgsFeature, QgsFeatureRequest, QgsExpression) searchValue = [% "id" %] fieldName = u'id' distanceBuffer = 1500 layerNameBuffer = u'1500' outFeat = None inFeat = None #on recupere les couches avec le nom # si il y en a au moins une on prend la premiere couche matchingLayers = QgsMapLayerRegistry.instance().mapLayersByName(layerNameBuffer) if matchingLayers: layerBuffer = matchingLayers[0] # on bascule la couche buffer en mode édition layerBuffer.startEditing() #on regarde si l'id a traiter est présent dans la couche buffer request = u"to_string(\"{}\")='{}'".format(fieldName, searchValue) print(request) request = QgsExpression(request) for outFeat in layerBuffer.getFeatures(QgsFeatureRequest(request)): pass # si l'objet existe dans ce cas on supprime l'objet if outFeat: print(u'trouvé') print(searchValue) id = outFeat.id() layerBuffer.deleteFeature(id) # s'il n'existe pas else: print(u'pas trouvé') for inFeat in iface.activeLayer().getFeatures(QgsFeatureRequest(request)): pass outFeat = QgsFeature(inFeat) outFeat.setGeometry(inFeat.geometry().buffer(distanceBuffer, 25)) layerBuffer.addFeature(outFeat) layerBuffer.commitChanges()
Pour pas alourdir le code, il n'y a pas de message d'erreur mais en mettre serait intéressant.
Bon week-end,
Dernière modification par lejedi76 (Sat 03 June 2017 14:34)
Hors ligne
#24 Sat 03 June 2017 10:08
- El_croustito
- Participant occasionnel
- Date d'inscription: 30 Sep 2016
- Messages: 22
Re: QGIS Actions: Buffer automatique
Cela fonctionne !
Merci à vous deux je comprend un peu mieux les subtilité du code python grâce à vous.
Une dernière question, pourquoi mettre un "u" avant les champs texte ? ex : fieldName = u'id' juste par curiosité.
Bon weekend
Hors ligne
#25 Sat 03 June 2017 14:33
- JD
- Moderateur
- Date d'inscription: 8 Aug 2013
- Messages: 726
Re: QGIS Actions: Buffer automatique
Une dernière question, pourquoi mettre un "u" avant les champs texte ? ex : fieldName = u'id' juste par curiosité.
Sur QGis 2.X c'est la version 2.7 de python qui est installée et il est préférable de convertir les chaines de caractère en unicode.
Pour le coups, ici ca ne sert à rien mais si jamais tu choisis un champs qui contient un accent c'est mieux.
Cordialement,
Dernière modification par lejedi76 (Sat 03 June 2017 14:33)
Hors ligne