Create line segments at point coordinates in QGIS
One possible tool is Geometry by expression in the Processing Toolbox > Vector geometry
.
A Geometry expression to create lines (length= 100 m) is as below:
make_line(project($geometry, 50, radians("angle")), project($geometry, 50, radians("angle"+180)))
project($geometry, 50, radians("angle"))
part creates a new point by moving your points to "angle" direction by 50 meters.project($geometry, 50, radians("angle"+180))
creates another point to the oposite direction.make_line()
ties the above two points, so the total line length is 100 meters.project()
function assumes that your "angle" is measured clockwise from north, so this expression may require edits depending on how your "angle" field is made.
NB. Do not forget saving created Modified geometry
layer as a new dataset, otherwise it will be lost when you finish QGIS session.
I put an example of solving the same task with a pyqgis (3.2) standalone application. Below the python code
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()
The result is the same