5 votos

qgis:mergevectorlayers no permite dos capas para el segundo arg

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.

2voto

Mue Puntos 2469

Creo que las versiones más recientes de QGIS requieren poner las capas en una lista (por ejemplo [importLayer,masterLayer] ). Así que podrías probar:

processing.tools.general.runalg("qgis:mergevectorlayers", [importLayer,masterLayer], tempLayer)

Editar:

El algoritmo de Processing ya crea una capa temporal, por lo que no es necesario crear una antes de ejecutando el algoritmo. En su lugar, puede llamar a la salida para esto y luego modificarlo y añadirlo a la interfaz:

Processing.initialize()

result = processing.tools.general.runalg("qgis:mergevectorlayers", [importLayer,masterLayer], None)
tempLayer = processing.getObject(result['OUTPUT'])

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)

Probado en QGIS 2.18.2 para Win7 64-bit.

1voto

Yada Puntos 9489

He probado este código en mi sistema y ha funcionado:

import processing

registry = QgsMapLayerRegistry.instance()

polygon1 = registry.mapLayersByName('polygon1')
polygon8 = registry.mapLayersByName('polygon8')

processing.runandload('qgis:mergevectorlayers',
                      polygon1 + polygon8,
                      None)

Las capas deben estar separadas por caracteres "+". Este fue el resultado exitoso:

enter image description here

Nota de edición:

Esta es otra versión alternativa del código que funciona:

import processing

registry = QgsMapLayerRegistry.instance()

polygon1 = registry.mapLayersByName('polygon1')
polygon8 = registry.mapLayersByName('polygon8')

processing.runandload('qgis:mergevectorlayers',
                      [polygon1[0]] + [polygon8[0]],
                      None)

1voto

podosta Puntos 543

La pista estaba en que xunilk no buscaba sus capas, sino un índice que contenía cada capa.

La sintaxis exitosa parece ser:

processing.tools.general.runalg("qgis:mergevectorlayers", [list1] + [list2], destination)

Listas. No capas. Esto necesita ser documentado en algún lugar...

Como nota al margen, aunque mi código ahora se completa sin errores, usando None como salida final, no obtengo una salida de capa "Merged" como lo hizo xunilk. ¿Qué se supone que ocurre con esa bandera?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X