Mise en mémoire tampon dans pyQGIS?


17

Je cherche quelques exemples pour faire des scripts python simples dans QGIS. Comment pourrais-je faire une analyse tampon sur un ensemble de données?

Je n'arrive pas à trouver grand-chose dans le manuel et le python QGIS qui correspond tout à fait à la documentation Esri.

Réponses:



12

Vous avez différentes façons d'obtenir ce que vous voulez avec la console PyQGIS:

  1. Suggestion d'Aragon;
  2. en utilisant 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. en utilisant la classe Sextante:
from sextante.core.Sextante import Sextante
Sextante.runalg("ftools:fixeddistancebuffer","input_path.shp", False, 500, 5, True, "output_path_buffer.shp")

Pour obtenir les paramètres sextante, tapez Sextante.alghelp("ftools:fixeddistancebuffer")dans la console PyQGIS.

J'espère que cela t'aides !


11

si vous voulez du code basique, vous pouvez essayer:

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

Merci - QgsFeature est-il le nom de la couche ou doit-il inclure un chemin absolu? Et le tampon (5,2) est cette distance?
GIS Danny

1
vous pouvez également le faire avec une boucle for et vous pouvez également éviter de sélectionner les attributs si vous n'en avez
Nathan W

1
@GISDanny QgsFeature est une classe de conteneur pour l'entité, par exemple un attribut et une géométrie dans QGIS. La couche est le bit qgis.utils.iface.activeLayer (), qui utilisera la couche actuellement active dans QGIS.
Nathan W

Est-il possible de spécifier des unités lors de la mise en mémoire tampon en Python? Je continue d'essayer de tamponner une couche de points, je crois que j'ai défini un CRS avec des unités en pieds, mais les tampons que je reçois sont énormes - la couche de points a été initialement importée de csv avec des cordons lat longs mais quand j'ai créé une couche vectorielle à partir de il j'ai spécifié un système local. Quelque chose ne va évidemment pas.
kflaw

9

Juste une petite chose à ajouter à la dernière réponse.

Pour rechercher un algorithme SEXTANTE sur un sujet donné, utilisez Sextante.alglist (). Par exemple, dans le cas de la recherche de quelque chose contenant "tampon", vous feriez

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

Et vous obtiendriez:

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

De cette façon, vous pouvez trouver le nom de l'algorithme à appeler (ftools: fixeddistancebuffer, dans l'exemple proposé dans la réponse ci-dessus)

Vous pouvez transformer votre script en un nouvel algorithme dans SEXTANTE. La documentation SEXTANTE contient des informations détaillées à ce sujet.


C'est une excellente astuce qui mérite d'être mentionnée sur votre blog sextante. Je le cherchais hier.
underdark
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.