Ao iterar sobre uma camada vetorial com pyqgis, como verifico se um recurso está selecionado?

10

Ao iterar sobre uma camada vetorial usando o código a seguir (exibido no verão no exemplo do livro de receitas pyqgis ), existe uma maneira de verificar se um recurso está selecionado?

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())

Como alternativa, eu poderia criar uma lista de recursos selecionados usando vlayer.selectedFeatures(), mas espero que haja uma maneira de verificar cada recurso diretamente.

Cyrus
fonte

Respostas:

8

Não parece haver uma maneira de encontrar diretamente a camada pai de um objeto de recurso ou se ele foi selecionado em um método na classe QgsFeature.

Uma abordagem semelhante para vlayer.selectedFeatures()é para testar se o feat.id()é no vlayer.selectedFeaturesIds(). QgsFeatureIds não são valores exclusivos em comparação com outras camadas de vetor, apenas dentro de sua própria camada.

Como alternativa, você pode começar vlayer.selectedFeatures()e iterar sobre esses recursos, em vez de todos os recursos do provedor.

Ainda outra abordagem é reunir inicialmente conjuntos (ou listas) de IDs de recursos selecionados e não selecionados para uma determinada camada vetorial:

# 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

Não consigo encontrar uma única chamada para recuperar uma referência a todos os recursos (ou IDs) de uma camada vetorial (ou seja, ainda tenho que usar QgsVectorLayer.select()e iterar QgsVectorLayer.nextFeature()).

Editar : código atualizado para refletir QgsVectorLaer pode lidar com chamadas de seleção (não é necessário obter o provedor diretamente) e não atrapalha os recursos selecionados reais na tela do mapa, o que exigiria setSelectedFeatures()a atualização.

Editar 2 : depois de criar conjuntos de IDs de recursos, você pode iterar sobre eles e usar QgsVectorLayer.featureAtId(featid)para acessar o recurso.

dakcarto
fonte
Suspeitei que poderia ser o caso, mas muito obrigado pelas sugestões úteis.
Cyrus