Buffer em pyQGIS?

17

Estou procurando alguns exemplos para criar scripts python simples no QGIS. Como eu faria uma análise de buffer em um conjunto de dados?

Não consigo encontrar muito no manual e no python QGIS que corresponda bastante à documentação da Esri.

GIS Danny
fonte

Respostas:

12

Você tem diferentes maneiras de obter o que deseja pelo PyQGIS Console:

  1. Sugestão de Aragão;
  2. usando a classe 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. usando a classe Sextante:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

Para obter os parâmetros de sextante, digite Sextante.alghelp("ftools:fixeddistancebuffer")no PyQGIS Console.

Espero que isto ajude !

lrssvt
fonte
11

se você deseja código básico, pode tentar:

#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})
Aragão
fonte
Obrigado - QgsFeature é o nome da camada ou deve incluir um caminho absoluto? E buffer (5,2) é essa distância?
GIS Danny
1
você também pode fazer isso com um loop for e você também pode evitar selecionar os atributos se não for necessário gist.github.com/4094707
Nathan W
1
@GISDanny QgsFeature é uma classe de contêiner para o recurso a, por exemplo, atributo e geometria no QGIS. A camada é o bit qgis.utils.iface.activeLayer (), que usará a camada atualmente ativa no QGIS.
Nathan W
É possível especificar unidades ao armazenar em buffer no Python? Eu continuo tentando armazenar em buffer uma camada de ponto que acredito ter definido um CRS com unidades em pés, mas os buffers que estou recebendo são enormes - a camada de ponto foi originalmente importada do csv com cabos longos, mas quando eu criei uma camada de vetor eu especifiquei um sistema local. Algo está obviamente errado.
kflaw
9

Apenas uma coisinha a acrescentar à última resposta.

Para procurar um algoritmo SEXTANTE sobre um determinado tópico, use Sextante.alglist (). Por exemplo, no caso de procurar algo que contenha "buffer", você faria

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

E você obteria:

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

Dessa forma, você pode encontrar o nome do algoritmo a ser chamado (ftools: fixeddistancebuffer, no exemplo proposto na resposta acima)

Você pode transformar seu script em um novo algoritmo no SEXTANTE. A documentação do SEXTANTE possui informações detalhadas sobre isso.

Victor Olaya Ferrero
fonte
Que ótima dica vale a pena mencionar no seu blog de sextante. Eu estava procurando por isso ontem.
Underdark