5 votos

¿Cómo seleccionar características de una capa y guardarlas en una capa de memoria?

Soy nuevo en la programación de QGIS en Python. Quiero seleccionar algunas características de una capa de entrada y guardarlas en una capa de memoria para su posterior procesamiento. Aquí está mi código:

##Sampled_trees=vector
##Input_field= field Sampled_trees

from qgis.core import *
from PyQt4.QtCore import *

inputTrees= processing.getObject(Sampled_trees)
inputField = inputTrees.fieldNameIndex(Input_field)

tempLayer = QgsVectorLayer("Point", "temporary_points", "memory")

processing.runalg("qgis:selectbyattribute", inputTrees, inputField,0,1,inputTrees)
processing.runalg('qgis:saveselectedfeatures', inputTrees, tempLayer)

Cuando se ejecuta la última línea, me aparece el error:

TypeError: El objeto 'QgsVectorLayer' no tiene ningún atributo ' getitem '

¿Cómo puedo solucionar este problema?

0 votos

Creo que esta pregunta puede ser un duplicado de esta otra: Uso de la capa vectorial en memoria con el procesamiento de QGIS / SEXTANTE

0 votos

Es una pregunta similar. Estudié esa pregunta antes de hacer esta, pero la respuesta no me sirvió. Así que tuve que volver a preguntar y obtuve la respuesta que necesitaba.

5voto

Hameno Puntos 129

Como ha señalado en su pregunta, también puede utilizar la capa de memoria para añadir las características seleccionadas de la capa de origen, véase el código siguiente:

inputTrees= processing.getObject(Sampled_trees)
inputField = inputTrees.fieldNameIndex(Input_field)
processing.runalg("qgis:selectbyattribute", inputTrees, Input_field, 0, 1)
tempLayer = QgsVectorLayer("Point", "temporary_points", "memory")
features = inputTrees.selectedFeatures()
temp_data = tempLayer.dataProvider()
attr = inputTrees.dataProvider().fields().toList()
temp_data.addAttributes(attr)
tempLayer.updateFields()
temp_data.addFeatures(features)
QgsMapLayerRegistry.instance().addMapLayer(tempLayer)

0 votos

Esto es lo que necesitaba. Funciona y es realmente útil.

1voto

Mue Puntos 2469

Puede utilizar None como la salida que crea automáticamente una capa temporal. Esto se menciona en el documentación :

Para los objetos de datos de salida, escriba la ruta del archivo que se utilizará para guardarlo, tal como se hace desde la caja de herramientas. Si desea guardar el resultado en un archivo temporal, utilice None .

Así que su código se puede acortar a:

##Sampled_trees=vector
##Input_field= field Sampled_trees

inputTrees= processing.getObject(Sampled_trees)
inputField = inputTrees.fieldNameIndex(Input_field)

processing.runalg("qgis:selectbyattribute", inputTrees, Input_field, 0, 1)
tempLayer = processing.runalg('qgis:saveselectedfeatures', inputTrees, None)

Tenga en cuenta que para el qgis:selectbyattribute no se especifica la salida, ya que sólo se seleccionan las características de la capa de entrada.

0 votos

El uso del argumento None para qgis:saveselectedfeatures guarda la capa en el disco, por ejemplo. C:\\Users\\userName\\AppData\\Local\\Temp\\processing68ace1d ‌​d77264cf48d1f95eb837‌​b93d1 \\86ee4684d3784 ‌​c7eb27506235b395999\‌​ \OUTPUTLAYER.shp No estoy seguro de que esto sea una capa temporal.

0 votos

Sí, el resultado de processing.runalg('qgis:saveselectedfeatures', inputTrees, None) era un diccionario python que contenía el nombre de la capa de salida y la ruta de acceso a esa capa. Ese archivo puede ser importado como una capa temporal.

0 votos

@artwork21 - Tengo entendido que un temporal es la que se guarda en el disco temporalmente hasta que se borra, ya sea reiniciando el ordenador o por cualquier otro medio; una memoria es la que se almacena en la memoria utilizada por QGIS y se borra cuando se cierra QGIS. Supongo que ambas capas son temporal pero voy a editar el título para reflejar que se necesitaba una capa de memoria =)

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