#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
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 , 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
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
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
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
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