Страница 1 из 1
передача геометрии обьекта в функцию
Добавлено: 24 фев 2017, 14:44
kasandra
Добрый день!
При выполнении действия в qgis использую функцию из postgresql.
В функцию передаются атрибуты выбранного объекта на слое.
Но вот геометрию этого объекта как передать не знаю.
Пробовала, в том числе, например вот так:
Код: Выделить всё
import processing;
feat = QgsFeature();
geom = feat.geometry();
processing.runalg('qgis:postgisexecutesql', "db", "_info_test(%geom,'[% "id" %]')");
%geom пробовала записывать по разному в запросе, но передается либо ничего либо слово geom.
Подскажите как передать геометрию в sql запрос?
Re: передача геометрии обьекта в функцию
Добавлено: 27 фев 2017, 10:24
freeExec
Я конечно не силён в питоне, но каким образом QgsFeature(); связывается с "выбранного объекта на слое", мне кажется это создаёт просто пустой объект.
Re: передача геометрии обьекта в функцию
Добавлено: 27 фев 2017, 13:55
Эдуард Казаков
Конечно, вы инициализируете пустой экземпляр класса QgsFeature. Там ничего нет.
Вы в консоли работаете?
Сначала нужно как-то определить слой, с которым вы работаете, например:
Код: Выделить всё
layer = iface.activeLayer() # Текущий выделенный в дереве слой
Как загружать другие слои можно найти
здесь
Затем извлечь из слоя объекты
Код: Выделить всё
features = layer.getFeatures() # все объекты
features = layer.selectedFeatures() # выделенные объекты
Это итератор, который содержит все (или выделенные) объекты слоя
Можно взять первый так:
либо перебрать их циклом
У каждой feature есть метод geometry(), который возвращает геометрию как класс QgsGeometry, а у объектов QgsGeometry есть методы:
которые возвращают уже списки координат в соответствии с вашим типом геометрии. Например
Код: Выделить всё
>>> feature.geometry().asPoint()
(730424,-38788)
Re: передача геометрии обьекта в функцию
Добавлено: 28 фев 2017, 14:27
kasandra
Благодарю за комментарию, буду пробовать действовать согласно вашим подсказкам

Re: передача геометрии обьекта в функцию
Добавлено: 03 мар 2017, 11:46
kasandra
[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 после выполнения.
Re: передача геометрии обьекта в функцию
Добавлено: 14 мар 2017, 00:34
Эдуард Казаков
Здравствуйте.
После вот этой команды
В переменной feature записан итератор. К нему нельзя обратиться так, у него нет geometry().
Нужно сначала извлечь собственно объекты. Через for или через next(), как показано в примере выше.