1 votos

Cómo duplicar una capa de mapa como máximo una vez como capa inferior en qgis3 (python)

Quería duplicar una capa en qgis3 usando python (mostrar los mismos datos vectoriales como diferentes capas) por esta pregunta ( ¿Cómo puedo duplicar una capa en QGIS? ). Además, necesito:

  1. asegúrese de que la capa de clonación añadida está en la parte inferior de las capas

  2. comprobar si el clon ya existe y duplicar sólo si el clon no existe entre la lista actual de capas (para evitar múltiples clones).

El código que tengo hasta ahora (para duplicar la primera capa) es:

vl = iface.mapCanvas().layer(0)
vl_clone = iface.addVectorLayer(vl.source(), vl.name() + "_clone", vl.providerType())

Actualmente la nueva capa se añade a la parte superior y se convierte en layer(0) . He intentado seguir las preguntas existentes de GIS.SE (por ejemplo ¿Cómo mover las capas en el Panel de Ordenación de Capas utilizando PyQGIS? ). Pero las preguntas/respuestas existentes son para QGIS 2, e implican cambios de última hora en QGIS3 (por ejemplo iface.layerTreeCanvasBridge() )

¿Alguien sabe cómo ampliar el código anterior para que funcione en QGIS3?

-- EDITAR --

El código actual que tengo hasta el momento de sintetizar las respuestas/documentación existentes es el siguiente. Aún así, el orden de las capas no cambia. He probado diferentes valores en insert() como 3 en vano.

lyr1 = iface.mapCanvas().layer(0)
lyr1_clone = iface.addVectorLayer(lyr1.source(), lyr1.name() + "_clone", lyr1.providerType())

bridge = iface.layerTreeCanvasBridge()
treeRoot = QgsProject.instance().layerTreeRoot()
treeRoot.setHasCustomLayerOrder(True)
order = treeRoot.customLayerOrder() 
order.insert( -1 , order.pop() ) # lyr1_clone to the bottom # lyr1_clone to the bottom
treeRoot.setCustomLayerOrder( order )
bridge.setCanvasLayers()

1voto

Mue Puntos 2469

Si quieres añadir una capa duplicada en la parte inferior (tanto en el Panel de capas y el Panel de orden de capas ), podrías usar:

lyr1 = iface.mapCanvas().layer(0)
lyr1_clone = QgsVectorLayer(lyr1.source(), lyr1.name() + "_clone", lyr1.providerType())
QgsProject.instance().addMapLayer(lyr1_clone, False)

treeRoot = QgsProject.instance().layerTreeRoot()
treeRoot.insertChildNode(-1, QgsLayerTreeLayer(lyr1_clone))

Si quiere comprobar si su capa duplicada ya existe (por su nombre), puede utilizar

treeRoot = QgsProject.instance().layerTreeRoot()

lyr1 = iface.mapCanvas().layer(0)
lyr1_clone = QgsVectorLayer(lyr1.source(), lyr1.name() + "_clone", lyr1.providerType())

layer_names = [layer.name() for layer in QgsProject.instance().mapLayers().values()]
if lyr1_clone.name() not in layer_names:
    QgsProject.instance().addMapLayer(lyr1_clone, False)
    treeRoot.insertChildNode(-1, QgsLayerTreeLayer(lyr1_clone))
else:
    del lyr1_clone

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