Zusammenführen von Vektorebenen über Python in QGIS 2.18.1

9

Ich verwende derzeit den folgenden Code, um zwei Vektorebenen zusammenzuführen:

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)

Dies scheint in QGIS 2.14 gut zu funktionieren, schlägt jedoch in 2.18.1 mit der folgenden Meldung fehl:

Error: Wrong number of parameters
ALGORITHM: Merge vector layers

Gibt es etwas, das sich zwischen 2.14 und 2.18 geändert hat? Oder fehlt mir nur etwas wirklich Offensichtliches?

JamieTasker
quelle

Antworten:

11

Ja, wenn Sie den folgenden Code in die Python-Konsole eingeben , enthält der Parameter der Eingabeebene jetzt mehrere Ebenen :

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

Eine Möglichkeit, dies zu beheben, besteht darin, beide Ebenen zum Eingabeparameter hinzuzufügen und sie zu teilen:

processing.tools.general.runalg("qgis:mergevectorlayers", layer1 + ";" + layer2, output)
Joseph
quelle
Danke, das hat gut funktioniert. Hat sich auch das Verfahren für 'runalg ("gdalogr: convertformat")' geändert? Unter 2.14 funktioniert es mit 'process.tools.general.runalg (' gdalogr: convertformat ', Ebene, Dateityp, "", save_location)', aber unter 2.18 werden keine Fehler gemeldet, aber keine neuen Dateien erstellt.
JamieTasker
@ JamieTasker - Herzlich willkommen! Nein, sollte die gleichen Parameter sein. Einfach getestet und es funktioniert gut. Wenn Sie Probleme haben, sollten Sie eine neue Frage stellen und alle Details wie den Typ der Eingabeebene, den Typ der Ausgabeebene, Ihren Code usw. angeben :)
Joseph
@ Joseph Ich bekomme den gleichen Fehler, den Jochen in seiner Antwort beschrieben hat. Ich verwende die Python-Konsole der Version 2.18.16. Es wäre interessant zu wissen, da in welcher Version nur eine Python-Liste als Eingabe für die Vektorebene fungiert.
Stefan
@Stefan - Ich glaube, die Entwickler haben geändert, wie die Eingaben verwendet werden sollen. In der frühen Version 2.18 mussten Ebenen durch ein Semikolon getrennt werden, das schließlich geändert wurde, um Listen zuzulassen. Es gab einen Beitrag, in dem danach gefragt wurde .
Joseph
4

Da das Ausprobieren der obigen Antwort für mich eine Ausnahme verursacht ( l1und l2beide vom Typ QgsVectorLayerQGIS 2.18.17 Python-Konsole sind)

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'

Ich habe versucht

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

erfolgreich.

Das Übergeben <ParameterMultipleInput>als Python-Liste ist also eine Lösung dafür.

Jochen Schwarze
quelle