編集特定の状況(特定の角度値による)を管理し、丸い角度が定義されているときに点線を表示しないように、回答を編集しました。
ルールベースのシンボル体系とラベリングのみを繰り返して解決策を提案します。
始める前に、目的の結果を再現するために行うべき最小限のことの説明に注意を集中することを強調したいと思います:これは、他のいくつかの小さなパラメーター(サイズ、幅など)を簡単に調整できることを意味しますニーズに合わせて調整します。
さらに、この解決策は、場合にのみ機能しますが、その前提と0
程度を北の代わりに、南は(場合ている0
南で、代わりに、それは十分に合算されるだろう180
例えば角度との契約は、式の「90」表示されますたびに値をcos(radians(90))
となるがcos(radians(180 + 90))
)。これは、より一般的な解決策を提供するためだけに行うことを好みました。
スタイリング
Single symbol
およびを1つSimple Marker
および3つのGeometry generator
シンボルレイヤーに繰り返して、ポイントをレンダリングします。
さらなる説明では、上の画像のシンボルと同じ順序に従います。
1)シンプルマーカー
サイズが3 mmで幅が0.4 mmの黒い星のデフォルトシンボル(このチュートリアルの簡単な部分です)を選択しました。
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
ライトセクターの開始点を指す最初の行を定義しました。この線の長さは1000 mであり、扇形ライトの開口角が丸角でない場合にのみ作成されます(線が円全体を壊さないようにするために発生します)。
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
ライトセクターの終点を指す最初の線を定義しました。この線の長さは1000 mであり、扇形ライトの開口角が丸角でない場合にのみ作成されます(線が円全体を壊さないようにするために発生します)。
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
ライトセクターの開始点と終了点の間の円弧を定義しました(半径900 mの円の境界と交差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
このシンボルレイヤーについて、2つの行を作成したことに注意してください:上の行は使用する色を定義し(実際、この行にカスタム式を設定します)、下の行は黒い境界線を定義するのに役立ちます(上の線の幅よりも大きい幅)。設定することも忘れないでください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を使用して作成されました(使用しているシェープファイルと同じ名前でなければなりません)。