Crie segmentos de linha nas coordenadas do ponto no QGIS

9

Eu tenho uma camada de vetor de ponto com anglecampo. Como posso criar segmentos de linha nesses pontos com determinado comprimento e ângulo?

Fiz isso com opções de estilo, mas preciso disso fisicamente como camada de vetor de linhas: insira a descrição da imagem aqui

Karol Daniluk
fonte

Respostas:

13

Uma ferramenta possível é Geometria por expressão no Processing Toolbox > Vector geometry.

insira a descrição da imagem aqui

Uma expressão Geometry para criar linhas ( comprimento = 100 m ) é a seguinte:

make_line(project($geometry, 50, radians("angle")), project($geometry, 50, radians("angle"+180)))
  • project($geometry, 50, radians("angle")) parte cria um novo ponto movendo seus pontos na direção "ângulo" em 50 metros.
  • project($geometry, 50, radians("angle"+180)) cria outro ponto na direção oposta.
  • make_line() amarra os dois pontos acima, então o comprimento total da linha é de 100 metros.
  • project() A função assume que seu "ângulo" é medido no sentido horário a partir do norte, portanto, essa expressão pode exigir edições, dependendo de como o campo "ângulo" é feito.

insira a descrição da imagem aqui

NB. Não se esqueça de salvar a Modified geometrycamada criada como um novo conjunto de dados; caso contrário, ela será perdida quando você terminar a sessão do QGIS.

Kazuhito
fonte
6

Eu coloquei um exemplo de solução da mesma tarefa com um aplicativo independente pyqgis (3.2). Abaixo do código python

from qgis.core import QgsPointXY, QgsApplication, QgsVectorLayer, QgsFeature, QgsGeometry
from PyQt5.QtWidgets import QApplication
import sys
import math

def main():
    print('Start program')

    qgis_prefix_path = 'C:\\OSGeo4W64\\apps\\qgis'
    app = QApplication(sys.argv)
    QgsApplication.setPrefixPath(qgis_prefix_path, True)

    QgsApplication.initQgis()

    point_path = 'd:/Users/Bogomolov/Qgis/Test_prj/point.shp'
    line_path = 'd:/Users/Bogomolov/Qgis/Test_prj/lines.shp'
    point_layer = QgsVectorLayer(point_path, "pointlayer", "ogr")
    layer = QgsVectorLayer(line_path, "linelayer", "ogr")


    for feature in point_layer.getFeatures():
        geom: QgsGeometry = feature.geometry()
        pnt: QgsPointXY = geom.asPoint()
        length = feature['distance']
        bearing = feature['bearing']
        id = feature['id']
        print('id=', id)
        pnt0 = direct_geodetic_task(pnt, length / 2, bearing + 180)
        pnt1 = direct_geodetic_task(pnt, length / 2, bearing)
        points = []
        points.append(pnt0)
        points.append(pnt1)
        fields = layer.dataProvider().fields()
        feature = QgsFeature()
        feature.setGeometry(QgsGeometry.fromPolylineXY(points))
        feature.setFields(fields)
        feature.setAttribute('id', id)
        layer.dataProvider().addFeature(feature)

    # layer.commitChanges()

    QgsApplication.exitQgis()

def direct_geodetic_task(pnt, dist, bear):
    if bear > 360.0:
        bear = bear - 360
    if bear < 0:
        bear = 360 + bear

    deg = bear * math.pi / 180

    dx = dist * math.sin(deg)
    dy = dist * math.cos(deg)
    x = pnt.x() + dx
    y = pnt.y() + dy

    return QgsPointXY(x, y)

if __name__ == '__main__':
    main()

O resultado é o mesmo insira a descrição da imagem aqui

Vadym
fonte