Буферизация в pyQGIS?

17

Я ищу несколько примеров для написания простых скриптов на Python в QGIS. Как бы я сделал анализ буфера на наборе данных?

Кажется, я не могу найти в руководстве и QGIS python много такого, что вполне соответствует документации Esri.

ГИС Дэнни
источник

Ответы:

12

У вас есть разные способы получить то, что вы хотите с помощью консоли PyQGIS:

  1. Предложение Арагона;
  2. используя класс QgsGeometryAnalyzer:
from qgis.utils import iface
from qgis.analysis import QgsGeometryAnalyzer 
mc = iface.mapCanvas() 
layer = mc.currentLayer()
QgsGeometryAnalyzer().buffer(layer, "path_to/output.shp", 500, False, False, -1)
  1. используя класс Sextante:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

Чтобы получить параметры sextante, введите Sextante.alghelp("ftools:fixeddistancebuffer")в консоли PyQGIS.

Надеюсь это поможет !

lrssvt
источник
11

если вы хотите базовый код, вы можете попробовать:

#Don't forget to Toggle Editing

lyr = qgis.utils.iface.activeLayer()
provider = lyr.dataProvider()
feat= QgsFeature()
alls = provider.attributeIndexes()
provider.select(alls)

while provider.nextFeature(feat):
    buff = feat.geometry().buffer(5,2)
    lyr.dataProvider().changeGeometryValues({feat.id(): buff})
Арагон
источник
Спасибо - QgsFeature - это имя слоя или оно должно содержать абсолютный путь? А буфер (5,2) это расстояние?
ГИС Дэнни
1
Вы также можете сделать это с помощью цикла for, и вы также можете избежать выбора атрибутов, если они не нужны gist.github.com/4094707
Натан W
1
@GISDanny QgsFeature - это контейнерный класс для объекта, например атрибута и геометрии в QGIS. Слой - это бит qgis.utils.iface.activeLayer (), который будет использовать текущий активный слой в QGIS.
Натан W
Можно ли указать единицы при буферизации в Python? Я продолжаю пытаться буферизовать точечный слой, который, я полагаю, я установил в CRS с единицами в футах, но буферы, которые я получаю, огромны - точечный слой был первоначально импортирован из CSV с помощью длинных шнуров, но когда я создал векторный слой из это я указал локальную систему. Что-то явно не так.
KFlaw
9

Просто небольшая вещь, чтобы добавить к последнему ответу.

Чтобы найти алгоритм SEXTANTE по данной теме, используйте Sextante.alglist (). Например, в случае поиска чего-либо, содержащего «буфер», вы должны сделать

>>> from sextante.core.Sextante import Sextante
>>> Sextante.alglist("buffer")

И вы получите:

Grid Buffer------------------------------------------>saga:gridbuffer
Grid Proximity Buffer-------------------------------->saga:gridproximitybuffer
Shapes Buffer---------------------------------------->saga:shapesbuffer
Threshold Buffer------------------------------------->saga:thresholdbuffer
Fixed distance buffer-------------------------------->ftools:fixeddistancebuffer
Variable distance buffer----------------------------->ftools:variabledistancebuffer
r.buffer - Creates a raster map layer showing buffer zones surrounding cells that contain non-NULL category values.--->grass:r.buffer
v.buffer.angle--------------------------------------->grass:v.buffer.angl
v.buffer.column - Creates a buffer around features of given type.--->grass:v.buffer.column
v.buffer.distance - Creates a buffer around features of given type.--->grass:v.buffer.distance
v.buffer.minordistance------------------------------->grass:v.buffer.minordistance

Таким образом, вы можете найти имя вызываемого алгоритма (ftools: fixeddistancebuffer, в примере, предложенном в ответе выше)

Вы можете превратить ваш скрипт в новый алгоритм в SEXTANTE. Документация SEXTANTE содержит подробную информацию об этом.

Виктор Олая Ферреро
источник
Это отличный совет, который стоит упомянуть в своем блоге sextante. Я искал это вчера.
Подземье