Créer une ligne avec trois points avec Python dans QGIS?

8

Je suis nouveau sur Python et j'ai quelques difficultés. Je veux créer une couche simple avec une ligne dans la console de QGIS avec Python. Comment puis je faire ça?

user1573901
la source
Essayez-vous de faire quelque chose de différent de ce que vous avez demandé dans une autre question? gis.stackexchange.com/questions/60007/…
Oui parce que je veux faire une action avec python
user1573901

Réponses:

23

Vous devez d'abord comprendre comment PyQGIS gère la géométrie ( Geometry Handling )

L'élément le plus important est le point:

QgsPoint (x, y)

et une ligne ou un segment de ligne sont composés de deux points:

QgsGeometry.fromPolyline ([QgsPoint (x1, y1), QgsPoint (x2, y2)]));

Donc, pour construire une ligne:

line_start = QgsPoint(50,50)
line_end = QgsPoint(100,150)
line = QgsGeometry.fromPolyline([line_start,line_end])

et avec une couche mémoire (géométrie uniquement, sans les attributs):

# create a new memory layer
v_layer = QgsVectorLayer("LineString", "line", "memory")
pr = v_layer.dataProvider()
# create a new feature
seg = QgsFeature()
# add the geometry to the feature, 
seg.setGeometry(QgsGeometry.fromPolyline([line_start, line_end]))
# ...it was here that you can add attributes, after having defined....
# add the geometry to the layer
pr.addFeatures( [ seg ] )
# update extent of the layer (not necessary)
v_layer.updateExtents()
# show the line  
QgsMapLayerRegistry.instance().addMapLayers([v_layer])

le résultat est:

entrez la description de l'image ici

avec 3 points, il suffit de l'ajouter comme nouvelle fonctionnalité:

newpoint = QgsPoint(143,125)
v_layer = QgsVectorLayer("LineString", "line_3pt", "memory")
pr = v_layer.dataProvider()
seg = QgsFeature()
seg.setGeometry(QgsGeometry.fromPolyline([line_start, line_end]))
# new feature: line from line_end to newpoint
seg = QgsFeature()
seg.setGeometry(QgsGeometry.fromPolyline([line_end, newpoint]))
pr.addFeatures( [ seg ] )
v_layer.updateExtents()
# add the line to 
QgsMapLayerRegistry.instance().addMapLayers([v_layer])

et le résultat est:

entrez la description de l'image ici

Et avec une boucle for, vous pouvez créer une ligne avec de nombreux segments:

entrez la description de l'image ici

gène
la source
En ajoutant à la réponse précédente, vous pouvez créer une ligne avec 3 points ou plus avec la syntaxe, sans avoir à créer chaque segment individuellement, comme: line = QgsGeometry.fromPolyline ([pt1, pt2, pt3, pt4])
Carlos MSF