Tạo dòng có ba điểm với Python trong QGIS?


8

Tôi mới sử dụng Python và tôi có một số người khó tính. Tôi muốn tạo một lớp đơn giản với một dòng trong bảng điều khiển của QGIS với Python. Làm thế nào tôi có thể làm điều đó?


Bạn đang cố gắng làm một cái gì đó khác với những gì bạn đã hỏi trong một câu hỏi khác? gis.stackexchange.com/questions/60007/ Google

Có bởi vì tôi muốn thực hiện một hành động với python
user1573901

Câu trả lời:


23

Trước tiên bạn phải hiểu cách PyQGIS xử lý hình học ( Xử lý hình học )

Yếu tố quan trọng nhất là điểm:

QssPoint (x, y)

và một dòng hoặc một đoạn của dòng bao gồm hai điểm:

QssGeometry.fromPolyline ([QssPoint (x1, y1), QssPoint (x2, y2)]));

Vì vậy, để xây dựng một dòng:

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

và với một lớp bộ nhớ (chỉ hình học, không có thuộc tính):

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

kết quả là:

nhập mô tả hình ảnh ở đây

với 3 điểm, chỉ cần thêm nó như một tính năng mới:

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

và kết quả là:

nhập mô tả hình ảnh ở đây

Và với vòng lặp for, bạn có thể tạo một dòng có nhiều phân đoạn:

nhập mô tả hình ảnh ở đây


Thêm vào câu trả lời trước, bạn có thể tạo một dòng có 3 điểm trở lên bằng cú pháp, mà không phải tạo từng phân đoạn riêng lẻ, như: line = QgsGeometry.fromPolyline ([pt1, pt2, pt3, pt4])
Carlos MSF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.