Получение данных одной выбранной функции в QGIS с использованием Python?

10

У меня есть проблема / вопрос, касающийся Python и QGIS. Можно ли получить данные одной выбранной функции в QGIS, используя python, и если да, то как?

В моем примере у меня есть слой, который показывает некоторые участки для городского планирования. Если я сейчас выберу одну из посылок, я хочу получить данные именно для этой посылки. Эти данные должны быть считаны скриптом Python, а затем добавлены в автоматически созданный файл PDF. Последний шаг прост, но я не получил данные из этой выбранной функции.

Можно получить данные из активного слоя, но возможно ли также получить данные из одного выбранного элемента этого слоя?

Надеюсь, ты сможешь мне помочь. С уважением

Sven
источник

Ответы:

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, которые являются результатом selected_features, не имеют геометрического метода ...
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] новые возможности выбора векторных API-интерфейсов . Коротко (по словам разработчика QGIS Мартина Добиаса):

Доступ к атрибутам: больше f.attributeMap()нет, потому что атрибуты теперь хранятся в векторе (Python:) listвместо карты (Python:) dict. QgsFeatureКласс эмулирует объект-контейнер Python 4, поэтому вы можете обращаться к атрибутам, как если бы QgsFeatureэкземпляр был списком или словарем, а ключами были либо индексы полей, либо имена полей:

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

f["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 (), который будет возвращать список имен полей.
Кэри Х
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
adamczi
источник