5 votos

¿Iterar sobre la capa de memoria para ejecutar el algoritmo de procesamiento usando Python en QGIS?

Estoy tratando de escribir un python script que itera sobre las características de una capa, selecciona una característica y se alimenta en processing.runalg(). Estoy bastante seguro de que la selección se lleva a cabo. Sin embargo, el bit processing.runalg("qgis:xxx") ocurre sin tener en cuenta la selección. Sé que hay muchas preguntas y respuestas similares, pero he probado sus sugerencias y no he tenido éxito. Pensé que tal vez si alguien ve el código podría ayudarme a resolver esto.

Este es el código (las sangrías en los bucles for pueden estar desordenadas por el formato):

inter_shpmemory = iface.addVectorLayer(main_directory + "\\" + 
intersect_shpname,"Zone layer",labtype)
specieslayer_mem = iface.addVectorLayer(main_directory + "\\" + 
bd_shpname,"GBIF layer",labtype)

###Create a folder to safe all stuff
newfolder = main_directory + "\\" + "Zonal_GBIF"

if not os.path.exists(newfolder):
    os.makedirs(newfolder)

it = specieslayer_mem.getFeatures( QgsFeatureRequest() )
inputLayerIds = [i.id() for i in it]
#selects all of the input feature and one feature from the clip layer
specieslayer_mem.setSelectedFeatures( inputLayerIds )###is this even 
#needed?

features = inter_shpmemory.getFeatures()

for feature in features:
            indbd_name = feature['simp_name']
            inter_shpmemory.setSelectedFeatures([feature.id()])
            print "Feature ID %d: " % feature.id()
            print indbd_name
            processing.runalg('qgis:clip', specieslayer_mem, inter_shpmemory, newfolder + '\\' + indbd_name +'.shp')  
            inter_shpmemory.setSelectedFeatures([])

specieslayer_mem.setSelectedFeatures([])

No puedo conseguir hacer lo que quiero.

2voto

317070 Puntos 145

El problema puede ser que, hay que guardar la selección primero. Supongo que el 'qgis:clip' no se preocupa de la selección. Añade esta línea también, y vuelve a cargar la capa guardada con otra línea:

QgsVectorFileWriter.writeAsVectorFormat( layer, path + 'admpoly/' + name + ".shp", "system", crs, "ESRI Shapefile", 1)

2voto

Mue Puntos 2469

En lugar de hacer listas, si quiere seleccionar todas las características de una capa, podría utilizar

layer.selectAll()

Por el contrario, si quiere eliminar todas las selecciones, podría utilizar

layer.removeSelection()

Así que para que tu código funcione, podrías intentar usar

inter_shpmemory = iface.addVectorLayer(main_directory + "/" + 
intersect_shpname,"Zone layer",labtype)
specieslayer_mem = iface.addVectorLayer(main_directory + "/" + 
bd_shpname,"GBIF layer",labtype)

###Create a folder to safe all stuff
newfolder = main_directory + "/" + "Zonal_GBIF"

if not os.path.exists(newfolder):
    os.makedirs(newfolder)

specieslayer_mem.selectAll()

features = inter_shpmemory.getFeatures()
for feature in features:
    indbd_name = feature['simp_name']
    inter_shpmemory.setSelectedFeatures([feature.id()])
    print "Feature ID %d: " % feature.id()
    print indbd_name
    processing.runalg('qgis:clip', specieslayer_mem, inter_shpmemory, newfolder + '/' + indbd_name +'.shp')  
    inter_shpmemory.removeSelection()

specieslayer_mem.removeSelection()

Obsérvese que la etiqueta " Utilizar sólo las funciones seleccionadas " debe estar activada en:

Processing > Options > General > Use only selected features

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