흔들리는 선을 그리는 QGIS 기능이나 플러그인이 있습니까?
스플라인 도구를 사용하여 수동으로 파도를 그렸지만 시간이 많이 걸립니다. 가능하다면 다음과 같은 것을 그립니다.
잉크 스케이프 Function Plotter
( sin(x)
곡선).
흔들리는 선을 그리는 QGIS 기능이나 플러그인이 있습니까?
스플라인 도구를 사용하여 수동으로 파도를 그렸지만 시간이 많이 걸립니다. 가능하다면 다음과 같은 것을 그립니다.
잉크 스케이프 Function Plotter
( sin(x)
곡선).
답변:
PyQGIS를 사용하는 솔루션을 제안합니다. Linestring 및 MultiLineString 레이어 모두에서 작동합니다.
이 솔루션은 반원형 링 생성을 기반으로하므로 직경 값 (예 : step
아래 코드 의 변수) 을 설정해야합니다 . 선택한 단계 는 행 길이를 기준으로 조정 되므로 실제로 사용되는 단계는 아닙니다 (그러나 실제로 설정된 초기 값과 유사 함). step
변수에 가장 적합한 값을 찾기 전에 몇 가지 시도를해야 합니다.
이 코드 crv_angle
에는 링의 곡률을 줄이거 나 늘리는 데 도움 이되는 두 번째 (선택 사항) 매개 변수 ()가 필요합니다 ( 몇 가지 테스트를 수행 했으므로 실제 원형으로 이어지기 때문에 45도를 기본 각도로 두는 것이 좋습니다. 반지).
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)
예상 결과를 가진 새로운 라인 메모리 레이어가 생성됩니다.
짧은 대답 : 사용자 정의 SVG를 사용하여 얻을 수 있습니다. 이 게시물의 하단을 참조하십시오.
긴 대답 :
선 지오메트리를 수정하는 것보다 표현하는 것이 낫다고 생각합니다. 모서리를 이동하거나 지오메트리에서 다른 작업을 수행하려는 경우 흔들림이 직선을 나타내는 것이 아니라 지오메트리의 일부인지 관리하는 것은 악몽입니다.
스타일 마커 선으로 재생할 수 있습니다. 필요한 것에 쉽게 접근 할 수있는 방법이 있으며 조금 더 노력하면 정확하게 얻을 수 있습니다.
이를 위해 두 개의 마커 선으로 선의 스타일을 지정합니다. 각 마커 라인은 반원 인 단순 마커로 구성됩니다. 첫 번째는 180도 회전합니다. 둘 다 투명으로 설정되어 있습니다.
마커 선에서 두 심볼이 서로 앞이 아니라 나란히 그려 지도록 둘 중 하나를 오프셋하도록 지시합니다. offest = 1/2 * interval 크기를 사용하면 출력이 사인 곡선이됩니다. 간격 크기, 오프셋 및 기호 크기로 재생하는 것이 좋습니다.
이 방법의 주요 제한 사항은 반원의 지름 선이며 원래 선과 같습니다. 배경이 흰색 (또는 일반 색상)이면 배경색을 사용하여 간단한 3 번째 선을 추가 할 수 있습니다.
** 편집 **
중심선을 제거하는 또 다른 옵션은 새 SVG 기호를 만드는 것입니다. 반 곡선을 수정하고 둥근 부분 만 살았습니다. 1/2 타원이 더 매력적이지만 작동합니다. 스크린 샷은 심볼 크기 10, 간격 4, 오프셋 2를 사용하여 수행되었습니다.
아래 코드를 half_circle_line.svg 파일에 저장하고 svg의 경로가 설정되어 있는지 확인하십시오 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
에 없음 펜 :