Erstellen einer Linie mit drei Punkten mit Python in QGIS?


Antworten:


23

Sie müssen zunächst verstehen, wie PyQGIS mit Geometrie umgeht ( Geometry Handling ).

Das wichtigste Element ist der Punkt:

QgsPoint (x, y)

und eine Linie oder ein Liniensegment bestehen aus zwei Punkten:

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

So konstruieren Sie eine Linie:

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

und mit einer Speicherschicht (nur Geometrie, ohne die Attribute):

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

Das Ergebnis ist:

Geben Sie hier die Bildbeschreibung ein

Fügen Sie es mit 3 Punkten einfach als neues Feature hinzu:

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

und das Ergebnis ist:

Geben Sie hier die Bildbeschreibung ein

Und mit einer for-Schleife können Sie eine Linie mit vielen Segmenten erstellen:

Geben Sie hier die Bildbeschreibung ein


Wenn Sie zur vorherigen Antwort hinzufügen, können Sie mit der Syntax eine Linie mit 3 oder mehr Punkten erstellen, ohne jedes Segment einzeln erstellen zu müssen, z. B.: Line = QgsGeometry.fromPolyline ([pt1, pt2, pt3, pt4])
Carlos MSF
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.