He buscado en la web sin suerte. Este viejo intercambio debe ser exactamente lo que necesito: Fusión de capas vectoriales mediante python en QGIS 2.18.1
Mi código es el siguiente:
processing.tools.general.runalg("qgis:mergevectorlayers", importLayer + ";" + masterLayer, tempLayer)
Pero da el siguiente error en la ejecución:
TypeError: unsupported operand type(s) for +: 'QgsVectorLayer' and 'str'
Traceback (most recent call last):
File "C:/Users/visitor/.qgis2/python/plugins\DataImporter\ImporterMain.py", line 47, in run self.dialog.run(layer)
File "C:/Users/visitor/.qgis2/python/plugins\DataImporter\ImporterUIFunctions.py", line 66, in run
self.mergeLayersIntoTemp(layer, layer.masterLayer)
File "C:/Users/visitor/.qgis2/python/plugins\DataImporter\ImporterUIFunctions.py", line 141, in mergeLayersIntoTemp
processing.tools.general.runalg("qgis:mergevectorlayers", importLayer + ";" + masterLayer, tempLayer)
TypeError: unsupported operand type(s) for +: 'QgsVectorLayer' and 'str'
Tanto importLayer como masterLayer son objetos QgsVectorLayer, por lo que sólo puedo concluir que no le gusta añadir el ; de esta manera.
¿Cómo se supone que hay que enviar las capas a fusionar hoy en día?
EDITAR:
El código completo
def mergeLayersIntoTemp(self, importLayer, masterName):
masterLayer = Utils.getLayerByName(masterName)
tempLayerName = masterName + "_temp"
tempLayer = ""
provider = ""
if not Utils.getLayerByName(tempLayerName):
tempLayer = QgsVectorLayer("Point?crs=epsg:4326&index=yes", tempLayerName, "memory")
provider = tempLayer.dataProvider()
else: # We already have a temp player of this name. Something's wrong.
ctypes.windll.user32.MessageBoxW(0, u"Attempted to create duplicate temporary layer.", u"Error", 0x0|0x10)
return
tempLayer.startEditing()
#for field in masterLayer.pendingFields():
#name = field.name()
#fieldType = field.typeName()
#provider.addAttributes([QgsField(name, getattr(QVariant, fieldType))])
tempLayer.commitChanges()
QgsMapLayerRegistry.instance().addMapLayer(tempLayer)
Processing.initialize()
processing.tools.general.runalg("qgis:mergevectorlayers", [importLayer, masterLayer], tempLayer)
def getLayerByName(name):
layers = QgsMapLayerRegistry.instance().mapLayersByName(name)
if layers:
return layers[0]
importLayer se pasa por arriba, es la capa seleccionada cuando se ejecuta la herramienta. Esto es un plugin, no una consola.