QGISのジオメトリジェネレーターを使用して、他のフィーチャと一致しないポリゴンアウトラインをシンボル化しますか?


10

ポリゴンをラインに変換せずにシンボル化したいのですが。海岸線(青い線)の上部と下部に一致するポリゴンフィーチャ(赤い線でハッチングおよび境界が設定されています)があります。ポリゴンの輪郭を2辺だけでシンボル化し、上部と下部の赤い色を削除したいと思います。

画像

このような最終結果を見たいのですが。

画像


ワークフローについてもう少し詳しく教えてもらえますか?たとえば、これが1回限りのユースケースである場合、またはこの方法で複数のポリゴンを表示する必要がありますか?複数のポリゴンがある場合、向きは異なり、プロポーションが異なるか似ていますか?サイドラインの手動デジタル化は適切なオプションでしょうか?
Erik

1
これは1回限りの使用例ではありません。私はいくつかのポリゴンを持っていますが、それらは更新されるため、形状が非常に頻繁に変化します。また、手動でデジタル化したり、ポリゴンをラインに変換したりしたくありません。
Raj

回答:


12

Geometry generator@GSienkoとして少し苦労しました。交差部分については、組み込み関数を使用することもできますaggregate。またsegment_to_lines、多角形を線に変換する関数を使用しました。

difference(
    segments_to_lines($geometry),
    aggregate(
        layer:= 'line',
        aggregate:='collect',  
        expression:= $geometry,
        filter:=intersects($geometry, geometry(@parent))
    )
)

または

difference(
    segments_to_lines($geometry),
    aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
)

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

ラインに「無関係」のポリゴンがある場合はif、交差の条件を追加できます。レイヤーが交差している場合は、シンボルに差異が適用されます。それ以外の場合は、ジオメトリ全体が適用されます。

if(
    intersects(
        segments_to_lines($geometry),
        aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
    ),
    difference(
        segments_to_lines($geometry),
        aggregate('line','collect',$geometry,intersects($geometry, geometry(@parent)))
    ),
    segments_to_lines($geometry)
)

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

編集:この方法でラインジェネレータを使用することには弱点があります-凡例シンボルを処理する必要があります。これは、ラインを(境界としてではなく)ポリゴンを通してレンダリングするためです。ただし、レイヤーを複製し、単純な塗りつぶしを設定して、凡例に使用できます。

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


1
より複雑なソリューション、そして私はもう少し学びます:)
GSienko

私も :)。以前はGeometry Generatorを使用する必要はありませんでしたが、OPを読んだ後、それを最初に考えました。交差点を結合しようとするこの問題に少し行き詰まりました。差分関数について完全に忘れていたので、あなたの答えも役に立ちました:)。
OtoKaláb19年

私の場合に最適なソリューション。私はあなたのすべての助けに非常に感謝します:)
Raj

ラインジェネレーターを使用することの欠点は、凡例シンボルを処理する必要があることです。これは、ラインを(境界線としてではなく)ポリゴンを通してレンダリングするためです。ただし、レイヤーを複製し、単純な塗りつぶしを設定して、凡例に使用できます。
OtoKaláb19年

4

ジオメトリジェネレーター内でrefFunctionプラグインを使用してみてください。

仮定。2つのレイヤー-1つの線を線として、ポリゴンを多角形として。

そのようにポリゴンをスタイルします:ここに画像の説明を入力してください

difference(exterior_ring( $geometry ),geom_from_wkt(geomintersects('line','$geometry')))

geomintersectは、ポリゴンレイヤーとラインレイヤーの間で空間クエリを実行し、2つのポリゴンの交差のジオメトリ(この場合は、ポリゴンの2つの境界線)を返します。次のステップは、ポリゴンの境界との違いを作ることです。内部に穴があるかどうかはわかりませんが、exterior_ring()は外部ボーダーのみを返します。

最終結果: ここに画像の説明を入力してください

制限-geomintersectは、1つのポリゴンの交差のみをチェックします。ポリゴンレイヤーを1つの大きなマルチポリゴンに作成することで、たとえば境界線のスタイリング用の仮想レイヤーで、この制限を管理します。


3

赤い線と同じ幅の白い線を他のレイヤーの青い線の下に追加してみませんか?青い線をポリゴンレイヤーの上に配置すると、白い線によって赤い線が見えなくなります。

もちろん、これはあなたの例のように白い背景があり、いくつかのクロスハッシングも覆い隠されていることを前提としています。

これは私の簡単なテスト結果です:

スタイルを示す地図画像

青い線の設定:

記号論


私の場合、線の太さや色が異なる場合があります。また、マーカーラインシンボルをマップ全体のポリゴンに使用する必要があります。他のフィーチャの厚みとポリゴンの厚みは同じにはなりません。
Raj

2

免責事項:複数のポリゴンがある場合、この回答は機能しません

あなたができることは、線の間に描画したいポリゴンの四隅を形成するノードを見つけ、それらをMAKE_LINE()関数で使用して線を描画することです:

必要なノードを見つけるには:

  • 最初にジオメトリジェネレータシンボルを追加します
  • ジオメトリタイプをポイント/マルチポイントに設定します
  • POINT_N($geometry, 1)を使用して、最初のノードを点として表示します
  • ポリゴンの四隅のそれぞれの数がわかるまで値を変更し続けます。これらのペアを使用して線を描くので、これらをメモしてください

線を引くには:

  • ジオメトリジェネレータのジオメトリタイプをLineString / MultiLineStringに変更します。
  • 式を使用する MAKE_LINE(POINT_N($geometry, *first point*), POINT_N($geometry, *second point*)
  • 他のポイントペアを使用してこれを複製します
  • これは2つの境界線を描画します

次に、これら2つのジオメトリジェネレータの下に通常のラインパターン塗りつぶしシンボルを追加します


残念ながら、私はたくさんのポリゴンを持っています。
Raj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.