QGISでセクターライトを作成しますか?


24

QGIS 2.18を使用しています。地図上でナビゲーション用のセクターライトを作成する必要があります。

ライトセクターデータは、becon_id、開始度、終了度、および色を与えるフィールドとして、500以上のブイ、ビーコン、灯台がマップに表示される必要があるシェープファイルにあります。各ビーコンには、多くの行があり、それぞれが1つの明るいセクター(たとえば、白いセクター)を記述します。

最終的な結果は次のようになります。適切な色のライトセクター、カラーフィールド(RGW)の文字としてマークされた色、およびブイ/ビーコン/灯台から100mから1000mの点線。

これはほとんどの場合、ルールベースのシンボルとして作成されるはずですが、Pythonが必要ですか?

ここに画像の説明を入力してください

以下は、114〜154度の緑のセクター、154〜168度の白のセクター、168〜237度の赤のセクター、緑セクター237〜314度、白色セクター314〜320度、赤色セクター320〜337度(何らかの理由で、0は北ではなく南):

シェープファイルテーブルの例



2
サンプルデータセットをアップロードし、予想される結果を正確に説明して質問を編集してください。添付の画像では、シンボルと色の宇宙しか見えません。
mgri

1
ここではデータ例が役立ちます。セクターライトごとに1つの機能、またはブイごとに1つの機能がありますか?ここではWedge Bufferプラグインが役立つかもしれませんが、これがいかに簡単かは、データの設定方法によって異なります。
スティーブンケイ

こんにちは@mgriとSteven、サンプルデータを追加し、質問をより明確にしようとしました:)、ありがとう!
ベンジャミンドナー

1
@mgriラインは変数ではありませんが、画像のようにライトセクター間の900mの長いラインとして静的に表示される必要があるラインです。投影参照システム。
ベンジャミンドナー

回答:


50

編集特定の状況(特定の角度値による)を管理し、丸い角度が定義されているときに点線を表示しないように、回答を編集しました。


ルールベースのシンボル体系とラベリングのみを繰り返して解決策を提案します。

始める前に、目的の結果を再現するために行うべき最小限のことの説明に注意を集中することを強調したいと思います:これは、他のいくつかの小さなパラメーター(サイズ、幅など)を簡単に調整できることを意味しますニーズに合わせて調整します。

さらに、この解決策は、場合にのみ機能しますが、その前提と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つの行を作成したことに注意してください:上の行は使用する色を定義し(実際、この行にカスタム式を設定します)、下の行は黒い境界線を定義するのに役立ちます(上の線の幅よりも大きい幅)。設定することも忘れないでくださいFlatCap 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を使用して作成されました(使用しているシェープファイルと同じ名前でなければなりません)。


3
見栄えがよく、ジオメトリジェネレーターのパワーを実際に示します。レンダリングが遅いですか?
-HeikkiVesanto

2
@Vesanto 6つの機能(つまり6つのセクターライト)を持つ1つのポイントでテストし、即座にレンダリングしました。何百もの機能を扱うときも、プロバイダや同様のものへの呼び出しはなく、Well Know Textのように数学演算とジオメトリが2、3だけであるため、高速であるべきだと思います。
mgri

2
これらのような質問/回答は、QGISがどのように応用できるかを示しています。
ジョセフ

1
@mgriあなたはマスターであり、素晴らしい解決策であり、多くの仕事を伴う素晴らしい説明です、ありがとう!
ベンジャミンドナー

1
@mgriこの地域の山はあなたにちなんで命名されるべきです、ありがとう!! 私は少しテストしましたが、追加したソリューションに問題は見つかりませんでした:)!
ベンジャミンドナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.