Câu trả lời:
Một công cụ có thể là Hình học bằng biểu thức trong Processing Toolbox > Vector geometry
.
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. Lưu ý Đừng quên lưu Modified geometry
lớ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.
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()