передача геометрии обьекта в функцию

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

передача геометрии обьекта в функцию

Сообщение kasandra » 24 фев 2017, 14:44

Добрый день!
При выполнении действия в qgis использую функцию из postgresql.
В функцию передаются атрибуты выбранного объекта на слое.
Но вот геометрию этого объекта как передать не знаю.

Пробовала, в том числе, например вот так:

Код: Выделить всё

import processing;
feat = QgsFeature();
geom = feat.geometry();
processing.runalg('qgis:postgisexecutesql', "db", "_info_test(%geom,'[% "id" %]')");
%geom пробовала записывать по разному в запросе, но передается либо ничего либо слово geom.

Подскажите как передать геометрию в sql запрос?

freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

Re: передача геометрии обьекта в функцию

Сообщение freeExec » 27 фев 2017, 10:24

Я конечно не силён в питоне, но каким образом QgsFeature(); связывается с "выбранного объекта на слое", мне кажется это создаёт просто пустой объект.

Аватара пользователя
Эдуард Казаков
Гуру
Сообщения: 546
Зарегистрирован: 23 апр 2014, 17:11
Репутация: 532
Откуда: Planet Earth
Контактная информация:

Re: передача геометрии обьекта в функцию

Сообщение Эдуард Казаков » 27 фев 2017, 13:55

Конечно, вы инициализируете пустой экземпляр класса QgsFeature. Там ничего нет.
Вы в консоли работаете?

Сначала нужно как-то определить слой, с которым вы работаете, например:

Код: Выделить всё

layer = iface.activeLayer() # Текущий выделенный в дереве слой
Как загружать другие слои можно найти здесь

Затем извлечь из слоя объекты

Код: Выделить всё

features = layer.getFeatures() # все объекты

features = layer.selectedFeatures() # выделенные объекты
Это итератор, который содержит все (или выделенные) объекты слоя

Можно взять первый так:

Код: Выделить всё

feature = features.next()
либо перебрать их циклом

Код: Выделить всё

for feature in features:
  <some code>
У каждой feature есть метод geometry(), который возвращает геометрию как класс QgsGeometry, а у объектов QgsGeometry есть методы:

Код: Выделить всё

asPolygon()
asPoint()
asPolyline()
которые возвращают уже списки координат в соответствии с вашим типом геометрии. Например

Код: Выделить всё

>>> feature.geometry().asPoint()
(730424,-38788)

kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

Re: передача геометрии обьекта в функцию

Сообщение kasandra » 28 фев 2017, 14:27

Благодарю за комментарию, буду пробовать действовать согласно вашим подсказкам :)

kasandra
Активный участник
Сообщения: 145
Зарегистрирован: 09 апр 2014, 11:33
Репутация: 2

Re: передача геометрии обьекта в функцию

Сообщение kasandra » 03 мар 2017, 11:46

[quote="Эдуард Казаков"]Конечно, вы инициализируете пустой экземпляр класса QgsFeature. Там ничего нет.
Вы в консоли работаете?

Работаю не в консоли. В свойствах слоя - в разделе действия добавляю действие с типом Python.

import processing;
layer =qgis.utils.iface.activeLayer();
feature = layer.selectedFeatures();
geom = feature.geometry().asPolygon();
processing.runalg('qgis:postgisexecutesql', "db", " select _info_test(%geom,'[% "id" %]')");
qgis.utils.iface.mapCanvas().refresh();

Пишет мне такое сейчас: Traceback (most recent call last): File "", line 4, in AttributeError: 'list' object has no attribute 'geometry'

Я правильно поняла, что geometry() должен передавать геометрию как WKB, а geometry().asPolygon() как WKT?
Подскажите, пожалуйста, в чем сейчас ошибка?

Рада буду, если кто-то сможет подсказать по следующим вопросам:

- можно ли обновлять сразу конкретный один слой ( так как qgis.utils.iface.mapCanvas().refresh(); занимает слишком много времени);
- можно ли выводить на экран в qgis то, что будет возвращать функция postgresql после выполнения.

Аватара пользователя
Эдуард Казаков
Гуру
Сообщения: 546
Зарегистрирован: 23 апр 2014, 17:11
Репутация: 532
Откуда: Planet Earth
Контактная информация:

Re: передача геометрии обьекта в функцию

Сообщение Эдуард Казаков » 14 мар 2017, 00:34

Здравствуйте.
После вот этой команды

Код: Выделить всё

feature = layer.selectedFeatures();
В переменной feature записан итератор. К нему нельзя обратиться так, у него нет geometry().
Нужно сначала извлечь собственно объекты. Через for или через next(), как показано в примере выше.

Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 33 гостя