Antworten:
Ein mögliches Werkzeug ist Geometrie durch Ausdruck in der Processing Toolbox > Vector geometry
.
Ein Geometrieausdruck zum Erstellen von Linien ( Länge = 100 m ) lautet wie folgt:
make_line(project($geometry, 50, radians("angle")), project($geometry, 50, radians("angle"+180)))
project($geometry, 50, radians("angle"))
Teil erstellt einen neuen Punkt, indem Sie Ihre Punkte um 50 Meter in die "Winkel" -Richtung bewegen.project($geometry, 50, radians("angle"+180))
erzeugt einen weiteren Punkt in die entgegengesetzte Richtung.make_line()
verbindet die beiden oben genannten Punkte, sodass die Gesamtlinienlänge 100 Meter beträgt.project()
Die Funktion setzt voraus, dass Ihr "Winkel" von Norden aus im Uhrzeigersinn gemessen wird. Daher muss dieser Ausdruck möglicherweise bearbeitet werden, je nachdem, wie Ihr "Winkel" -Feld erstellt wird. NB. Vergessen Sie nicht, den erstellten Modified geometry
Layer als neuen Datensatz zu speichern , da er sonst nach Abschluss der QGIS-Sitzung verloren geht.
Ich habe ein Beispiel für die Lösung derselben Aufgabe mit einer eigenständigen pyqgis (3.2) -Anwendung gegeben. Unterhalb des Python-Codes
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()