¿Crear línea con tres puntos con Python en QGIS?

8

Soy nuevo en Python y tengo algunas dificultades. Quiero crear una capa simple con una línea en la consola de QGIS con Python. ¿Cómo puedo hacer eso?

usuario1573901
fuente
¿Estás tratando de hacer algo diferente a lo que preguntaste en otra pregunta? gis.stackexchange.com/questions/60007/…
Sí, porque quiero hacer una acción con Python
user1573901

Respuestas:

23

Primero debe comprender cómo PyQGIS maneja la geometría ( Geometry Handling )

El elemento más importante es el punto:

QgsPoint (x, y)

y una línea o un segmento de línea se componen de dos puntos:

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

Entonces, para construir una línea:

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

y con una capa de memoria (solo geometría, sin los atributos):

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

el resultado es:

ingrese la descripción de la imagen aquí

con 3 puntos, solo agrégalo como una nueva característica:

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

y el resultado es:

ingrese la descripción de la imagen aquí

Y con un bucle for puede crear una línea con muchos segmentos:

ingrese la descripción de la imagen aquí

gene
fuente
Además de la respuesta anterior, puede crear una línea con 3 o más puntos con la sintaxis, sin tener que crear cada segmento individualmente, como: line = QgsGeometry.fromPolyline ([pt1, pt2, pt3, pt4])
Carlos MSF