Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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é ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Thu 18 April 2019 12:05

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

QGIS/PyQGIS: Différence entre deux polygones

Bonjour à tous,

Etant débutant sur PyQGIS, je tente de réaliser des plugins.

Dans le cadre de l'un de ces plugins, j'ai besoin de faire une différence entre deux polygones pour obtenir une sorte de polygone "donut". Très simple à réaliser avec le geoprocessing tools de Qgis, je n'arrive pas à faire de même dans du code.

PolygonA = Polygon source
PolygonB = Polygon de difference
PolygonC = Result PolygonA - PolygonB

Mais j'ai beau cherché depuis des heures sur la doc PyQGIS et google, mais je ne vois pas de solution à mon problème.

Si vous avez une piste ou une idée je suis preneur.

Merci d'avance. J.

Hors ligne

 

#2 Thu 18 April 2019 15:31

Sylther
Participant assidu
Lieu: Mpl
Date d'inscription: 17 May 2016
Messages: 189
Site web

Re: QGIS/PyQGIS: Différence entre deux polygones

Bonjour,

Tu peux utiliser processing (ici un exemple avec un select by location):

Code:

import processing
[...]
processing.run("native:selectbylocation", {'INPUT':'/path/layer.shp','PREDICATE':[0],'INTERSECT':QgsProcessingFeatureSourceDefinition('/path/to/layer2.shp', True),'METHOD':0})

pour avoir en console la liste des algorithmes :

Code:

import processing
for alg in QgsApplication.processingRegistry().algorithms():
        print(alg.id(), "->", alg.displayName())

Cf. https://docs.qgis.org/3.4/en/docs/user_ … ng-console

Bonne journée,
S.

Hors ligne

 

#3 Tue 07 May 2019 11:46

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS/PyQGIS: Différence entre deux polygones

@Sylther : Je te remercie pour cet élément de réponse. Je pensais en effet utiliser le processing mais je ne trouvais pas le moyen de l'inclure dans mon code python.

Je vais regarder ça de plus près.

D'autre idées ?

J.

Hors ligne

 

#4 Mon 13 May 2019 15:41

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS/PyQGIS: Différence entre deux polygones

Bonjour,

J'ai réussi à obtenir ce que je souhaitais .... mais uniquement en memory.

Je n'arrive pas à intégrer une variable pour le OUTPUT, j'ai des messages d'erreur à chaque fois :


Code:

chemin='C\\test\\test.shp'
process=processing.run("native:difference", {'INPUT': polyg,'OVERLAY': vbuffer,'OUTPUT': chemin})

Une solution ?

J.

Hors ligne

 

#5 Mon 20 May 2019 09:29

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS/PyQGIS: Différence entre deux polygones

Bonjour,

Quelqu'un serait comment pouvoir avoir une variable pour indiquer l'ouput ?

Merci d'avance pour votre retour,

J.

Hors ligne

 

#6 Mon 20 May 2019 10:10

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS/PyQGIS: Différence entre deux polygones

Bonjour,

votre chemin ne semble pas bon (il manque les : ) , vous pouvez le déclarer sous 2 formes
pour faciliter la saisie et éviter la saisie de backslash :

Code:

#forme 1
chemin = r'C:\test\test.shp'
#forme2
chemin = 'C:/test/test.shp'

process=processing.run("native:difference", {'INPUT': polyg,'OVERLAY': vbuffer,'OUTPUT': chemin})

Cordialement,

Dernière modification par lejedi76 (Mon 20 May 2019 10:13)

Hors ligne

 

#7 Mon 20 May 2019 10:19

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS/PyQGIS: Différence entre deux polygones

@lejedi76 :

J'ai simplement mal recopié ici le chemin (manque les smile, mais il est bien bon, je l'utilise ailleurs dans le programme et il fonctionne bien.
A savoir que \\ est lu en python3 comme \.

Je récupère le chemin via QFileDialog.getSaveFileName, ce qui me permet d'avoir directement mon chemin via un boite de dialogue.

Code:

chemin='C:\\test\\test.shp'
process=processing.run("native:difference", {'INPUT': polyg,'OVERLAY': vbuffer,'OUTPUT': chemin})

A savoir que si je met mon chemin directement dans mon code sans utiliser une variable ça fonctionne ....

En résumé,

Code:

#Ne fonctionne pas
chemin='C:\\test\\test.shp'
process=processing.run("native:difference", {'INPUT': polyg,'OVERLAY': vbuffer,'OUTPUT': chemin})

Code:

