Как при проверке векторного слоя с помощью 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()этих функций и выполнять итерацию по ним, а не по всем функциям поставщика.

Еще один подход заключается в первоначальном сборе наборов (или списков) выбранных и невыбранных идентификаторов объектов для данного векторного слоя:

# 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

Кажется, я не могу найти ни одного вызова для получения ссылки на все объекты (или идентификаторы) для векторного слоя (то есть все еще должен использовать QgsVectorLayer.select()и повторять с QgsVectorLayer.nextFeature()).

Редактировать : обновленный код, отражающий QgsVectorLaer, может обрабатывать вызов select (не нужно напрямую связываться с провайдером) и не портит фактические выбранные функции на холсте карты, которые потребуются setSelectedFeatures()для обновления.

Редактирование 2 : после создания наборов идентификаторов объектов вы можете выполнять итерации по ним и использовать QgsVectorLayer.featureAtId(featid)для доступа к этой функции.

dakcarto
источник
Я подозревал, что это может быть так, но большое спасибо за полезные предложения.
Сайрус