Fusion de couches vectorielles via python dans QGIS 2.18.1

9

J'utilise actuellement le code suivant pour fusionner deux couches vectorielles ensemble:

def append_layers(layer1, layer2, output):
    from processing.core.Processing import Processing
    Processing.initialize()
    import processing.tools
    processing.tools.general.runalg("qgis:mergevectorlayers", layer1, layer2, output)

append_layers(layer1.shp, layer2.shp, output.shp)

Cela semble fonctionner correctement dans QGIS 2.14, mais il échoue dans 2.18.1 avec le message suivant:

Error: Wrong number of parameters
ALGORITHM: Merge vector layers

Y a-t-il quelque chose qui a changé entre 2.14 et 2.18? Ou est-ce que je manque juste quelque chose de vraiment évident?

JamieTasker
la source

Réponses:

11

Oui, si vous saisissez le code suivant dans la console Python , le paramètre de couche d'entrée incorpore désormais plusieurs couches :

>>>import processing
>>>processing.alghelp("qgis:mergevectorlayers")
ALGORITHM: Merge vector layers
    LAYERS <ParameterMultipleInput>
    OUTPUT <OutputVector>

Donc, une façon de résoudre ce problème consiste à ajouter les deux couches dans le paramètre d'entrée et à les diviser:

processing.tools.general.runalg("qgis:mergevectorlayers", layer1 + ";" + layer2, output)
Joseph
la source
Merci, cela a bien fonctionné. La procédure pour 'runalg ("gdalogr: convertformat")' a-t-elle également changé? Sur 2.14, il fonctionne en utilisant 'processing.tools.general.runalg (' gdalogr: convertformat ', layer, filetype, "", save_location)' mais sur 2.18 aucune erreur n'est signalée mais aucun nouveau fichier n'est créé.
JamieTasker
@JamieTasker - Bienvenue! Non, devrait être les mêmes paramètres. Je viens de le tester et cela fonctionne bien. Si vous avez des problèmes, vous devriez poser une nouvelle question et inclure tous les détails tels que le type de couche d'entrée, le type de couche de sortie, votre code, etc. :)
Joseph
@Joseph J'ai la même erreur que Jochen a décrite dans sa réponse. J'utilise la version 2.18.16 de la console Python. Il serait intéressant de savoir depuis quelle version seule une liste Python fonctionne comme entrée de couche vectorielle.
Stefan
@Stefan - Je pense que les développeurs ont changé la façon dont les entrées doivent être utilisées. Dans la première version 2.18, les couches devaient être séparées par un point-virgule qui a finalement été modifié pour autoriser les listes. Il y avait un post à ce sujet .
Joseph
4

Depuis essayer la réponse ci-dessus provoque une exception ( l1et l2sont tous les deux de type QgsVectorLayer, console Python QGIS 2.18.17) pour moi

import processing
[...]
processing.runalg('qgis:mergevectorlayers', l1 + ";" + l2, None)
Traceback (most recent call last):
    File "<input>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'QgsVectorLayer' and 'str'

j'ai essayé

>>> merged = processing.runalg('qgis:mergevectorlayers', [l1, l2], None)
>>> merged['OUTPUT']
u'C:\\Users\\Jochen\\AppData\\Local\\Temp\\processing30eee19448ef42a497403dd3660cafcf\\82e112158f194f59a53e18d5020a9a9d\\OUTPUT.shp'

avec succès.

Donc, passer <ParameterMultipleInput>comme une liste python est une solution à cela.

Jochen Schwarze
la source