QGIS에서 물결 모양의 흔들리는 선을 그리시겠습니까?


21

흔들리는 선을 그리는 QGIS 기능이나 플러그인이 있습니까?

스플라인 도구를 사용하여 수동으로 파도를 그렸지만 시간이 많이 걸립니다. 가능하다면 다음과 같은 것을 그립니다.

여기에 이미지 설명을 입력하십시오

잉크 스케이프 Function Plotter ( sin(x)곡선).


정말 흥미로운 질문입니다! 마우스를 사용하여 간단한 선 피처를 그릴 때와 같이 선을 즉시 그릴 수있는 도구를 생각하고 있습니까? 아니면 입력으로 좌표에서 시작하여 결과를 얻을 수있는 방법을 생각하고 있습니까 (결과적으로 점, 선 또는 다각형에서)?
mgri

1
@mgri 귀하의 의견에 감사드립니다. 이 선을 사용하여 변동하는 해안선과 같은 불확실성으로 경계를 표시 할 것으로 예상되므로 기본 아이디어는 폴리 라인 (사전 정의 된 좌표를 통해)을 흔들기로 변환하는 것이 었습니다. 그러나 이러한 유형의 선을 즉시 그리는 아이디어도 매력적으로 들립니다.
카즈 히토

내 솔루션이 도움이되는지 확인하십시오. 나는 그것을 광범위하게 테스트하지 않았으므로 문제가 발생하면 알려주십시오 (지금은 할 수 없지만 더 많은 정보로 답변을 편집 할 것입니다).
mgri

답변:


18

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)

예상 결과를 가진 새로운 라인 메모리 레이어가 생성됩니다.

여기에 이미지 설명을 입력하십시오


와우! 나는이 화려한 연주를 중단 할 수 없습니다. 또한 출력 자체는 버퍼와 같은 추가 작업에 사용될 수 있습니다. @mgri 감사합니다. 마지막으로, 때로는 작은 원이 정점 근처에 나타납니다. 피할 수 있습니까? Node Tool로 그런 원의 중심 노드를 지우면 제거 할 수 있습니다 (따라서 큰 문제는 아닙니다).
카즈 히토

1
@Kazuhito 제 편집 코드를 참조하십시오. 불연속 화에 문제가있는 것 같으며 지금까지 해결되기를 바랍니다. 몇 가지 테스트를 수행했는데 제대로 작동하는 것 같습니다 (코드도 더 읽기 쉽습니다).
mgri

1
정말 감사합니다 @mgri. 매우 작은 서클이 있는데, 죄송합니다. 이러한 서클이 어떻게 나타나는지 명확하게 설명 할 수 없습니다. 대부분의 정점이 이제 "원 없음"입니다. 내가 주목 한 유일한 점은 이러한 노드 (원이있는)가 정점 편집기 노드 도구 테이블에서 더 작은 "r- 값"을 나타냈다는 것입니다. 이것은 내가 예상했던 것보다 쉽게 ​​관리 할 수 ​​있고 훨씬 좋습니다. 다시 감사합니다. 답을 해결책으로 받아들이겠습니다.
Kazuhito

1
감사합니다, @Kazuhito. 완벽한 솔루션을 만들지 않아서 죄송합니다. 그러나, 나는 당신이 그것을 즐기기를 바랍니다. 더 효율적인 방법을 찾으면 게시하겠습니다!
mgri

1
많은 감사 @mgri. 원 모양에서 독특한 패턴을 발견하면 재현 가능한 예제로 업데이트합니다. 이것은 매우 즐겁습니다 (출력이 아름답습니다)!
카즈 히토

20

짧은 대답 : 사용자 정의 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>

좋은 생각. 현재 지속적인 "중심선"으로 고투하고 있습니다 ... : \
Kazuhito

나도 +1 한편, 나는 PyQGIS 솔루션을 생각하려고합니다. @Kazuhito, 이것이 당신에게 충분한 지 또는 물리적 솔루션 을 선호하는지 알려주십시오 .
mgri

@mgri이 답변으로 지금은 "웨이브"가 아닌 "체인"을 가지고 있습니다 (수정하려고합니다). 실제 솔루션을 제공해 주셔서 감사합니다.
카즈 히토

JGH 잠재적으로 "가운데 선"을 흰색 선으로 가리는 것 외에 (아래 그림 참조) 제거 할 생각이 있습니까? 마치 조각난 것처럼 보입니다.
카즈 히토

@Kazuhito - 당신은을 변경할 수 있습니다 Pen style없음 펜 :
조셉
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.