在使用pyqgis遍历矢量层时,如何检查是否选择了要素?


10

在使用以下代码(从pyqgis cookbook的示例总结)遍历向量层的同时,有没有办法检查是否选择了要素?

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(),但我希望有一种方法可以直接检查每个功能。

Answers:


8

似乎没有一种方法可以直接找到要素对象的父层,或者是否从QgsFeature类的方法中选择它。

一种类似的方法vlayer.selectedFeatures()是测试是否在feat.id()vlayer.selectedFeaturesIds()。与其他向量层相比,QgsFeatureId不是唯一值,仅在它们自己的层内。

或者,您可以从vlayer.selectedFeatures()这些功能而不是提供程序的所有功能开始并对其进行迭代。

另一种方法是最初收集给定矢量层的选定和未选定特征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)2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.