화살표로 끝나는 경로 : 기호를 개선해야합니다.

Nov 18 2020

Bezier 곡선의 마지막 경로 세그먼트에서 Arrow head 에 대한 @BERA의 답변을 기반으로 지오메트리 생성기를 사용하여 경로 끝에 화살표를 만들었습니다.

make_line(point_n( $geometry, -2), end_point($geometry))

내 기호를 개선해야합니다.

  1. 선의 굵기를 조정하면 화살표를 넘어갑니다.
  2. 다른 화살표처럼 시작하는가는 선을 어떻게 얻을 수 있습니까?

답변

2 babel Nov 26 2020 at 09:59

레이어를 복제 할 필요없이 첫 번째 답변의 개선 된 버전입니다. 선 레이어에서 선 스타일을 지오메트리 생성기> 다각형으로 정의하고 다음 표현식을 추가 tapered_buffer($geometry,0,2)하고 0과 2를 선의 시작과 끝의 너비로 바꿉니다. smooth()더 부드러운 가장자리를 얻기 위해 추가 할 수 있습니다 . 다음과 같은 결과를 얻을 수 있습니다 (원래의 선 형상이 어떻게 보이는지 보여주기 위해 흰색 선을 추가했습니다).

단순히 두 번째 심볼 레이어 (녹색 +)를 추가하고 지오메트리 생성기를 심볼 레이어 스타일로 다시 정의하는 것보다-이번에는 선을 지오메트리 유형으로 설정합니다. 이 표현식을 사용하고 (다시) 필요에 따라 값 0과 2를 변경합니다 (첫 번째 값은 시작 부분에서 줄을 확장하고 두 번째 값은 끝 부분에서 확장합니다).

extend(
    geometry_n( 
       segments_to_lines( 
          $geometry),
       num_geometries(
          segments_to_lines($geometry)
       )
    ),
    0,
    2
)

기호 레이어 유형을 화살표로 변경하고 그에 따라 화살표 스타일을 지정하십시오. 결과는 다음과 같습니다.

5 babel Nov 18 2020 at 13:11

그것은 일종의 해결 방법입니다 : 복사에서 선 분해 (각 세그먼트에서 별도의 선 만들기)를 선택하고 데이터 기반 재정의> 도우미로 선 크기를 설정하는 것보다 선 레이어 사본을 저장하십시오 (복제 레이어 아님). 소스를 $ id,로드 최대 / 분으로 정의합니다. 값을 입력하고 선의 두께를 0에서 원하는 값으로 설정합니다. 따라서 QGIS에 각 선분의 두께를 id로 설정하도록 지시하면 점점 더 두꺼워집니다.

다른 레이어의 화살표와 결합하는 것보다. 분해 된 선 레이어를 사용하는 경우 위의 화살표 생성 솔루션이 작동하지 않습니다.

심볼 레이어 유형에서 연결 및 끝 스타일을 둥글게하기위한 단순한 선을 조정합니다. 화살표와 겹치지 않도록 필요한 경우 분해 된 선의 마지막 세그먼트를 삭제합니다.

분해 된 선의 마지막 선 (세그먼트)에 화살표가 있고 화살표가 밑에있는 선을 덮도록이 마지막 선을 약간 확장하려면 새 심볼 레이어를 만들고 지오메트리 생성기를 선택하고 사용할 수 있습니다. 생성 된 선을 기호 유형 화살표로 설정하고 그에 따라 스타일을 지정하는 것보다 다음 표현식 (필요에 따라 200000 값 조정)이 필요합니다.

extend(
   geometry(
      get_feature_by_id(
         @layer , 
         array_length( ( array_agg(collect( $geometry))))
       )
    ),0,
    200000
)

스크린 샷보기 :

1 : 위의 표현이있는 화살표의 심볼 레이어

2 : $ id (도우미)에 따른 선 두께가있는 선의 심볼 레이어

4 JGH Nov 18 2020 at 15:26

@Babel의 답변 에서 영감을 얻은 다음은 더 부드러운 너비 전환과 동일한 스타일의 화살표를 허용하는 변형입니다.

  1. 선을 약 100 개의 세그먼트로 세분화 할 가상 레이어를 만듭니다.

메뉴로 이동하여 layer / add layer / add-edit virtual layer다음 쿼리를 입력하십시오.

SELECT ST_Segmentize(geometry,ST_length(geometry)/100.0)
FROM myLayer
  1. 너비를 늘리기 위해 가상 레이어 스타일 지정

single symbol, geometry generator라인 을 차례로 선택 하고 다음을 입력하여 모든 세그먼트를 자체 라인으로 분할합니다.

segments_to_lines( smooth( $geometry) )

smooth()선이 이미 충분히 굴곡 진 경우 자유롭게 제거하십시오 .

생성 된 선 스타일을 선택하고 설정 data override옆에있는 아이콘을 클릭합니다 width. edit다음 표현식을 선택 하고 입력하십시오.

마지막 세그먼트를 제외한 모든 너비를 설정합니다. 너비는 첫 번째로 생성 된 세그먼트의 경우 2 * 1/100에서 마지막 세그먼트의 경우 2 * 100/100입니다.

if(@geometry_part_num < @geometry_part_count, 2.0* @geometry_part_num / @geometry_part_count,0)

simple line스타일로 이동하여round cap style

  1. 화살표 설정

"상단"라인을 클릭하고 +옆에 있는 녹색을 클릭 한 다음 새 스타일을 추가하고 지오메트리 생성기를 다시 선택하십시오. 제공 한 표현식을 입력하세요.

화살표를 선택하고 width start를 1.98로 설정합니다 (이전 단계에서 마지막으로 표시된 세그먼트가 2 * 99/100 = 1.98 이었으므로). width(끝)을 2로 설정합니다. 머리 길이 또는 두께로 재생하여 모양을 만들 수 있습니다. 좋은.