Créer des segments de ligne aux coordonnées de points dans QGIS

9

J'ai une couche vectorielle ponctuelle avec anglechamp. Comment puis-je créer des segments de ligne à ces points avec une certaine longueur et un certain angle?

Je l'ai fait avec des options de style mais j'en ai besoin physiquement comme couche vectorielle de lignes: entrez la description de l'image ici

Karol Daniluk
la source

Réponses:

13

Un outil possible est la géométrie par expression dans le Processing Toolbox > Vector geometry.

entrez la description de l'image ici

Une expression géométrique pour créer des lignes ( longueur = 100 m ) est la suivante:

make_line(project($geometry, 50, radians("angle")), project($geometry, 50, radians("angle"+180)))
  • project($geometry, 50, radians("angle")) part crée un nouveau point en déplaçant vos points dans la direction "angle" de 50 mètres.
  • project($geometry, 50, radians("angle"+180)) crée un autre point dans la direction opposée.
  • make_line() relie les deux points ci-dessus, la longueur totale de la ligne est donc de 100 mètres.
  • project() La fonction suppose que votre "angle" est mesuré dans le sens horaire à partir du nord, donc cette expression peut nécessiter des modifications en fonction de la façon dont votre champ "angle" est créé.

entrez la description de l'image ici

NB. N'oubliez pas d'enregistrer la Modified geometrycouche créée en tant que nouvel ensemble de données, sinon elle sera perdue lorsque vous aurez terminé la session QGIS.

Kazuhito
la source
6

J'ai mis un exemple de résolution de la même tâche avec une application autonome pyqgis (3.2). Sous le code 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()

le résultat est le même entrez la description de l'image ici

Vadym
la source