Có một chức năng hoặc plugin QGIS để vẽ đường uốn lượn?
Tôi đã sử dụng Spline Tool để tự vẽ một số sóng, nhưng nó tốn thời gian. Nếu có thể, tôi muốn vẽ một cái gì đó như:
Inkscape Function Plotter
( sin(x)
đường cong).
Có một chức năng hoặc plugin QGIS để vẽ đường uốn lượn?
Tôi đã sử dụng Spline Tool để tự vẽ một số sóng, nhưng nó tốn thời gian. Nếu có thể, tôi muốn vẽ một cái gì đó như:
Inkscape Function Plotter
( sin(x)
đường cong).
Câu trả lời:
Tôi đề xuất một giải pháp sử dụng PyQGIS. Nó nên hoạt động cho cả hai lớp Linestring và MultiLineString.
Giải pháp này dựa trên việc tạo ra các vòng bán nguyệt, vì vậy bạn cần đặt giá trị cho đường kính (tức là step
biến trong mã bên dưới). Bước bạn chọn sẽ không phải là bước thực sự được sử dụng vì nó được điều chỉnh trên cơ sở độ dài của dòng (nhưng nó sẽ thực sự giống với giá trị được đặt ban đầu). Bạn cần thực hiện một số lần thử trước khi tìm giá trị tốt nhất cho step
biến.
Mã này cũng yêu cầu tham số thứ hai (tùy chọn) (được gọi crv_angle
), giúp giảm hoặc tăng độ cong cho các vòng (Tôi đã thực hiện một vài thử nghiệm cho nó, vì vậy tôi khuyên bạn nên để góc 45 độ làm góc mặc định vì nó sẽ dẫn đến vòng tròn thực Nhẫn).
Bạn chỉ cần chạy mã này từ Bảng điều khiển Python:
from math import sin, cos, radians
step = 3 # choose the proper value (e.g. meters or degrees) with reference to the CRS used
crv_angle = 45 # degrees
def segment(polyline):
for x in range(0, len(polyline) - 1):
first_point = polyline[x]
second_point = polyline[x +1]
seg = QgsGeometry.fromPolyline([first_point, second_point])
tmp_azim = first_point.azimuth(second_point)
len_feat = seg.length()
parts = int(len_feat/step)
real_step = len_feat/parts # this is the real step applied
points = []
current = 0
up = True
while current < len_feat:
if up:
round_angle = radians(90 - (tmp_azim - crv_angle))
up = False
else:
round_angle = radians(90 - (tmp_azim + crv_angle))
up = True
first = seg.interpolate(current)
coord_x, coord_y = (first.asPoint().x(), first.asPoint().y())
p1=QgsPointV2(coord_x, coord_y)
dist_x, dist_y = ((real_step*sin(rad_crv_angle))* cos(round_angle), (real_step*sin(rad_crv_angle)) * sin(round_angle))
p2 = QgsPointV2(coord_x + dist_x, coord_y + dist_y)
points.extend([p1, p2])
current += real_step
second = seg.interpolate(current + real_step)
p3=QgsPointV2(second.asPoint().x(), second.asPoint().y())
points.append(p3)
circularRing = QgsCircularStringV2()
circularRing.setPoints(points) # set points for circular rings
fet = QgsFeature()
fet.setGeometry(QgsGeometry(circularRing))
prov.addFeatures([fet])
layer = iface.activeLayer() # load the input layer as you want
crs = layer.crs().toWkt()
rad_crv_angle = radians(crv_angle)
# Create the output layer
outLayer = QgsVectorLayer('Linestring?crs='+ crs, 'wiggly_line' , 'memory')
prov = outLayer.dataProvider()
fields = layer.pendingFields()
prov.addAttributes(fields)
outLayer.updateFields()
for feat in layer.getFeatures():
geom = feat.geometry()
polyline = geom.asPolyline()
segment(polyline)
# Add the layer to the Layers panel
QgsMapLayerRegistry.instance().addMapLayer(outLayer)
và nó sẽ tạo ra một lớp bộ nhớ dòng mới với kết quả mong đợi:
Câu trả lời ngắn: bạn có thể lấy nó bằng cách sử dụng một SVG tùy chỉnh. Xem dưới cùng của bài viết này cho một.
Câu trả lời dài:
Tôi tin rằng tốt hơn là đại diện cho nó hơn là sửa đổi hình dạng đường. Nếu bạn muốn di chuyển một cạnh hoặc thực hiện các hành động khác trên hình học, sẽ là một cơn ác mộng khi quản lý nếu các wiggles là một phần của hình học thay vì chỉ là một đại diện của một đường thẳng.
Bạn có thể chơi với dòng đánh dấu phong cách. Có một cách để dễ dàng đến gần với những gì bạn cần, và với một chút nỗ lực hơn, có khả năng có thể có được nó một cách chính xác.
Để có được điều này, bạn sẽ tạo kiểu cho dòng bằng hai dòng Marker. Mỗi dòng Marker được tạo từ một Marker đơn giản, nửa vòng tròn. Cái đầu tiên được xoay 180. Cả hai đều được đặt trong suốt.
Trên dòng Marker, bạn hướng dẫn một trong số chúng được bù để hai biểu tượng không được vẽ trước mặt nhau mà nằm cạnh nhau. Nếu bạn sử dụng kích thước khoảng cách = 1/2 *, đầu ra sẽ là một đường cong hình sin. Tôi đề nghị bạn chơi với kích thước khoảng, kích thước bù và kích thước biểu tượng.
Giới hạn chính của phương pháp này là đường kính của nửa vòng tròn, tính tổng với đường ban đầu. Nếu nền của bạn là màu trắng (hoặc bất kỳ màu trơn nào), bạn có thể thêm một dòng đơn giản thứ 3 bằng cách sử dụng màu nền.
** CHỈNH SỬA **
Một tùy chọn khác để thoát khỏi đường trung tâm là tạo biểu tượng SVG mới. Tôi sửa đổi nửa đường cong, chỉ sống phần tròn. Nó hoạt động, mặc dù hình elip 1/2 có thể hấp dẫn hơn. Ảnh chụp màn hình được thực hiện bằng cách sử dụng ký hiệu kích thước 10, khoảng 4, bù 2.
lưu mã bên dưới trong tệp Half_circle_line.svg và đảm bảo đường dẫn đến svg được đặt trong QGIS // Settings / Options / System / SVG Paths
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="11.2889mm" height="11.2889mm"
viewBox="0 0 32 32"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.2" baseProfile="tiny">
<title>Qt Svg Document</title>
<desc>Generated with Qt</desc>
<defs>
</defs>
<g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
<g fill="#ffffff" fill-opacity="0" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
font-family="MS Shell Dlg 2" font-size="8.25" font-weight="400" font-style="normal"
>
<path vector-effect="non-scaling-stroke" fill-rule="evenodd" d="M19.1181,16 C19.1181,16 19.1181,14.2779 17.7221,12.8819 16,12.8819 C14.2779,12.8819 12.8819,14.2779 12.8819,16"/>
</g>
</g>
</svg>
Pen style
thành Không bút :)