Buffering en pyQGIS?

17

Estoy buscando algunos ejemplos para hacer scripts python simples en QGIS. ¿Cómo haría un análisis de búfer en un conjunto de datos?

Parece que no puedo encontrar mucho en el manual y QGIS python que coincida bastante con la documentación de Esri.

SIG Danny
fuente

Respuestas:

12

Tiene diferentes formas de obtener lo que desea con la consola PyQGIS:

  1. Sugerencia de Aragón;
  2. utilizando la clase 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. mediante el uso de la clase Sextante:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

Para obtener los parámetros de sextante, escriba Sextante.alghelp("ftools:fixeddistancebuffer")en la consola PyQGIS.

Espero que esto ayude !

lrssvt
fuente
11

si quieres un código básico, puedes probar:

#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ón
fuente
Gracias: ¿QgsFeature es el nombre de la capa o debe incluir una ruta absoluta? Y el buffer (5,2) es esa distancia?
SIG Danny
1
También puede hacer esto con un bucle for y también puede evitar seleccionar los atributos si no es necesario gist.github.com/4094707
Nathan W
1
@GISDanny QgsFeature es una clase de contenedor para una característica, por ejemplo, atributo y geometría en QGIS. La capa es el bit qgis.utils.iface.activeLayer (), que usará la capa actualmente activa en QGIS.
Nathan W
¿Es posible especificar unidades al almacenar en búfer en Python? Sigo tratando de amortiguar una capa de puntos que creo que he establecido en un CRS con unidades en pies, pero los amortiguadores que estoy obteniendo son enormes: la capa de puntos se importó originalmente de csv con cables largos, pero cuando creé una capa vectorial de Especifiqué un sistema local. Algo obviamente está mal.
kflaw
9

Solo una pequeña cosa para agregar a la última respuesta.

Para buscar un algoritmo SEXTANTE sobre un tema determinado, use Sextante.alglist (). Por ejemplo, en el caso de buscar algo que contenga "buffer", haría

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

Y obtendrías:

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

De esa manera, puede encontrar el nombre del algoritmo para llamar (ftools: fixeddistancebuffer, en el ejemplo propuesto en la respuesta anterior)

Puede convertir su script en un nuevo algoritmo en SEXTANTE. La documentación de SEXTANTE tiene información detallada al respecto.

Victor Olaya Ferrero
fuente
Es un gran consejo que vale la pena mencionar en tu blog sextante. Estaba buscando esto ayer.
oscuro