Pufferung in pyQGIS?


17

Ich suche nach Beispielen für einfache Python-Skripte in QGIS. Wie würde ich eine Pufferanalyse für einen Datensatz durchführen?

Ich kann anscheinend nicht viel im Handbuch und in QGIS-Python finden, das der Esri-Dokumentation durchaus entspricht.

Antworten:



12

Sie haben verschiedene Möglichkeiten, mit PyQGIS Console das zu erreichen, was Sie möchten:

  1. Aragons Vorschlag;
  2. mithilfe der QgsGeometryAnalyzer-Klasse:
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. mit der Sextante-Klasse:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

Um die Sextanten-Parameter Sextante.alghelp("ftools:fixeddistancebuffer")abzurufen, geben Sie PyQGIS Console ein.

Hoffe das hilft !


11

Wenn Sie einfachen Code möchten, können Sie versuchen:

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

Danke - ist QgsFeature der Layername oder sollte er einen absoluten Pfad enthalten? Und Puffer (5,2) ist dieser Abstand?
GIS Danny

1
Sie können dies auch mit einer for-Schleife tun und die Auswahl der Attribute bei Bedarf vermeiden. gist.github.com/4094707
Nathan W

1
@GISDanny QgsFeature ist eine Containerklasse für ein Feature, z. B. Attribut und Geometrie in QGIS. Die Ebene ist das Bit qgis.utils.iface.activeLayer (), das die aktuell aktive Ebene in QGIS verwendet.
Nathan W

Ist es möglich, Einheiten beim Puffern in Python anzugeben? Ich versuche immer wieder, eine Punktebene zu puffern, von der ich glaube, dass ich sie auf einen CRS mit Einheiten in Fuß gesetzt habe, aber die Puffer, die ich erhalte, sind riesig. Die Punktebene wurde ursprünglich aus CSV mit langen Schnüren importiert Ich habe ein lokales System angegeben. Irgendwas stimmt offensichtlich nicht.
kflaw

9

Nur eine Kleinigkeit zur letzten Antwort.

Verwenden Sie Sextante.alglist (), um nach einem SEXTANTE-Algorithmus für ein bestimmtes Thema zu suchen. Wenn Sie beispielsweise nach etwas suchen, das "Buffer" enthält, würden Sie dies tun

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

Und du würdest bekommen:

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

Auf diese Weise können Sie den Namen des aufzurufenden Algorithmus ermitteln (ftools: fixeddistancebuffer in dem in der obigen Antwort vorgeschlagenen Beispiel).

Sie können Ihr Skript in SEXTANTE in einen neuen Algorithmus umwandeln. Die SEXTANTE-Dokumentation enthält detaillierte Informationen dazu.


Das ist ein toller Tipp, den Sie auf Ihrem Sextanten-Blog erwähnen sollten. Ich habe gestern danach gesucht.
Underdunkel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.