#Fonctionne
process=processing.run("native:difference", {'INPUT': polyg,'OVERLAY': vbuffer,'OUTPUT': 'C:\\test\\test.shp'})

Des solutions ?

Hors ligne

 

#8 Mon 20 May 2019 11:01

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS/PyQGIS: Différence entre deux polygones

jlavaure a écrit:

A savoir que si je met mon chemin directement dans mon code sans utiliser une variable ça fonctionne ....


Donnez nous au moins le message d'erreur et le code. Il n'y a pas de raison que cela ne fonctionne pas à moins que le
code qui récupère le chemin ne soit pas bon (notamment la partie avec QFileDialog).

Hors ligne

 

#9 Mon 20 May 2019 11:20

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS/PyQGIS: Différence entre deux polygones

A savoir que j'ai renseigné 54 dans ma QfileDialog

Voici mon code :

Code:

f = QFileDialog.getSaveFileName(self, "Chose your file","","*.shp")
out="'{}'".format(f[0])
process=processing.run("native:difference", {'INPUT': polyg,'OVERLAY': vbuffer,'OUTPUT': out})
process_result=process['OUTPUT']
context=QgsProcessingContext()
process_ok=QgsProcessingUtils.mapLayerFromString(process_result,context)
process_ok.loadNamedStyle("\\\\192.168.1.100\\0_Cartographie\\QGIS\\style\\Ellipse.qml")
QgsProject.instance().addMapLayer(process_ok)

Le résultat ne prend pas en compte le processing.run("native:difference") mais le style est bien appliqué.

Voici le message d'erreur :

Code:

_core.QgsProcessingException: There were errors executing the algorithm. 
Traceback (most recent call last):
  File "C:/Users/Jimmy LAVAURE/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\wtg_ellipse_generator\wtg_ellipse_generator_dialog.py", line 253, in generator
    process=processing.run("native:difference", {'INPUT': polyg,'OVERLAY': vbuffer,'OUTPUT': out})
  File "C:/OSGEO4~1/apps/qgis-ltr/./python/plugins\processing\tools\general.py", line 105, in run
    return Processing.runAlgorithm(algOrName, parameters, onFinish, feedback, context)
  File "C:/OSGEO4~1/apps/qgis-ltr/./python/plugins\processing\core\Processing.py", line 183, in runAlgorithm
    raise QgsProcessingException(msg)
_core.QgsProcessingException: There were errors executing the algorithm

Voici la variable out

Code:

print(out)
'C:/Users/Jimmy/Desktop/_a_suppr/test_plugin/54.shp'

Hors ligne

 

#10 Mon 20 May 2019 11:58

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS/PyQGIS: Différence entre deux polygones

jlavaure a écrit:

Code:

print(out)
'C:/Users/Jimmy/Desktop/_a_suppr/test_plugin/54.shp'


Il y a des quotes en trop.

Code:

print(out) --> C:/Users/Jimmy/Desktop/_a_suppr/test_plugin/54.shp et non 'C:/Users/Jimmy/Desktop/_a_suppr/test_plugin/54.shp'

Cette ligne là n'est pas bonne :

Code:

out="'{}'".format(f[0])

Ceci devrait corriger le problème :

Code:

out = '{}'.format(f[0])

Ou encore mieux :

Code:

out = f[0]

Ou encore encore mieux :

Code:

out, filter = QFileDialog.getSaveFileName(self, "Chose your file","","*.shp")
process=processing.run("native:difference", {'INPUT': polyg,'OVERLAY': vbuffer,'OUTPUT': out})
...

Dernière modification par lejedi76 (Mon 20 May 2019 12:00)

Hors ligne

 

#11 Mon 20 May 2019 12:09

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS/PyQGIS: Différence entre deux polygones

J'ai déjà essayé le f[0] mais j'avais le même message d'erreur.

Peut importe le code, j'obtiens la même erreur avec une variable dans mon OUTPUT

Le dernier code me donne un résultat différent : un fichier de forme ligne vide au lieu de plusieurs polygones.

Je ne comprend pas pourquoi il y a cette erreur avec la variable.

Hors ligne

 

#12 Mon 20 May 2019 16:32

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS/PyQGIS: Différence entre deux polygones

La première chose c'est d'essayer de déboguer étape par étape.

Essayez ceci dans la console et voyez si cela fonctionne :

Code:

out, filter = QFileDialog.getSaveFileName(None, "Choose your file","","*.shp")
process=processing.runAndLoadResults("native:difference", {'INPUT': polyg,'OVERLAY': vbuffer,'OUTPUT': out})

