Scalanie warstw wektorowych przez Python w QGIS 2.18.1

9

Obecnie używam następującego kodu do scalenia dwóch warstw wektorowych:

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)

Wydaje się, że działa to dobrze w QGIS 2.14, jednak nie powiedzie się w 2.18.1 z następującym komunikatem:

Error: Wrong number of parameters
ALGORITHM: Merge vector layers

Czy jest coś, co zmieniło się między 2.14 a 2.18? A może po prostu brakuje mi czegoś naprawdę oczywistego?

JamieTasker
źródło

Odpowiedzi:

11

Tak, jeśli wpiszesz następujący kod w konsoli Python , parametr warstwy wejściowej będzie teraz obejmował wiele warstw :

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

Jednym ze sposobów rozwiązania tego jest dodanie obu warstw do parametru wejściowego i podzielenie ich:

processing.tools.general.runalg("qgis:mergevectorlayers", layer1 + ";" + layer2, output)
Joseph
źródło
Dziękuję, działało dobrze. Czy zmieniła się również procedura dla „runalg („ gdalogr: convertformat ”)? W wersji 2.14 działa przy użyciu „processing.tools.general.runalg („ gdalogr: convertformat ”, layer, filetype,„ ”, save_location)”, ale w wersji 2.18 błędy nie są oznaczane, ale nowe pliki nie są tworzone.
JamieTasker
@JamieTasker - Serdecznie witamy! Nie, powinny być takie same parametry. Właśnie go przetestowałem i działa dobrze. Jeśli masz problemy, powinieneś zadać nowe pytanie i dołączyć wszystkie szczegóły, takie jak typ warstwy wejściowej, typ warstwy wyjściowej, kod itp. :)
Joseph
@Joseph Mam ten sam błąd, który Jochen opisał w swojej odpowiedzi. Używam konsoli Python w wersji 2.18.16. Interesujące byłoby wiedzieć, ponieważ która wersja tylko lista Python działa jako wejście warstwy wektorowej.
Stefan
@Stefan - Wierzę, że programiści zmienili sposób użycia danych wejściowych. We wczesnej wersji 2.18 warstwy musiały być oddzielone średnikiem, który ostatecznie został zmieniony, aby umożliwić listy. Był post z pytaniem o to .
Joseph
4

Ponieważ wypróbowanie powyższej odpowiedzi powoduje dla mnie wyjątek ( l1i l2oba są typu QgsVectorLayer, konsola Python QGIS 2.18.17)

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'

próbowałem

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

z powodzeniem.

Przekazywanie <ParameterMultipleInput>jako lista python jest rozwiązaniem tego problemu.

Jochen Schwarze
źródło