banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#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


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

El_croustito a écrit:

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

 

Pied de page des forums

Powered by FluxBB