9
Una posible herramienta es la geometría por expresión en el Processing Toolbox > Vector geometry
.
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". NÓTESE BIEN. No olvide guardar la Modified geometry
capa creada como un nuevo conjunto de datos, de lo contrario se perderá cuando termine la sesión de QGIS.
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()