6 votos

¿Cómo eliminar la capa de memoria de la memoria?

Tengo un plugin que crea una capa de memoria y la muestra en el lienzo. Si ejecuto el plugin por segunda vez después de eliminar la capa de memoria del panel de la lista de capas sin cerrar QGIS, la capa de memoria se produce junto con la capa creada anteriormente. Parece que el nombre de la capa de memoria no se puede reutilizar hasta que se cierre QGIS. ¿Hay alguna forma de borrar esta capa de la memoria para volver a ejecutar el plugin?

###Create new layer
vecLineURI = "LineString?crs=epsg:4326&field=id:integer"
vecLine = QgsVectorLayer(vecLineURI,"point2line","memory")
pr = vecLine.dataProvider()

###Start editing
vecLine.startEditing()

###Add Feature
feat = QgsFeature()
feat.setGeometry(QgsGeometry.fromWkt(lneWKT))
feat.setAttributes([1])
pr.addFeatures( [feat] )

####Update Extents
vecLine.updateExtents()

###Commit Changes
vecLine.commitChanges()

###Load layer
QgsMapLayerRegistry.instance().addMapLayer(vecLine)

Estaba quitando la capa al principio del plugin abierto...

layerMap = QgsMapLayerRegistry.instance().mapLayers()
for name, layer in layerMap.iteritems():
    if "point2line" in name:
        QgsMapLayerRegistry.instance().removeMapLayer(layer)

...pero esto sólo eliminó elementos del panel de capas, no de la memoria.

0 votos

Después de la línea QgsMapLayerRegistry.instance().removeMapLayer(layer) Intenta añadir lo siguiente debajo: del vecLine .

0 votos

@Joseph...la variable vecLine no existe en el momento del bucle for. El plugin funciona la primera vez pero luego falla por llamar a una variable antes de definirla. Parece que crees que es un problema de Python y no una capa de memoria dentro de QGIS?

0 votos

Ahh me lo perdí, intenta añadir del vecLine después de cargar la capa con QgsMapLayerRegistry.instance().addMapLayer(vecLine) ? Habría pensado que las capas de memoria se pueden borrar de la memoria, pero nunca he necesitado probar esto...

4voto

Hameno Puntos 129

Para eliminar la capa de memoria de QGIS y del uso de la memoria:

QgsMapLayerRegistry.instance().removeMapLayer(myMemoryLayer.id())

Si estás trabajando con capas de memoria fuera de QGIS y quieres eliminarla de la memoria tendrás que añadirla y luego eliminarla como:

QgsMapLayerRegistry.instance().addMapLayer(myMemoryLayer)
QgsMapLayerRegistry.instance().removeMapLayer(myMemoryLayer.id())

0 votos

Aunque la capa haya sido eliminada del registro, el duplicado se sigue produciendo. He editado la declaración original para que sea un poco más clara, espero.

0 votos

¿Intentaste eliminarlo por código además de quitarlo de la interfaz de usuario? Durante el inicio de su plugin podría buscar las capas en el mapa para ver si la capa de memoria está allí, si es así entonces elimínela, luego continúe con su proceso de plugin esperado.

0 votos

He podido conseguir que la sugerencia funcione dentro del código, de forma que los elementos del registro se eliminen al inicio de una nueva sesión del plugin. Sin embargo, la segunda ejecución todavía produce 2 salidas. El plugin produce una sola capa de memoria con un nombre codificado. Parece que se almacena en la memoria y no se sustituye por la nueva ejecución del plugin, cargando entonces 2 capas en el lienzo.

1voto

Eric Dand Puntos 116

QgsMapLayerRegistry se ha depreciado a partir de QGIS 3 según esta respuesta

Documentación de la API de QGIS

La forma de hacerlo con QGIS 3.# es la siguiente:

Primero añada la capa en memoria al proyecto

QgsProject.instance().addMapLayer(myMemoryLayer)

A continuación, elimine la capa del mapa del proyecto

QgsProject.instance().removeMapLayer(myMemoryLayer.id())

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