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 Schwarze
quelle
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

Kadir Şahbaz
quelle