Come disegnare poligoni dalla console di Python?


Risposte:


26

non è davvero complicato, guarda il provider di memoria nel vettore ::

  • viene creato un punto con QgsPoint(x,y)eQgsGeometry.fromPoint(QgsPoint(x,y))
  • viene creata una linea con due punti: QgsGeometry.fromPolyline([QgsPoint(x1,y1),QgsPoint(x2,y2)]))
  • viene creato un poligono con un elenco di punti: QgsGeometry.fromPolygon([[QgsPoint(x1,y1),QgsPoint(x2,y2), QgsPoint(x3,y3)]])

1) due punti:

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

inserisci qui la descrizione dell'immagine

2) la linea che collega i due punti

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

inserisci qui la descrizione dell'immagine

3) un poligono che copre i punti

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

inserisci qui la descrizione dell'immagine

-

Modifiche in QGIS 3.0 e successive:

Per QGIS 3.0 e versioni successive il flusso di lavoro sopra riportato è ancora corretto, ma alcune funzioni sono state modificate. Vedi https://qgis.org/api/api_break.html

Per aggiornare il codice sopra, cambia le seguenti funzioni:

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

Grazie mille per il codice. Mi chiedevo come posso eliminare la finestra di dialogo di selezione CRS dopo aver eseguito il codice?
wannik,

come posso aggiungere stile?
Cjahangir,

3

Basta selezionare il CRS nella definizione del livello: QgsVectorLayer('Polygon?crs=epsg:2154', 'poly' , "memory")ad esempio (qui EPSG 2154 è per la proiezione Lambert 93, standard nella Francia metropolitana, ma puoi mettere quello che vuoi)


come posso aggiungere stile?
Cjahangir,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.