Buffering in pyQGIS?


17

Sto cercando alcuni esempi per realizzare semplici script Python in QGIS. Come farei un'analisi del buffer su un set di dati?

Non riesco a trovare molto nel manuale e in Python QGIS che corrisponda perfettamente alla documentazione di Esri.

Risposte:



12

Esistono diversi modi per ottenere ciò che si desidera dalla console PyQGIS:

  1. Il suggerimento di Aragona;
  2. usando la 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 la classe Sextante:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

Per ottenere i parametri sestanti digitare Sextante.alghelp("ftools:fixeddistancebuffer")nella console PyQGIS.

Spero che sia di aiuto !


11

se vuoi il codice di base, puoi provare:

#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})

Grazie - QgsFeature è il nome del layer o dovrebbe includere un percorso assoluto? E il buffer (5,2) è quella distanza?
GIS Danny,

1
puoi anche farlo con un ciclo for e puoi anche evitare di selezionare gli attributi se non necessario gist.github.com/4094707
Nathan W

1
@GISDanny QgsFeature è una classe contenitore per una caratteristica, ad esempio attributo e geometria in QGIS. Il layer è il bit qgis.utils.iface.activeLayer (), che utilizzerà il layer attualmente attivo in QGIS.
Nathan W,

È possibile specificare le unità durante il buffering in Python? Continuo a provare a bufferizzare un layer punto Credo di aver impostato un CRS con unità in piedi ma i buffer che sto ottenendo sono enormi - il layer punto è stato originariamente importato da CSV con cavi lat lunghi ma quando ho creato un layer vettoriale da ho specificato un sistema locale. Qualcosa è ovviamente sbagliato.
kflaw,

9

Solo una piccola cosa da aggiungere all'ultima risposta.

Per cercare un algoritmo SEXTANTE su un determinato argomento, utilizzare Sextante.alglist (). Ad esempio, nel caso di cercare qualcosa contenente "buffer", lo faresti

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

E otterrai:

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

In questo modo, puoi trovare il nome dell'algoritmo da chiamare (ftools: fixeddistancebuffer, nell'esempio proposto nella risposta sopra)

Puoi trasformare il tuo script in un nuovo algoritmo in SEXTANTE. La documentazione di SEXTANTE contiene informazioni dettagliate al riguardo.


È un ottimo consiglio che vale la pena menzionare sul tuo blog sestante. Lo stavo cercando ieri.
underdark
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.