Buffering di pyQGIS?

17

Saya mencari beberapa contoh untuk membuat skrip python sederhana di QGIS. Bagaimana saya melakukan analisis buffer pada dataset?

Saya sepertinya tidak bisa menemukan banyak dalam manual dan python QGIS yang sangat cocok dengan dokumentasi Esri.

GIS Danny
sumber

Jawaban:

12

Anda memiliki berbagai cara untuk mendapatkan apa yang Anda inginkan oleh PyQGIS Console:

  1. Saran Aragon;
  2. dengan menggunakan kelas 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. dengan menggunakan kelas Sextante:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

Untuk mendapatkan parameter sextante ketik Sextante.alghelp("ftools:fixeddistancebuffer")PyQGIS Console.

Semoga ini membantu !

lrssvt
sumber
11

jika Anda menginginkan kode dasar, Anda dapat mencoba:

#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})
Aragon
sumber
Terima kasih - apakah QgsFeature adalah nama layer atau haruskah itu menyertakan path absolut? Dan buffer (5,2) adalah jarak itu?
GIS Danny
1
Anda juga dapat melakukan ini dengan for for dan Anda juga dapat menghindari memilih atribut jika tidak diperlukan gist.github.com/4094707
Nathan W
1
@GISDanny QgsFeature adalah kelas wadah untuk fitur, misalnya atribut dan geometri di QGIS. Layer tersebut adalah bit qgis.utils.iface.activeLayer (), yang akan menggunakan layer yang saat ini aktif di QGIS.
Nathan W
Apakah mungkin untuk menentukan unit saat buffering di Python? Saya terus mencoba untuk buffer lapisan titik Saya percaya saya telah menetapkan CRS dengan satuan di kaki tetapi buffer yang saya dapatkan sangat besar - lapisan titik awalnya diimpor dari csv dengan kabel lat panjang tetapi ketika saya membuat layer vektor dari itu saya tentukan sistem lokal. Jelas ada sesuatu yang salah.
kflaw
9

Hanya sedikit hal untuk ditambahkan ke balasan terakhir.

Untuk mencari algoritma SEXTANTE tentang topik yang diberikan, gunakan Sextante.alglist (). Misalnya, dalam hal mencari sesuatu yang mengandung "buffer", Anda akan melakukannya

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

Dan Anda akan mendapatkan:

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

Dengan begitu, Anda dapat menemukan nama algoritma yang akan dipanggil (ftools: fixeddistancebuffer, dalam contoh yang diajukan dalam balasan di atas)

Anda dapat mengubah skrip Anda menjadi algoritme baru di SEXTANTE. Dokumentasi SEXTANTE memiliki informasi terperinci tentang itu.

Victor Olaya Ferrero
sumber
Tip yang bagus untuk disebutkan di blog sextante Anda. Saya mencari ini kemarin.
underdark