Buforowanie w pyQGIS?

17

Szukam kilku przykładów wykonywania prostych skryptów Python w QGIS. Jak miałbym przeprowadzić analizę bufora w zbiorze danych?

Nie mogę znaleźć dużo w podręczniku i pythonie QGIS, który całkiem pasuje do dokumentacji Esri.

GIS Danny
źródło

Odpowiedzi:

12

Masz różne sposoby na uzyskanie tego, co chcesz za pomocą konsoli PyQGIS:

  1. Sugestia Aragona;
  2. za pomocą klasy 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. za pomocą klasy Sextante:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

Aby uzyskać parametry sextante, wpisz Sextante.alghelp("ftools:fixeddistancebuffer")w konsoli PyQGIS.

Mam nadzieję że to pomoże !

lrssvt
źródło
11

jeśli chcesz podstawowy kod, możesz spróbować:

#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})
Aragonia
źródło
Dzięki - czy QgsFeature jest nazwą warstwy, czy powinna zawierać bezwzględną ścieżkę? A bufor (5,2) to ta odległość?
GIS Danny,
1
możesz to również zrobić za pomocą pętli for, a także możesz uniknąć wybierania atrybutów, jeśli nie są potrzebne gist.github.com/4094707
Nathan W
1
@GISDanny QgsFeature jest klasą kontenera dla cechy, np. Atrybutu i geometrii w QGIS. Warstwa jest bitem qgis.utils.iface.activeLayer (), który będzie używał aktualnie aktywnej warstwy w QGIS.
Nathan W
Czy możliwe jest określenie jednostek podczas buforowania w Pythonie? Wciąż próbuję buforować warstwę punktową. Wydaje mi się, że ustawiłem CRS z jednostkami w stopach, ale bufory, które otrzymuję, są ogromne - warstwa punktowa została pierwotnie zaimportowana z csv za pomocą długich przewodów, ale kiedy utworzyłem warstwę wektorową z podałem system lokalny. Coś jest oczywiście nie tak.
kflaw
9

Tylko drobiazg do dodania do ostatniej odpowiedzi.

Aby wyszukać algorytm SEXTANTE na dany temat, użyj Sextante.alglist (). Na przykład, w przypadku wyszukiwania czegoś zawierającego „bufor”, zrobiłbyś to

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

I dostaniesz:

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

W ten sposób możesz znaleźć nazwę algorytmu do wywołania (ftools: fixeddistancebuffer, w przykładzie zaproponowanym w odpowiedzi powyżej)

Możesz zmienić swój skrypt w nowy algorytm w SEXTANTE. Dokumentacja SEXTANTE zawiera szczegółowe informacje na ten temat.

Victor Olaya Ferrero
źródło
To świetna wskazówka, o której warto wspomnieć na swoim blogu sekstante. Szukałem tego wczoraj.
podmrok