Wie zeichnet man Polygone aus der Python-Konsole?

Antworten:

26

es ist nicht wirklich kompliziert, Blick auf Speicheranbieter in Vektor :

  • Mit QgsPoint(x,y)und wird ein Punkt erzeugtQgsGeometry.fromPoint(QgsPoint(x,y))
  • Eine Linie wird mit zwei Punkten erstellt: QgsGeometry.fromPolyline([QgsPoint(x1,y1),QgsPoint(x2,y2)]))
  • Ein Polygon wird mit einer Liste von Punkten erstellt: QgsGeometry.fromPolygon([[QgsPoint(x1,y1),QgsPoint(x2,y2), QgsPoint(x3,y3)]])

1) zwei Punkte:

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

Bildbeschreibung hier eingeben

2) die Verbindungslinie zwischen den beiden Punkten

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])

Bildbeschreibung hier eingeben

3) ein Polygon, das die Punkte abdeckt

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])

Bildbeschreibung hier eingeben

-

Änderungen in QGIS 3.0 und höher:

Ab QGIS 3.0 ist der oben genannte Workflow noch korrekt, aber bestimmte Funktionen haben sich geändert. Siehe https://qgis.org/api/api_break.html

Ändern Sie die folgenden Funktionen, um den obigen Code zu aktualisieren:

QgsPoint -> QgsPointXY
QgsfromPoint -> QgsfromPointXY
QgsfromPolyline -> QgsfromPolylineXY
QgsfromPolygon -> QgsfromPolylineXY
QgsfromPolyline -> QgsfromPolylineXY
QgsMapLayerRegistry -> QgsProject
Gen
quelle
Vielen Dank für den Code. Ich habe mich gefragt, wie ich den CRS-Auswahldialog loswerden kann, nachdem ich den Code ausgeführt habe.
Wannik
Wie kann ich Stil hinzufügen?
cjahangir
3

Wählen Sie einfach das CRS in der Ebenendefinition aus: QgsVectorLayer('Polygon?crs=epsg:2154', 'poly' , "memory")zum Beispiel (hier ist EPSG 2154 für die Lambert 93-Projektion vorgesehen, Standard in Frankreich, aber Sie können setzen, was Sie wollen).

Obenj
quelle
Wie kann ich Stil hinzufügen?
cjahangir