เป็นไปได้หรือไม่ที่จะมีชื่อเลเยอร์แบบไดนามิกในโครงการ QGIS


9

ฉันมีโครงการ QGIS พร้อมเลเยอร์ตามแบบสอบถาม PostGIS SQL ที่ใช้วันที่ปัจจุบัน เนื่องจากข้อมูลในฐานข้อมูลมีการเปลี่ยนแปลงเคียวรีเหล่านี้จึงส่งคืนข้อมูลที่แตกต่างกันทุกวัน

เป็นไปได้ไหมที่จะเปลี่ยนชื่อของเลเยอร์ในเลเยอร์พาเนลแบบไดนามิกดังนั้นจึงเป็นวันที่ปัจจุบัน (เช่นชื่อเลเยอร์เช่นTraffic on 24.01.2015ที่เปลี่ยนทุกวัน) ข้อมูลสำหรับคำอธิบายภาพที่ควรจะนำมาจากแอตทริบิวต์ของคุณลักษณะใด ๆ ในชั้น - traffic_dateพวกเขาทุกคนมีค่าเท่ากันสำหรับเขตข้อมูล


สิ่งที่คุณจะแยกจากตารางฐานข้อมูลของคุณ "การจราจร" หรือวันที่ปัจจุบัน
Germán Carrillo

ฉันกำลังแยกข้อมูลสำหรับวันที่ปัจจุบันเป็นเลเยอร์หนึ่งและข้อมูลการคาดการณ์ไปยังเลเยอร์อื่น ดังนั้น "24.01.2015" จึงเป็นค่าฟิลด์ที่มาจากฐานข้อมูล ฉันต้องการชื่อเลเยอร์ในโครงการเพื่อเปลี่ยนโดยอัตโนมัติตามวันที่
mofoyoda

การเปลี่ยนชื่อทุกครั้งที่โครงการโหลดหรือไม่
Nathan W

คำตอบ:


13

ถ้าฉันเข้าใจถูกต้องคำตอบคือใช่ QGIS รองรับชื่อเลเยอร์แบบไดนามิก

คุณจะต้องเขียนแมโคร Python เพื่อให้ทำงานทุกครั้งที่เปิดโครงการ นี่จะเป็นเวิร์กโฟลว์:

  1. ไปที่QGIS->Project->Project Propertiesและแทนที่openProject()ด้วยรหัส Python ต่อไปนี้:

    def openProject():
        import re, qgis     
        iface = qgis.utils.iface
        layers = iface.mapCanvas().layers()
        for lyr in layers:
            # Get date from layer
            it=lyr.getFeatures()
            feat = next(it)
            idx = lyr.fieldNameIndex('traffic_da')
            currDate = feat.attributes()[idx]
    
            # Set new layer name
            name = lyr.name()
            if re.search(' on \d{2,2}.\d{2,2}.\d{4,4}$', name):
                 name = name[:-14]
            name = name + " on " + currDate
            lyr.setLayerName( name )
    

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

    หมายเหตุ 1: ฉันทดสอบใน shapefiles ดังนั้นฟิลด์ที่ฉันเลือกวันที่เป็นtraffic_daเพราะ Shapefiles ไม่รองรับตัวอักษรเพิ่มเติมในชื่อฟิลด์ ปรับในรหัสเพื่อทำงานกับเลเยอร์ของคุณ

    หมายเหตุ 2: ขึ้นอยู่กับการกำหนดค่าโครงการของคุณคุณควรเพิ่มรหัสตรวจสอบเพื่อดำเนินการเฉพาะในชั้นที่คุณต้องการ ตัวอย่างเช่นหากคุณเรียกใช้รหัสในเลเยอร์แรสเตอร์ข้อผิดพลาดจะปรากฏขึ้นอย่างแน่นอน หากคุณต้องการความช่วยเหลือในเรื่องนี้เปิดคำถามใหม่ฉันสามารถช่วยคุณได้

  2. ตรวจสอบให้แน่ใจว่าคุณเปิดใช้งานมาโครในโครงการด้วยวิธีนี้: Settings->Options->General->Enable macros: Always

  3. โหลดเลเยอร์ของคุณไปยังโครงการ

  4. บันทึกโครงการของคุณ

ทุกครั้งที่คุณเปิดโครงการจากจุดนี้ชื่อเลเยอร์ของคุณจะเป็นแบบไดนามิกวันที่จะถูกนำออกจากฟิลด์traffic_dateในตารางแอตทริบิวต์ของแต่ละชั้น

หลังจากครั้งแรกที่ฉันเปิดโครงการนี่คือวิธีสร้างชื่อเลเยอร์ของฉันแบบไดนามิก:

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

ฉันคิดว่านี่จะช่วยคุณในการเริ่มต้น บอกฉันถ้าคุณประสบปัญหาที่ไม่ชัดเจน


ฉันคิดออกโดยการอ่านความคิดเห็นของคุณโพสต์ 1s ก่อนที่ฉันจะส่งคำตอบ ควรทำการปรับเปลี่ยนบางอย่างในรหัสเพื่อให้เหมาะกับการจัดเรียงเลเยอร์โดยเฉพาะ แต่ฉันหวังว่า @mofoyoda สามารถจัดการกับพวกเขาได้
Germán Carrillo

1
ใช่มันเป็นครั้งแรกที่ดี คุณสามารถหาดัชนีonและถอดจากที่นั่นไปยังจุดสิ้นสุดเพื่อบันทึกโดยใช้ regex
นาธาน W

1
@gcarrillo รุนแรง! แต่เยี่ยมมาก!
DPSSpatial

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