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
gène
la source
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)

Obenj
la source
comment ajouter du style?
cjahangir