Erstellen einer Linie mit drei Punkten mit Python in QGIS?

8

Ich bin neu in Python und habe einige Schwierigkeiten. Ich möchte mit Python eine einfache Ebene mit einer Linie in der Konsole von QGIS erstellen. Wie kann ich das machen?

user1573901
quelle
Versuchen Sie etwas anderes zu tun als das, was Sie in einer anderen Frage gestellt haben? gis.stackexchange.com/questions/60007/…
Ja, weil ich eine Aktion mit Python machen
möchte

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

Gen
quelle
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