Erstellen Sie Liniensegmente an Punktkoordinaten in QGIS

9

Ich habe eine Punktvektorebene mit angleFeld. Wie kann ich an diesen Punkten Liniensegmente mit einer bestimmten Länge und einem bestimmten Winkel erstellen?

Ich habe dies mit Stiloptionen gemacht, aber ich brauche dies physisch als Linienvektorebene: Geben Sie hier die Bildbeschreibung ein

Karol Daniluk
quelle

Antworten:

13

Ein mögliches Werkzeug ist Geometrie durch Ausdruck in der Processing Toolbox > Vector geometry.

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein

NB. Vergessen Sie nicht, den erstellten Modified geometryLayer als neuen Datensatz zu speichern , da er sonst nach Abschluss der QGIS-Sitzung verloren geht.

Kazuhito
quelle
6

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()

Das Ergebnis ist das gleiche Geben Sie hier die Bildbeschreibung ein

Vadym
quelle