Używasz niektórych „zmiennych tymczasowych” w wyrażeniu typu warstwy symboli generatora QGIS Geometry?

10

Korzystając z Geometry generatortypu warstwy symbolu, rysuję prostokąty o wymiarach @nv_bg_w(szerokość) i @nv_bg_h(wysokość) (zmienne projektu) do elementów linii, albo na współrzędnych text_x, text_y(atrybuty, jeśli nie NULL), albo alternatywnie na środku linii za pomocą następującego wyrażenia:

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

Jak widać x(point_on_surface($geometry))i y(point_on_surface($geometry))występują bardzo często. Przynajmniej w tym prostym przykładzie powoduje to, że kod jest trudniejszy do odczytania niż musiałby.

Moje pytanie brzmi: czy istnieje sposób na przechowywanie tych ostatnich wyrażeń w niektórych zmiennych tymczasowych, na przykład (pseudokod):

@mx=x(point_on_surface($geometry))
@my=y(point_on_surface($geometry))
geom_from_wkt(
'POLYGON((' ||
... #and so on
Jochen Schwarze
źródło
Jochen, czy znalazłeś jakieś rozwiązanie problemu opisanego w twoim pytaniu? Mam do czynienia z podobną potrzebą i szukam tego samego
iulian

Odpowiedzi:

4

Tak, istnieje sposób w QGIS 3.x. Możesz ustawić zmienną za pomocą with_variable()funkcji w wyrażeniu. Więc oczekuję, że poniższe wyrażenie będzie dla ciebie działać.

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

Dokumentacja w oknie dialogowym wyrażenia:

wprowadź opis zdjęcia tutaj

Kadir Şahbaz
źródło