Si le le géotraitement s'exécute sans erreur mais que le résultat n'est pas le résultat escompté, cela est un autre problème qu'on peut dissocier de ce problème de variable.

Allez-y étape par étape, après vous essaierez  dans votre plugin.

Hors ligne

 

#13 Mon 20 May 2019 16:35

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS/PyQGIS: Différence entre deux polygones

J'ai déjà débogué, c'est bien le géotraitement qui ne fonctionne pas si je met une variable à OUTPUT.
Pour rappel si je remplace ma variable pour la chaîne de caractère qu'elle contient tout fonctionne bien.

J'utilise ce même code en memory et je n'ai pas de problème.

Hors ligne

 

#14 Mon 20 May 2019 17:19

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS/PyQGIS: Différence entre deux polygones

jlavaure a écrit:

J'ai déjà débogué, c'est bien le géotraitement qui ne fonctionne pas si je met une variable à OUTPUT.


Je suis tout de même sceptique car chez moi le code fonctionne parfaitement (QGis version 3.6)
Dans la console, je n'ai aucune erreur (variable ou non). Le géotraitement se lance normalement et le résultat est correct.

Essayez éventuellement de redémarrer qgis.

Si malgré vos efforts, cela ne fonctionne pas, remonter le bug sur https://issues.qgis.org/projects/qgis/issues/ avec une video par
exemple.

Hors ligne

 

#15 Tue 21 May 2019 10:02

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS/PyQGIS: Différence entre deux polygones

@lejedi76 :

Bon en reprenant mon code à 0 et bien plus propre j'ai enfin réussi à tout faire fonctionner.

Simple question, j'arrive pas à comprendre le rôle de filter ?

J.

Hors ligne

 

#16 Tue 21 May 2019 13:55

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 726

Re: QGIS/PyQGIS: Différence entre deux polygones

Bonjour,

ce n'est pas très bien expliqué dans la doc mais la fonction getSaveFileName de la classe QFileDialog renvoie un tuple
avec le nom du fichier choisi et le filtre sélectionné dans la boite de dialogue.

Code:

help(QFileDialog.getSaveFileName)
Help on built-in function getSaveFileName:

getSaveFileName(...)
    getSaveFileName(parent: QWidget = None, caption: str = '', directory: str = '', filter: str = '', initialFilter: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = 0) -> Tuple[str, str]

Code:

out, filter = QFileDialog.getSaveFileName(None, "Choose your file","","*.shp")
out --> chemin du fichier
filter --> le filtre ici : "*.shp"

Hors ligne

 

#17 Tue 21 May 2019 14:00

jlavaure
Participant assidu
Date d'inscription: 20 Apr 2013
Messages: 203

Re: QGIS/PyQGIS: Différence entre deux polygones

Oui j'avais bien vue pour le tuple, j'utilisais [0] pour récupérer la valeur du chemin. J'ignorais le filter. Merci, j'ai finis mon plugin et tout fonctionne !

PS : dsl pour les 4 messages identiques qui se suivent, il y a eu un bug avec georezo.

J

Hors ligne

 

#18 Tue 28 May 2019 22:09

mopa9500
Juste Inscrit !
Date d'inscription: 27 May 2019
Messages: 1

Re: QGIS/PyQGIS: Différence entre deux polygones

jlavaure a écrit:

Oui j'avais bien vue pour le tuple, j'utilisais [0] pour récupérer la valeur du chemin. J'ignorais le filter. Merci, j'ai finis mon plugin et tout fonctionne !
Youjizz Pornhub Tubegalore
PS : dsl pour les 4 messages identiques qui se suivent, il y a eu un bug avec georezo.

J


Je te remercie pour cet élément de réponse. Je pensais en effet utiliser le processing mais je ne trouvais pas le moyen de l'inclure dans mon code python.

Je vais regarder ça de plus près.

D'autre idées ?

Dernière modification par mopa9500 (Wed 29 May 2019 18:31)

Hors ligne

 

#19 Wed 29 May 2019 09:50

Pascal Boulerie
Participant assidu
Lieu: France
Date d'inscription: 12 Sep 2005
Messages: 2947
Site web

Re: QGIS/PyQGIS: Différence entre deux polygones

message de service :-) :

le message de mopa9500 ne contient rien du tout d'autre qu'un copié-collé de la réponse d'un autre contributeur...


(un souci avec sa messagerie à lui ???)


« L'État est désormais quasi déliquescent. » (José Cohen-Aknine, ingénieur X-Ponts, IGPEF, dans Déliquescence et renaissance de l'État.)

Hors ligne

 

Pied de page des forums

Powered by FluxBB