Criando linha com três pontos com Python no QGIS?

8

Eu sou novo no Python e estou tendo algumas dificuldades. Eu quero criar uma camada simples com uma linha no console do QGIS com Python. Como eu posso fazer isso?

user1573901
fonte
Você está tentando fazer algo diferente do que pediu em outra pergunta? gis.stackexchange.com/questions/60007/…
Sim, porque eu whant para fazer uma ação com python
user1573901

Respostas:

23

Você deve primeiro entender como o PyQGIS lida com a geometria ( Geometry Handling )

O elemento mais importante é o ponto:

QgsPoint (x, y)

e uma linha ou um segmento de linha são compostos de dois pontos:

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

Então, para construir uma linha:

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

e com uma camada de memória (somente geometria, sem os 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])

o resultado é:

insira a descrição da imagem aqui

com 3 pontos, basta adicioná-lo como um novo recurso:

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

e o resultado é:

insira a descrição da imagem aqui

E com um loop for, você pode criar uma linha com muitos segmentos:

insira a descrição da imagem aqui

gene
fonte
Adicionando à resposta anterior, você pode criar uma linha com 3 ou mais pontos com a sintaxe, sem precisar criar cada segmento individualmente, como: line = QgsGeometry.fromPolyline ([pt1, pt2, pt3, pt4])
Carlos MSF