Mit dem Geometriegenerator in QGIS einen Polygonumriss symbolisieren, bei dem er nicht mit anderen Features übereinstimmt?

10

Ich möchte ein Polygon symbolisieren, ohne es in eine Linie umzuwandeln. Ich habe ein Polygon-Feature (schraffiert und durch eine rote Linie begrenzt), das oben und unten an der Küste (blaue Linie) zusammenfällt. Ich möchte den Umriss eines Polygons nur auf zwei Seiten symbolisieren und möchte die rote Farbe oben und unten weglassen.

Bild

Ich würde das Endergebnis gerne so sehen.

Bild

Raj
quelle
Könnten Sie weitere Informationen zu Ihrem Workflow bereitstellen? Wenn dies beispielsweise ein einmaliger Anwendungsfall ist oder müssen Sie auf diese Weise mehrere Polygone anzeigen? Wenn mehrere Polygone, sind sie unterschiedlich ausgerichtet und haben sie unterschiedliche oder ähnliche Proportionen? Könnte eine manuelle Digitalisierung der Seitenlinien eine geeignete Option sein?
Erik
1
Dies ist kein einmaliger Anwendungsfall. Ich habe mehrere Polygone und sie werden aktualisiert, sodass sich die Formen sehr oft ändern. Und ich möchte sie nicht manuell digitalisieren oder das Polygon in Linien umwandeln.
Raj

Antworten:

12

Ich hatte ein bisschen Geometry generatorProbleme mit dem als @GSienko. Für Kreuzungsteile können Sie auch die integrierte Funktion verwenden aggregate. Außerdem habe ich eine segment_to_linesFunktion verwendet, die Polygone in Linien konvertiert.

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

oder

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

Geben Sie hier die Bildbeschreibung ein

Wenn Sie ein Polygon haben, das nicht mit Linien zusammenhängt, können Sie eine ifBedingung für den Schnittpunkt hinzufügen . Wenn sich Ebenen im Schnittpunkt befinden, wird die Differenz für die Symbologie angewendet, andernfalls wird die gesamte Geometrie angewendet.

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)
)

Geben Sie hier die Bildbeschreibung ein

Bearbeiten : Die Verwendung des Liniengenerators auf diese Weise hat eine Schwachstelle - Sie müssen das Legenden-Symbol behandeln, da es die Linie durch das Polygon rendert (nicht als Rand). Sie können die Ebene jedoch weiterhin duplizieren, eine einfache Füllung festlegen und sie als Legende verwenden.

Geben Sie hier die Bildbeschreibung ein

Oto Kaláb
quelle
1
Komplexere Lösung, und ich lerne wieder ein bisschen mehr :)
GSienko
Ich auch :). Ich musste vorher keinen Geometriegenerator verwenden , aber es war das erste, woran ich nach dem Lesen von OP dachte. Ich habe mich ein wenig damit beschäftigt, Kreuzungen zu kombinieren, und Ihre Antwort hat mir auch geholfen, weil ich die Differenzfunktion völlig vergessen habe :).
Oto Kaláb
Perfekte Lösung für meinen Fall. Ich schätze all Ihre Hilfe sehr :)
Raj
Der einzige Nachteil bei der Verwendung des Liniengenerators ist, dass Sie mit dem Legenden-Symbol umgehen müssen, da es die Linie durch das Polygon rendert (nicht als Rand). Sie können die Ebene jedoch weiterhin duplizieren, eine einfache Füllung festlegen und sie als Legende verwenden.
Oto Kaláb
4

Versuchen Sie, das refFunction-Plugin im Geometriegenerator zu verwenden.

Annahme. 2 Ebenen - eine Linie als Linie und Polygone als Polygon.

Stylen Sie das Polygon so:Geben Sie hier die Bildbeschreibung ein

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

geomintersect führt eine räumliche Abfrage zwischen Polygonebene und Linienebene durch und gibt die Schnittgeometrie von zwei von ihnen zurück, in unserem Fall zwei Rändern von Polygonen. Der nächste Schritt besteht darin, den Rand des Polygons zu unterscheiden. Ich weiß nicht, ob Sie Löcher im Inneren haben oder nicht, dann gibt external_ring () nur den äußeren Rand zurück.

Endergebnis: Geben Sie hier die Bildbeschreibung ein

Die Einschränkung - geomintersect überprüft die Schnittmenge nur für ein Polygon. Ich schaffe diese Einschränkung, indem ich Polygone zu einem großen Multipolygon mache, zum Beispiel durch virtuelle Ebenen für das Rahmen-Styling.

GSienko
quelle
3

Wie wäre es mit einer weißen Linie unter der blauen Linie in der anderen Ebene, die dieselbe Breite wie die rote Linie hat? Wenn Sie die blaue Linie über der Polygonebene platzieren, wird die rote Linie durch die weiße Linie verdeckt.

Dies setzt natürlich voraus, dass Sie einen weißen Hintergrund wie in Ihrem Beispiel haben und dass Sie damit einverstanden sind, dass einige der Crosshashes auch verdeckt sind.

Dies ist mein schnelles Testergebnis:

Kartenbild, das Stil zeigt

Einstellungen für blaue Linie:

Symbologie

Hexamon
quelle
In meinem Fall können die Linienstärke und die Farben variieren. Außerdem muss ich Markierungsliniensymbole für die Polygone auf der Karte verwenden, bei denen die Dicke des anderen Features und die Dicke des Polygons nicht gleich sind.
Raj
2

Haftungsausschluss: Diese Antwort funktioniert nicht, wenn Sie mehrere Polygone haben

Sie können herausfinden, welche Knoten die vier Ecken des Polygons bilden, zwischen denen Sie Linien zeichnen möchten, und diese dann in den Funktionen von MAKE_LINE () verwenden, um die Linien zu zeichnen:

So finden Sie die benötigten Knoten:

  • Fügen Sie zunächst eine Geologiegenerator-Symbologie hinzu
  • Stellen Sie den Geometrietyp auf Punkt / MultiPoint ein
  • Verwenden Sie den Ausdruck POINT_N($geometry, 1), um den ersten Knoten als Punkt anzuzeigen
  • Ändern Sie den Wert so lange, bis Sie die Anzahl der vier Ecken des Polygons kennen. Notieren Sie sich diese, da Sie zum Zeichnen der Linien Paare davon verwenden

So zeichnen Sie die Linien:

  • Ändern Sie den Geometrietyp des Geometriegenerators in LineString / MultiLineString
  • Verwenden Sie den Ausdruck MAKE_LINE(POINT_N($geometry, *first point*), POINT_N($geometry, *second point*)
  • Duplizieren Sie dies mit dem anderen Punktpaar
  • Dadurch werden die beiden Grenzlinien gezeichnet

Als Nächstes fügen Sie einfach eine normale Linienmuster-Füllsymbologie unter diesen beiden Geometriegeneratoren hinzu

TeddyTedTed
quelle
Leider habe ich viele Polygone.
Raj