QGISでポイント座標にラインセグメントを作成する


9

angleフィールドを持つポイントベクトルレイヤーがあります。これらの点に特定の長さと角度で線分を作成するにはどうすればよいですか?

私はスタイルオプションでこれを行いましたが、これは物理的に線ベクトルレイヤーとして必要です。 ここに画像の説明を入力してください

回答:


13

一つの可能なツールがある式でジオメトリProcessing Toolbox > Vector geometry

ここに画像の説明を入力してください

ラインを作成するジオメトリ式長さ= 100 m)は次のとおりです。

make_line(project($geometry, 50, radians("angle")), project($geometry, 50, radians("angle"+180)))
  • project($geometry, 50, radians("angle")) パーツは、ポイントを「角度」方向に50メートル移動することにより、新しいポイントを作成します。
  • project($geometry, 50, radians("angle"+180)) 反対方向に別のポイントを作成します。
  • make_line() 上記の2つの点を結ぶため、線の全長は100メートルになります。
  • project() 関数は、「角度」が北から時計回りに測定されることを想定しているため、この式は「角度」フィールドの作成方法によっては編集が必要になる場合があります。

ここに画像の説明を入力してください

NB。作成したModified geometryレイヤーを新しいデータセットとして保存することを忘れないでください。そうしないと、QGISセッションを終了すると失われます。


6

同じタスクをpyqgis(3.2)スタンドアロンアプリケーションで解決する例を示します。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()

結果は同じです ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.