Al iterar sobre una capa vectorial con pyqgis, ¿cómo verifico si se selecciona una entidad?

10

Al iterar sobre una capa vectorial usando el siguiente código (resumido del ejemplo en el libro de cocina pyqgis ), ¿hay alguna manera de verificar si una función está seleccionada?

provider = vlayer.dataProvider()
feat = QgsFeature()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
while provider.nextFeature(feat):
    geom = feat.geometry()
    attrs = feat.attributeMap()
    for (k,attr) in attrs.iteritems():
        print "%d: %s" % (k, attr.toString())

Alternativamente, podría crear una lista de características seleccionadas usando vlayer.selectedFeatures(), pero espero que haya una manera de verificar cada característica directamente.

Ciro
fuente

Respuestas:

8

No parece haber una manera de encontrar directamente la capa primaria de un objeto de entidad o si está seleccionada de un método en la clase QgsFeature.

Un enfoque similar a vlayer.selectedFeatures()es probar si feat.id()está dentro vlayer.selectedFeaturesIds(). QgsFeatureIds no son valores únicos en comparación con otras capas vectoriales, solo dentro de su propia capa.

Alternativamente, puede comenzar vlayer.selectedFeatures()e iterar sobre esas características, en lugar de todas las características del proveedor.

Otro enfoque es reunir inicialmente conjuntos (o listas) de identificadores de entidad seleccionados y no seleccionados para una capa vectorial dada:

# previous relevant code

set_selids = set(vlayer.selectedFeaturesIds())
feat = QgsFeature()
vlayer.select([], QgsRectangle(), False)
set_allids = set()
while vlayer.nextFeature(feat):
    set_allids.add(feat.id())

set_notselids = set_allids - set_selids

print set_allids
print set_selids
print set_notselids

Parece que no puedo encontrar una sola llamada para recuperar una referencia a todas las características (o identificadores) para una capa vectorial (es decir, todavía tengo que usar QgsVectorLayer.select()e iterar con QgsVectorLayer.nextFeature()).

Editar : el código actualizado para reflejar QgsVectorLaer puede manejar llamadas de selección (no es necesario obtener el proveedor directamente), y no estropea las funciones seleccionadas reales en el lienzo del mapa, lo que requeriría setSelectedFeatures()una actualización.

Edición 2 : después de crear conjuntos de ID de características, puede iterar sobre ellos y usarlos QgsVectorLayer.featureAtId(featid)para acceder a la característica.

dakcarto
fuente
Sospeché que ese podría ser el caso, pero muchas gracias por las útiles sugerencias.
Cyrus