ดูเหมือนว่าไม่มีวิธีใดที่จะเป็นสัญลักษณ์ของเส้นซิกแซก แต่น่าเสียดายที่คุณจะต้องแก้ไขข้อมูลพื้นฐาน
คุณสามารถได้รับเส้นซิกแซกที่ดีพอสมควรโดยแยกสายแรกออกเป็นส่วนของเส้นที่มีระยะเท่ากันจำนวนมากก่อนแล้วจึงชดเชยจุดอื่น ๆ ด้วยจำนวนคงที่
นี่คือสคริปต์ Python ที่ทำสิ่งนี้โดยรับคำตอบของ NathanW ไปที่ฉันจะสร้างจุดสุ่มตามแนวหลายเหลี่ยมใน QGIS ได้อย่างไร เป็นจุดเริ่มต้น บันทึกก้อนรหัสลงในไฟล์ที่เรียกว่าzigzag.py
ของคุณใน~/.qgis/python
ไดเรกทอรี (หรือ{User Directory}\.qgis\python\
บน Windows) แล้วนำเข้าในคอนโซล QGIS import zigzag
หลามโดยการพิมพ์ จากนั้นคุณสามารถเลือกหนึ่งบรรทัดหรือมากกว่านั้นที่คุณต้องการซิกแซกซิกส์และพิมพ์zigzag.createZigzag(<wavelength>, <amplitude>)
ในคอนโซล QGIS Python ที่ใด<wavelength>
และ<amplitude>
เป็น "ความยาว" และ "ความกว้าง" ของส่วนซิกแซกในหน่วยแผนที่
นี่คือตัวอย่าง:
อย่างที่คุณเห็นซิกแซกไม่ค่อยดีใกล้กับมุมบรรทัดเดิม แต่อย่างน้อยบรรทัดซิกแซกไม่มีตัวแบ่งใด ๆ
หากคุณใช้ข้อเสนอแนะของ James Conkling ในการทำให้เส้นเรียบก่อนโดยใช้ Algorithm ของ Chaiken ผลลัพธ์จะดีขึ้นมาก:
นี่คือสคริปต์:
from qgis.utils import iface
from qgis.core import *
import numpy as np
from cmath import rect, phase
# Function for calculating the mean of two angles.
# Based on http://rosettacode.org/wiki/Averages/Mean_angle#Python
def meanAngle(a1, a2):
return phase((rect(1, a1) + rect(1, a2)) / 2.0)
def createZigzag(wavelength, amplitude):
# Create a new memory layer to store the zigzag line.
vl = QgsVectorLayer("LineString", "Zigzag", "memory")
pr = vl.dataProvider()
# For each selected object in the current layer
layer = iface.mapCanvas().currentLayer()
for feature in layer.selectedFeatures():
geom = feature.geometry()
# Number of zigzag segments
length = geom.length()
segments = np.round(length / wavelength)
# Find equally spaced points that approximate the line
points = [geom.interpolate(distance).asPoint() for
distance in np.linspace(0, length, segments)]
# Calculate the azimuths of the approximating line segments
azimuths = np.radians(
[points[i].azimuth(points[i + 1]) for i in range(len(points) - 1)])
# Average consecutive azimuths and rotate 90 deg counterclockwise
zigzagazimuths = [azimuths[0] - np.pi / 2]
zigzagazimuths.extend([meanAngle(azimuths[i],
azimuths[i - 1]) - np.pi / 2 for i in range(len(points) - 1)]
)
zigzagazimuths.append(azimuths[-1] - np.pi / 2)
# Offset the points along the zigzagazimuths
zigzagpoints = []
for i in range(len(points)):
# Alternate the sign
dst = amplitude * (1 - 2 * np.mod(i, 2))
zigzagpoints.append(
QgsPoint(points[i][0] + np.sin(zigzagazimuths[i]) * dst,
points[i][1] + np.cos(zigzagazimuths[i]) * dst
)
)
# Create new feature from the list of zigzag points
fet = QgsFeature()
fet.setGeometry(QgsGeometry.fromPolyline(zigzagpoints))
pr.addFeatures([fet])
vl.updateExtents()
QgsMapLayerRegistry.instance().addMapLayer(vl)