Verwenden Sie einige 'temporäre Variablen' in QGIS Geometry Generator Symbol Layer Typ Ausdruck?


10

Unter Verwendung des Geometry generatorSymbolebene-Typs zeichne ich Rechtecke mit den Abmessungen @nv_bg_w(Breite) und @nv_bg_h(Höhe) (Projektvariablen) auf Linien-Features, entweder an Koordinaten text_x, text_y(Attribute, falls nicht NULL) oder alternativ in der Mitte der Linie mit dem folgenden Ausdruck:

geom_from_wkt(
    'POLYGON((' ||
    COALESCE("text_x", x(point_on_surface($geometry))) ||' '||  COALESCE("text_y", y(point_on_surface($geometry))) || ','||
    (to_real(COALESCE("text_x", x(point_on_surface($geometry)))+ @nv_bg_w )) ||' '||  COALESCE("text_y", y(point_on_surface($geometry))) || ','||
    (to_real(COALESCE("text_x", x(point_on_surface($geometry)))+ @nv_bg_w  )) ||' '||  (to_real(COALESCE("text_y", y(point_on_surface($geometry))))- @nv_bg_h ) || ','||
    COALESCE("text_x", x(point_on_surface($geometry))) ||' '||  (to_real(COALESCE("text_y", y(point_on_surface($geometry))))- @nv_bg_h ) || ','||
    COALESCE("text_x", x(point_on_surface($geometry))) ||' '||  COALESCE("text_y", y(point_on_surface($geometry)))|| '))'
)

Wie man sieht x(point_on_surface($geometry))und y(point_on_surface($geometry))sehr oft vorkommt. Zumindest in diesem einfachen Beispiel ist der Code dadurch schwerer zu lesen als nötig.

Meine Frage lautet also: Gibt es eine Möglichkeit, die letzteren Ausdrücke in einigen temporären Variablen zu speichern, etwa (Pseudocode):

@mx=x(point_on_surface($geometry))
@my=y(point_on_surface($geometry))
geom_from_wkt(
'POLYGON((' ||
... #and so on

Jochen, haben Sie eine Lösung für das in Ihrer Frage beschriebene Problem gefunden? Ich stehe vor einem ähnlichen Bedürfnis und suche nach der gleichen Sache
iulian

Antworten:


4

Ja, es gibt einen Weg in QGIS 3.x. Sie können eine Variable mithilfe einer with_variable()Funktion innerhalb eines Ausdrucks festlegen . Ich gehe davon aus, dass der folgende Ausdruck für Sie funktioniert.

with_variable( 'mx', x(point_on_surface($geometry)),
    with_variable( 'my', y(point_on_surface($geometry)),
        geom_from_wkt(
            'POLYGON((' ||
            COALESCE("text_x", @mx) ||' '||  COALESCE("text_y", @my) || ','||
            (to_real(COALESCE("text_x", @mx)+ @nv_bg_w )) ||' '||  COALESCE("text_y", @my) || ','||
            (to_real(COALESCE("text_x", @mx)+ @nv_bg_w  )) ||' '||  (to_real(COALESCE("text_y", @my))- @nv_bg_h ) || ','||
            COALESCE("text_x", @mx) ||' '||  (to_real(COALESCE("text_y", @my))- @nv_bg_h ) || ','||
            COALESCE("text_x", @mx) ||' '||  COALESCE("text_y", @my)|| '))'
        )
    )
)

Dokumentation im Ausdrucksdialogfenster:

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.