Comment dessiner des polygones à partir de la console Python?


Réponses:


26

ce n'est pas vraiment compliqué, regardez le fournisseur de mémoire dans le vecteur :

  • un point est créé avec QgsPoint(x,y)etQgsGeometry.fromPoint(QgsPoint(x,y))
  • une ligne est créée avec deux points: QgsGeometry.fromPolyline([QgsPoint(x1,y1),QgsPoint(x2,y2)]))
  • un polygone est créé avec une liste de points: QgsGeometry.fromPolygon([[QgsPoint(x1,y1),QgsPoint(x2,y2), QgsPoint(x3,y3)]])

1) deux points:

# create a memory layer with two points
layer =  QgsVectorLayer('Point', 'points' , "memory")
pr = layer.dataProvider() 
# add the first point
pt = QgsFeature()
point1 = QgsPoint(50,50)
pt.setGeometry(QgsGeometry.fromPoint(point1))
pr.addFeatures([pt])
# update extent of the layer
layer.updateExtents()
# add the second point
pt = QgsFeature()
point2 = QgsPoint(100,150)
pt.setGeometry(QgsGeometry.fromPoint(point2))
pr.addFeatures([pt])
# update extent
layer.updateExtents()
# add the layer to the canvas
QgsMapLayerRegistry.instance().addMapLayers([layer])

entrez la description de l'image ici

2) la ligne reliant les deux points

layer =  QgsVectorLayer('LineString', 'line' , "memory")
pr = layer.dataProvider() 
line = QgsFeature()
line.setGeometry(QgsGeometry.fromPolyline([point1,point2]))
pr.addFeatures([line])
layer.updateExtents()
QgsMapLayerRegistry.instance().addMapLayers([layer])

entrez la description de l'image ici

3) un polygone couvrant les points

layer =  QgsVectorLayer('Polygon', 'poly' , "memory")
pr = layer.dataProvider() 
poly = QgsFeature()
points = [point1,QgsPoint(50,150),point2,QgsPoint(100,50)]
# or points = [QgsPoint(50,50),QgsPoint(50,150),QgsPoint(100,150),QgsPoint(100,50)] 
poly.setGeometry(QgsGeometry.fromPolygon([points]))
pr.addFeatures([poly])
layer.updateExtents()
QgsMapLayerRegistry.instance().addMapLayers([layer])

entrez la description de l'image ici

-

Changements dans QGIS 3.0 et suivants:

Pour QGIS 3.0 et versions ultérieures, le flux de travail ci-dessus est toujours correct, mais certaines fonctions ont changé. Voir https://qgis.org/api/api_break.html

Pour mettre à jour le code ci-dessus, modifiez les fonctions suivantes:

QgsPoint -> QgsPointXY
QgsfromPoint -> QgsfromPointXY
QgsfromPolyline -> QgsfromPolylineXY
QgsfromPolygon -> QgsfromPolylineXY
QgsfromPolyline -> QgsfromPolylineXY
QgsMapLayerRegistry -> QgsProject

Merci beaucoup pour le code. Je me demandais comment puis-je me débarrasser de la boîte de dialogue de sélection CRS après avoir exécuté le code?
— wannik

comment puis-je ajouter du style?
— cjahangir

3

Sélectionnez simplement le CRS dans la définition du calque: QgsVectorLayer('Polygon?crs=epsg:2154', 'poly' , "memory")par exemple (ici l'EPSG 2154 est pour la projection Lambert 93, standard en France métropolitaine, mais vous pouvez mettre ce que vous voulez)


comment ajouter du style?
— cjahangir
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.