Crear segmentos de línea en coordenadas de puntos en QGIS

9

Tengo una capa de vector de punto con anglecampo. ¿Cómo puedo crear segmentos de línea en estos puntos con cierta longitud y ángulo?

Hice esto con opciones de estilo pero lo necesito físicamente como capa de vector de líneas: ingrese la descripción de la imagen aquí

Karol Daniluk
fuente

Respuestas:

13

Una posible herramienta es la geometría por expresión en el Processing Toolbox > Vector geometry.

ingrese la descripción de la imagen aquí

Una expresión de geometría para crear líneas ( longitud = 100 m ) es la siguiente:

make_line(project($geometry, 50, radians("angle")), project($geometry, 50, radians("angle"+180)))
  • project($geometry, 50, radians("angle")) La parte crea un nuevo punto moviendo sus puntos a la dirección del "ángulo" en 50 metros.
  • project($geometry, 50, radians("angle"+180)) crea otro punto a la dirección opuesta.
  • make_line() une los dos puntos anteriores, por lo que la longitud total de la línea es de 100 metros.
  • project() La función asume que su "ángulo" se mide en el sentido de las agujas del reloj desde el norte, por lo que esta expresión puede requerir modificaciones dependiendo de cómo se realice el campo "ángulo".

ingrese la descripción de la imagen aquí

NÓTESE BIEN. No olvide guardar la Modified geometrycapa creada como un nuevo conjunto de datos, de lo contrario se perderá cuando termine la sesión de QGIS.

Kazuhito
fuente
6

Pongo un ejemplo de resolución de la misma tarea con una aplicación independiente pyqgis (3.2). Debajo del código de 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()

El resultado es el mismo ingrese la descripción de la imagen aquí

Vadym
fuente