การใช้ 'ตัวแปรชั่วคราว' ในนิพจน์ชนิดเลเยอร์สัญลักษณ์สัญลักษณ์ QGIS Geometry หรือไม่


10

การใช้ประโยชน์จากGeometry generatorประเภทเลเยอร์สัญลักษณ์ฉันวาดรูปสี่เหลี่ยมขนาด@nv_bg_w(ความกว้าง) และ@nv_bg_h(ความสูง) (ตัวแปรโครงการ) ไปยังคุณลักษณะของเส้นไม่ว่าจะที่พิกัดtext_x, text_y(คุณลักษณะหากไม่NULL) หรือที่กึ่งกลางของบรรทัดโดยการแสดงออกต่อไปนี้:

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

ที่สามารถมองเห็นx(point_on_surface($geometry))และy(point_on_surface($geometry))เกิดขึ้นได้บ่อยมาก อย่างน้อยในตัวอย่างง่ายๆนี้ทำให้โค้ดอ่านยากกว่าที่ควรจะเป็น

ดังนั้นคำถามของฉันคือมีวิธีเก็บนิพจน์หลังในตัวแปรชั่วคราวบางอย่างเช่น (pseudocode):

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

ใช่คุณพบวิธีแก้ไขปัญหาที่อธิบายไว้ในคำถามของคุณหรือไม่ ฉันกำลังเผชิญกับความต้องการที่คล้ายกันและกำลังค้นหาสิ่งเดียวกัน
iulian

คำตอบ:


4

ใช่มีวิธีใน QGIS 3.x คุณสามารถตั้งค่าตัวแปรโดยใช้with_variable()ฟังก์ชันภายในนิพจน์ ดังนั้นฉันคาดหวังว่าการแสดงออกด้านล่างจะได้ผลสำหรับคุณ

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

เอกสารในหน้าต่างโต้ตอบนิพจน์:

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.