Buat segmen garis pada titik koordinat di QGIS

9

Saya memiliki layer vektor titik dengan anglebidang. Bagaimana cara membuat segmen garis pada titik-titik ini dengan panjang dan sudut tertentu?

Saya melakukan ini dengan opsi gaya tetapi saya membutuhkan ini secara fisik sebagai garis-garis layer vektor: masukkan deskripsi gambar di sini

Karol Daniluk
sumber

Jawaban:

13

Salah satu alat yang mungkin adalah Geometri dengan ekspresi di Processing Toolbox > Vector geometry.

masukkan deskripsi gambar di sini

Sebuah Geometri ekspresi untuk membuat garis ( panjang = 100 m ) adalah sebagai berikut:

make_line(project($geometry, 50, radians("angle")), project($geometry, 50, radians("angle"+180)))
  • project($geometry, 50, radians("angle")) bagian menciptakan titik baru dengan memindahkan titik Anda ke arah "sudut" sebesar 50 meter.
  • project($geometry, 50, radians("angle"+180)) menciptakan titik lain ke arah yang berlawanan.
  • make_line() mengikat dua titik di atas, sehingga total panjang garis adalah 100 meter.
  • project() fungsi menganggap bahwa "sudut" Anda diukur searah jarum jam dari utara, jadi ungkapan ini mungkin memerlukan pengeditan tergantung pada bagaimana bidang "sudut" Anda dibuat.

masukkan deskripsi gambar di sini

NB. Jangan lupa menyimpan Modified geometrylayer yang dibuat sebagai dataset baru, jika tidak maka akan hilang ketika Anda menyelesaikan sesi QGIS.

Kazuhito
sumber
6

Saya memberikan contoh penyelesaian tugas yang sama dengan aplikasi mandiri pyqgis (3.2). Di bawah kode 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()

Hasilnya sama masukkan deskripsi gambar di sini

Vadym
sumber