Слияние векторных слоев через python в QGIS 2.18.1

9

В настоящее время я использую следующий код для объединения двух векторных слоев:

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)

Кажется, это работает нормально в QGIS 2.14, однако в 2.18.1 происходит сбой со следующим сообщением:

Error: Wrong number of parameters
ALGORITHM: Merge vector layers

Что-то изменилось между 2.14 и 2.18? Или я просто упускаю что-то действительно очевидное?

JamieTasker
источник

Ответы:

11

Да, если вы введете следующий код в консоли Python , параметр входного слоя теперь включает несколько слоев :

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

Поэтому один из способов решения этой проблемы - добавить оба слоя во входной параметр и разделить их:

processing.tools.general.runalg("qgis:mergevectorlayers", layer1 + ";" + layer2, output)
Джозеф
источник
Спасибо, это сработало нормально. Изменилась ли также процедура для runalg ("gdalogr: convertformat")? В 2.14 он работает с использованием 'processing.tools.general.runalg (' gdalogr: convertformat ', layer, filetype, "", save_location) ", но в 2.18 ошибки не отмечаются, но новые файлы не создаются.
JamieTasker
@JamieTasker - Добро пожаловать! Нет, должны быть такие же параметры. Только что проверил и все работает отлично. Если у вас есть проблемы, вы должны задать новый вопрос и включить все детали, такие как тип входного слоя, тип выходного слоя, ваш код и т. Д. :)
Joseph
@ Джозеф Я получаю ту же ошибку, которую описал Йохен в своем ответе. Я использую консоль Python версии 2.18.16. Было бы интересно узнать, с какой версии в качестве векторного слоя работает только список Python.
Стефан
@ Стефан - Я считаю, что разработчики изменили, как следует использовать входы. В ранней версии 2.18 слои должны были быть разделены точкой с запятой, которая в конечном итоге была изменена, чтобы разрешить списки. Был пост, спрашивающий об этом .
Иосиф
4

Поскольку попытка ответа выше вызывает для меня исключение ( l1и l2оба типа QgsVectorLayer, консоль QGIS 2.18.17 Python)

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'

Я пытался

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

успешно.

Таким образом, передача <ParameterMultipleInput>в виде списка Python является решением этой проблемы.

Йохен Шварце
источник