Під час ітерації над векторним шаром з 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, може обробляти вибраний виклик (не потрібно безпосередньо отримувати провайдера) і не псує фактичні обрані функції на полотні карти, які потребують setSelectedFeatures()оновлення.

Редагування 2 : після QgsVectorLayer.featureAtId(featid)складання наборів ідентифікаторів функцій ви можете переглядати їх і використовувати для доступу до функції.


Я підозрював, що це може бути так, але дуже дякую за корисні пропозиції.
Сайрус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.