Membuat garis dengan tiga poin dengan Python di QGIS?

8

Saya baru mengenal Python dan mengalami beberapa kesulitan. Saya ingin membuat layer sederhana dengan garis di konsol QGIS dengan Python. Bagaimana saya bisa melakukan itu?

pengguna1573901
sumber
Apakah Anda mencoba melakukan sesuatu yang berbeda dari yang Anda tanyakan dalam pertanyaan lain? gis.stackexchange.com/questions/60007/…
Ya karena saya ingin melakukan tindakan dengan python
user1573901

Jawaban:

23

Anda harus terlebih dahulu memahami bagaimana PyQGIS menangani geometri ( Penanganan Geometri )

Elemen yang paling penting adalah intinya:

QgsPoint (x, y)

dan garis atau segmen garis terdiri dari dua titik:

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

Jadi untuk membangun garis:

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

dan dengan lapisan memori (hanya geometri, tanpa atribut):

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

hasilnya adalah:

masukkan deskripsi gambar di sini

dengan 3 poin, tambahkan saja sebagai fitur baru:

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

dan hasilnya adalah:

masukkan deskripsi gambar di sini

Dan dengan for for Anda dapat membuat garis dengan banyak segmen:

masukkan deskripsi gambar di sini

gen
sumber
Menambahkan ke jawaban sebelumnya, Anda dapat membuat garis dengan 3 atau lebih poin dengan sintaks, tanpa harus membuat setiap segmen secara individual, seperti: line = QgsGeometry.fromPolyline ([pt1, pt2, pt3, pt4])
Carlos MSF