편집 특정 상황 (특정 각도 값으로 인해)을 관리하고 둥근 각도가 정의 될 때 점선을 표시하지 않도록 답변을 편집했습니다.
나는 규칙 기반의 상징과 라벨링에만 반복해서 해결책을 제안한다.
시작하기 전에 원하는 결과를 재현하기 위해 수행해야 할 최소한의 설명에주의를 기울일 것이라고 강조하고 싶습니다. 이는 다른 작은 매개 변수 (예 : 크기, 너비 등)를 쉽게 조정할 수 있음을 의미합니다. 당신의 요구를 더 잘 맞추기 위해.
또한, 경우이 솔루션은 작동 당신이 생각 0
정도가 아니라 남한의 북한 (경우이다 0
남쪽, 대신, 그것은 합산 충분하다 180
각도로하는 계약 식에 '90'을 표시 할 때마다 값을, 예를 들어이 cos(radians(90))
될 것입니다 cos(radians(180 + 90))
). 더 일반적인 솔루션을 제공하기 위해이 작업을 선호했습니다.
스타일링
점을 a로 렌더링하고 Single symbol
1 Simple Marker
~ 3 개의 Geometry generator
심볼 레이어 로 반복합니다 .
추가 설명에서 위의 이미지에서 동일한 순서의 기호를 따릅니다.
1) 단순 마커
크기가 3mm이고 너비가 0.4mm 인 검은 별의 기본 기호 (이 자습서에서는 더 쉬운 부분)를 선택했습니다.
2) 지오메트리 생성기 1 번
새 심볼 레이어를 추가하고 Geometry generator
유형을 선택하십시오 .
이 표현식을 Expression
필드 에 삽입하십시오 .
CASE
WHEN abs( "ALKUKULMA" - "LOPPUKULMA") < 360
THEN
make_line(
$geometry,
make_point(
$x + 1000*cos(radians(90 - "ALKUKULMA")),
$y + 1000*sin(radians(90 - "ALKUKULMA"))
)
)
END
우리는 광 섹터가 시작되는 지점을 가리키는 첫 번째 라인을 정의했습니다. 이 선의 길이는 1000m이며, 섹터 라이트의 개방 각도가 둥근 각도가 아닌 경우에만 생성됩니다 (선이 전체 원을 깰 수 있음을 방지하기 위해 발생 함).
3) 지오메트리 생성기 2 번
위와 동일하지만이 단계에서는 다음 표현식을 사용해야합니다.
CASE
WHEN abs( "ALKUKULMA" - "LOPPUKULMA") < 360
THEN
make_line(
$geometry,
make_point(
$x + 1000*cos(radians(90 - "LOPPUKULMA")),
$y + 1000*sin(radians(90 - "LOPPUKULMA"))
)
)
END
우리는 라이트 섹터가 끝나는 지점을 향한 첫 번째 라인을 정의했습니다. 이 선의 길이는 1000m이며, 섹터 라이트의 개방 각도가 둥근 각도가 아닌 경우에만 생성됩니다 (선이 전체 원을 깰 수 있음을 방지하기 위해 발생 함).
4) 지오메트리 생성기 3 번
이 표현식을 Expression
필드 에 삽입하십시오 .
CASE
WHEN abs("ALKUKULMA" - "LOPPUKULMA") <= 180 AND "ALKUKULMA" >= "LOPPUKULMA"
THEN
difference(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x + 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y + 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") <= 180 AND "ALKUKULMA" <= "LOPPUKULMA"
THEN
intersection(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x + 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y + 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") > 180 AND "ALKUKULMA" >= "LOPPUKULMA"
THEN
intersection(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x - 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y - 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
WHEN abs("ALKUKULMA" - "LOPPUKULMA") > 180 AND "ALKUKULMA" <= "LOPPUKULMA"
THEN
difference(
boundary(
buffer(
$geometry, 900)
),
make_polygon(
geom_from_wkt(
geom_to_wkt(
make_line(
$geometry,
make_point($x + 2000*cos(radians(90 - "ALKUKULMA" )), $y + 2000*sin(radians((90 - "ALKUKULMA" )))),
make_point($x - 2000*cos(radians(90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )), $y - 2000*sin(radians((90 - ("LOPPUKULMA" + "ALKUKULMA")/2 )))),
make_point($x + 2000*cos(radians(90 - "LOPPUKULMA")), $y + 2000*sin(radians((90 - "LOPPUKULMA")))),
$geometry)
)
)
)
)
END
우리는 방금 빛의 시작점과 끝점 사이의 호를 정의했습니다 ( 반지름 900m의 원의 경계와 교차 2000
하는 다각형 을 만들려고하기 때문에 임의의 값입니다 ).
또한 "VARIS"
현장에 저장되는 색상을 설정해야 합니다. 이를 위해서는 사용자 정의 표현식으로 지정해야합니다. 아래 이미지의 화살표를 따르십시오.
그런 다음 Edit...
버튼 을 클릭 한 후이 표현식을 입력하십시오 .
CASE
WHEN "VARIS" = 'vi' THEN color_rgb(51,160,44)
WHEN "VARIS" = 'v' THEN color_rgb(255,255,255)
WHEN "VARIS" = 'p' THEN color_rgb(227,26,28)
END
이 심볼 레이어의 경우 두 줄을 만들었습니다. 위 줄은 사용할 색상을 정의하고 (실제로이 사용자 정의 표현식을 설정합니다) 아래쪽 줄은 검은 색 테두리를 정의하는 데 유용합니다 ( 상단 라인 중 하나보다 큰 너비). 설정 또한 기억 Flat
으로 Cap style
중복 색상을 피하기위한 두 라인.
라벨링
1) 라벨 설정
Layer Properties
>로 이동하여 Labels
평소와 같이 빨간색 화살표를 따릅니다.
다음 식을 입력하십시오.
CASE
WHEN "VARIS" = 'vi' THEN 'G'
WHEN "VARIS" = 'v' THEN 'W'
WHEN "VARIS" = 'p' THEN 'R'
END
"VARIS"
필드에 저장된 값을 사용하여 색상 규칙을 정의했습니다 .
2) 라벨 배치 설정
메뉴에서 Placement
옵션을 Labels
선택하고을 선택하십시오 Offset from point
.
그런 다음 아래 이미지를 참조하십시오.
빨간색 화살표를 따라이 표현식을 입력하십시오.
CASE
WHEN "ALKUKULMA" > "LOPPUKULMA"
THEN
concat(
-1000*cos(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2)),
',',
1000*sin(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2))
)
WHEN "ALKUKULMA" <= "LOPPUKULMA"
THEN
concat(
1000*cos(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2)),
',',
-1000*sin(radians(90 - ("ALKUKULMA" + "LOPPUKULMA")/2))
)
END
그런 다음 녹색 화살표를 따라 다음 표현식을 입력하십시오.
CASE
WHEN "ALKUKULMA" >= "LOPPUKULMA"
THEN
180-(("ALKUKULMA" + "LOPPUKULMA")/2)
WHEN "ALKUKULMA" < "LOPPUKULMA"
THEN
- (("ALKUKULMA" + "LOPPUKULMA")/2)
END
최종 결과
이전 작업을 올바르게 수행 한 경우 다음 결과를 얻을 수 있습니다.
보너스
마이너 매개 변수가이 답변에서 완전히 다루기에는 너무 많으므로 여기 에 스타일을 첨부했습니다 . 텍스트 편집기에서이 코드를 열고 QGIS 레이어 스타일 파일 (예 : .qml
확장명) 로 저장할 수 있습니다.
위의 스타일은 QGIS 2.18.4를 사용하여 작성되었습니다 (사용 중인 쉐이프 파일의 이름이 같아야 함).