Буферизація в pyQGIS?


17

Я шукаю кілька прикладів для виконання простих скриптів python в QGIS. Як мені зробити аналіз буфера на наборі даних?

Я не можу знайти багато в посібнику та QGIS python, що цілком відповідає документації Esri.

Відповіді:



12

У вас є різні способи отримати те, що ви хочете за допомогою консолі PyQGIS:

  1. Пропозиція Арагона;
  2. використовуючи клас 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. за допомогою класу Sextante:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

Щоб отримати параметри sextante, введіть Sextante.alghelp("ftools:fixeddistancebuffer")в консолі PyQGIS.

Сподіваюся, це допомагає!


11

якщо вам потрібен базовий код, ви можете спробувати:

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

Дякую - це QgsFeature назва шару чи він повинен містити абсолютний шлях? А буфер (5,2) - це відстань?
GIS Danny

1
ви також можете зробити це за допомогою циклу for, і ви також можете уникнути вибору атрибутів, якщо це не потрібно gist.github.com/4094707
Nathan W

1
@GISDanny QgsFeature - клас контейнерів для функції, наприклад, атрибута та геометрії в QGIS. Шар - це біт qgis.utils.iface.activeLayer (), який буде використовувати поточний активний шар у QGIS.
Nathan W

Чи можна вказати одиниці при буферизації в Python? Я намагаюся буферизувати точковий шар, я вважаю, що я встановив CRS з одиницями в футах, але буфери, які я отримую, величезні - точковий шар спочатку був імпортований із csv з lat довгими шнурами, але коли я створив векторний шар із це я вказав локальну систему. Щось, очевидно, не так.
kflaw

9

Лише невеличка річ, яку слід додати до останньої відповіді.

Для пошуку алгоритму SEXTANTE щодо заданої теми використовуйте Sextante.alglist (). Наприклад, у випадку пошуку чогось, що містить "буфер", ви б це зробили

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

І ви отримаєте:

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

Таким чином, ви можете знайти ім'я алгоритму для виклику (ftools: fixdistancebuffer, у прикладі, запропонованому у відповіді вище)

Ви можете перетворити свій сценарій у новий алгоритм у SEXTANTE. Документація SEXTANTE містить детальну інформацію про це.


Це чудова порада, яку варто згадати у вашому блозі sextante. Я шукав це вчора.
underdark
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.