pyqgisでベクターレイヤーを反復処理するとき、機能が選択されているかどうかを確認するにはどうすればよいですか?


10

次のコード(pyqgis クックブックの例から要約)を使用してベクターレイヤーを反復処理しているときに、機能が選択されているかどうかを確認する方法はありますか?

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

または、選択した機能のリストをを使用して作成することもできますが、vlayer.selectedFeatures()各機能を直接確認する方法があることを期待しています。

回答:


8

機能オブジェクトの親レイヤーを直接検索する方法や、QgsFeatureクラスのメソッドから選択されるかどうかはありません。

同様のアプローチvlayer.selectedFeatures()は、feat.id()がにあるかどうかをテストすることですvlayer.selectedFeaturesIds()。QgsFeatureIdsは他のベクターレイヤーと比較して一意の値ではなく、独自のレイヤー内のみです。

または、vlayer.selectedFeatures()プロバイダーのすべての機能の代わりに、これらの機能から始めて反復することもできます。

さらに別のアプローチは、特定のベクターレイヤーの選択されたフィーチャIDと選択されていないフィーチャIDのセット(またはリスト)を最初に収集することです。

# 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

ベクターレイヤーのすべての機能(またはID)への参照を取得するための単一の呼び出しを見つけることができないようです(つまり、を使用QgsVectorLayer.select()して反復する必要がありますQgsVectorLayer.nextFeature())。

編集:QgsVectorLaerを反映するように更新されたコードは、選択呼び出しを処理でき(プロバイダーを直接取得する必要はありません)、setSelectedFeatures()更新が必要なマップキャンバスで実際に選択された機能を台無しにしません。

編集2:機能IDセットを構築した後、それらを反復処理し、を使用QgsVectorLayer.featureAtId(featid)して機能にアクセスできます。


私はそれが事実であるかもしれないと思ったが、有用な提案を本当にありがとう。
Cyrus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.