Отримання даних однієї вибраної функції в QGIS за допомогою Python?


10

У мене є проблема / питання щодо python та QGIS. Чи можливо отримати дані однієї вибраної функції в QGIS за допомогою python, і якщо так, то як?

У моєму прикладі є шар, який показує деякі посилки для містобудування. Якщо я зараз виберу одну з посилок, я хочу отримати дані саме для цієї посилки. Ці дані повинні бути прочитані сценарієм python, а потім додані до автоматично створеного PDF-файлу. Останній крок простий, але я не отримав дані з цієї вибраної функції.

Можна отримати дані з активного шару, але чи можливо також отримати дані з однієї обраної функції цього рівня?

Сподіваюся, ви можете мені допомогти. З повагою

Відповіді:


15

Виклик layer.selectedFeatures()поверне список із вибраними вами функціями. Потім ви можете зателефонувати feature.attributeMap()до кожної із вибраних функцій, щоб отримати словник атрибутів кожної функції.

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.attributeMap()
    for (k,attr) in attrs.iteritems():
    print "%d: %s" % (k, attr.toString())

Нещодавно я відповів на подібне запитання: Коли ітерація над векторним шаром з pyqgis, як я можу перевірити, чи обрана функція?


дивно, що об'єкти QgsFeature, що є результатом вибраних_функцій, не мають методу геометрії ...
user32882

9

Я просто хотів опублікувати деякі оновлення попередньої відповіді у світлі змін у API QGIS Python з версії 2.0 .

Як і раніше, ви отримаєте список вибраних функцій iface.activeLayer().selectedFeatures(), однак у QGISверсіях >= 2.0ви зараз використовуєте функцію QgsFeature.attributes()замість QgsFeature.attributeMap(). Дві функції не зовсім однакові: attributes()тепер повертає список , тоді як стара attributeMap()повертає словник . Знайдіть хвилину, щоб переглянути документацію API для QgsFeature.attributes(), QgsAttributesі т.д., щоб зрозуміти, як атрибути зберігаються / доступні.

Якщо вам цікаво, ви можете ознайомитись з деякими обґрунтуваннями змін API в цьому потоці списку розсилки: [Qgis-developer] new vector api select options . Коротко (зі слів розробника QGIS Мартіна Добіаса):

Доступ до атрибутів: більше f.attributeMap()немає, тому що атрибути тепер зберігаються у векторі (Python:) listзамість карти (Python:) dict. QgsFeatureклас емулює об'єкт контейнера python 4, щоб ви могли отримати доступ до атрибутів, як якщоби QgsFeatureекземпляр був списком або словником, при цьому ключі є або індексами поля, або іменами полів:

f[0] ... перший атрибут

f["type"] ... атрибут з назвою "type"

Ще можна отримати всі атрибути: f.attributes()повертає список значень.

Отже, як приклад конкретно того, що ви запитували, як це зробити (отримати дані для однієї вибраної вами функції), припустимо, у вас був шар містять cityфункції, у кожному з яких є список атрибутів, включаючи countyатрибут. Щоб отримати countyзначення для вибраного міста (скажімо Helena, AR), виконайте наступне на консолі Python:

city = iface.activeLayer().selectedFeatures()[0]
city["county"]
# OUTPUTS: u'Phillips'

Якщо ви хочете, щоб значення всіх полів у таблиці атрибутів міста були використані:

cityData = city.attributes()

Також ви можете отримати всі назви полів з цього прикладу, використовуючи city.fields (). Names (), які б повернули список імен полів.
Cary H

1

Я хотів би додати щось корисне до відповіді Дж. Тейлора і зазначити, що поточна прийнята відповідь з 2012 року більше не є правильною:

Об'єкт QgsFeature підтримує корисний __geo_interface__атрибут, який повертає словник із заданої функції. Словник насправді є стандартом GeoJSON, тому ви отримуєте всі парні атрибутні значення та геометрію. Ця функція існує вже деякий час, вперше описана Шоном Гіллісом десь у 2012 році, тут є приклад використання . Я не зміг знайти жодної інформації, з якої версії QGIS вона доступна, і я ще не пробував QGIS 3, але, безумовно, був доступний принаймні з QGIS 2.14.

TL; DR:

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.__geo_interface__
    print attrs # GeoJSON attributes of a feature
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.