Respostas:
Uma ferramenta possível é Geometria por expressão no Processing Toolbox > Vector geometry
.
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. NB. Não se esqueça de salvar a Modified geometry
camada criada como um novo conjunto de dados; caso contrário, ela será perdida quando você terminar a sessão do QGIS.
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()