Apakah mungkin untuk memiliki nama lapisan dinamis dalam proyek QGIS?

9

Saya memiliki proyek QGIS dengan lapisan, berdasarkan pada pertanyaan PostGIS SQL yang menggunakan tanggal saat ini. Karena data dalam database berubah, kueri ini mengembalikan data yang berbeda setiap hari.

Apakah mungkin untuk secara dinamis mengubah nama lapisan dalam panel lapisan pohon, sehingga mewakili tanggal saat ini? (mis. nama lapisan seperti Traffic on 24.01.2015, yang berubah setiap hari baru). Data untuk caption harus diambil dari atribut fitur apa pun dalam sebuah layer - mereka semua memiliki nilai yang sama untuk bidang traffic_date.

mofoyoda
sumber
Apa sebenarnya yang akan Anda ekstrak dari tabel database Anda, "Traffic" atau tanggal saat ini?
Germán Carrillo
Saya mengekstraksi data untuk tanggal saat ini ke satu lapisan dan memperkirakan data ke lapisan lain. Jadi "24.01.2015" sebenarnya adalah nilai bidang, yang berasal dari database. Saya perlu nama layer dalam proyek untuk secara otomatis berubah sesuai dengan tanggal.
mofoyoda
Apakah boleh mengganti nama setiap kali proyek dimuat?
Nathan W

Jawaban:

13

Jika saya benar, jawabannya adalah ya, QGIS mendukung nama lapisan dinamis.

Anda perlu menulis makro Python untuk dijalankan setiap kali proyek dibuka. Ini akan menjadi alur kerja:

  1. Pergi ke QGIS->Project->Project Propertiesdan ganti openProject()dengan kode Python berikut:

    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 )
    

    masukkan deskripsi gambar di sini

    Catatan 1: Saya mengujinya di Shapefile, jadi bidang tempat saya mengambil tanggal adalah traffic_dakarena Shapefile tidak mendukung lebih banyak huruf dalam nama bidang. Sesuaikan itu dalam kode untuk bekerja pada lapisan Anda.

    Catatan 2: Bergantung pada konfigurasi proyek Anda, Anda harus menambahkan kode validasi untuk bertindak hanya pada lapisan yang Anda inginkan. Misalnya, jika Anda menjalankan kode pada layer raster, kesalahan pasti akan muncul. Jika Anda perlu bantuan dengan ini, buka pertanyaan baru, saya dapat membantu Anda.

  2. Pastikan Anda mengaktifkan makro di proyek Anda, dengan cara ini: Settings->Options->General->Enable macros: Always

  3. Muat layer Anda ke proyek.

  4. Simpan proyek Anda.

Setiap kali Anda membuka proyek Anda dari titik ini, nama layer Anda akan dinamis, tanggal akan diambil dari bidang traffic_datepada setiap tabel atribut layer.

Setelah pertama kali saya membuka proyek, ini adalah bagaimana nama layer saya dihasilkan secara dinamis:

masukkan deskripsi gambar di sini

Saya pikir ini dapat membantu Anda memulai. Katakan padaku jika kamu menghadapi masalah yang tidak jelas.

Germán Carrillo
sumber
Saya menemukan jawabannya dengan membaca komentar Anda, memposting 1 sebelum saya mengirimkan jawabannya. Beberapa penyesuaian harus dilakukan dalam kode agar sesuai dengan pengaturan lapisan tertentu, tapi saya harap @mofoyoda dapat mengatasinya.
Germán Carrillo
1
Ya itu langkah pertama yang bagus. Anda juga bisa menemukan indeks ondan strip dari sana ke ujung untuk menghemat menggunakan regex.
Nathan W
1
@ gcarrillo intens! Bagus
DPSSpatial
1
@ gcarrillo Sangat keren, terima kasih! Masih mencoba mencari tahu bagaimana menerapkan hanya pada lapisan tertentu, saya harap saya akan berhasil. Terima kasih atas jawaban yang bagus!
mofoyoda