Tạo các phân đoạn dòng tại tọa độ điểm trong QGIS


9

Tôi có một lớp vectơ điểm với angletrường. Làm cách nào để tạo các đoạn đường tại các điểm này với độ dài và góc nhất định?

Tôi đã làm điều này với các tùy chọn kiểu nhưng tôi cần lớp vật lý này như lớp vector: nhập mô tả hình ảnh ở đây

Câu trả lời:


13

Một công cụ có thể là Hình học bằng biểu thức trong Processing Toolbox > Vector geometry.

nhập mô tả hình ảnh ở đây

Một Geometry biểu hiện để tạo ra dòng ( chiều dài = 100 m ) như sau:

make_line(project($geometry, 50, radians("angle")), project($geometry, 50, radians("angle"+180)))
  • project($geometry, 50, radians("angle")) một phần tạo ra một điểm mới bằng cách di chuyển các điểm của bạn đến hướng "góc" thêm 50 mét.
  • project($geometry, 50, radians("angle"+180)) tạo một điểm khác cho hướng đối diện.
  • make_line() liên kết hai điểm trên, do đó tổng chiều dài đường là 100 mét.
  • project() Hàm giả định rằng "góc" của bạn được đo theo chiều kim đồng hồ từ phía bắc, do đó biểu thức này có thể yêu cầu chỉnh sửa tùy thuộc vào cách "góc" của bạn được thực hiện.

nhập mô tả hình ảnh ở đây

Lưu ý Đừng quên lưu Modified geometrylớp đã tạo dưới dạng tập dữ liệu mới, nếu không, nó sẽ bị mất khi bạn kết thúc phiên QGIS.


6

Tôi đưa ra một ví dụ về việc giải quyết cùng một nhiệm vụ với một ứng dụng độc lập pyqgis (3.2). Bên dưới mã trăn

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

Kết quả là như nhau nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.