QGIS projesinde dinamik katman adlarına sahip olmak mümkün müdür?


9

Geçerli tarihi kullanan PostGIS SQL sorgularına dayalı katmanları olan bir QGIS projesi var. Veritabanındaki veriler değiştiği için, bu sorgular her gün farklı veriler döndürür.

Katman ağacı panelindeki katmanın adını dinamik olarak değiştirmek mümkün mü, böylece geçerli tarihi temsil ediyor mu? (ör. katman adı gibi Traffic on 24.01.2015, her yeni günde değişir). Altyazı verileri bir katmandaki herhangi bir özelliğin özelliğinden alınmalıdır - hepsi alan için aynı değere sahiptir traffic_date.


Veritabanı tablonuzdan, "Trafik" ten veya şu anki tarihten tam olarak ne elde edersiniz?
Germán Carrillo

Bir katman için geçerli tarih için veri ayıklamak ve diğer katmanlara veri tahmin ediyorum. Yani "24.01.2015" aslında veritabanından gelen bir alan değeridir. Projeye karşılık gelen tarihin otomatik olarak değiştirmek için katman adına ihtiyacım var.
mofoyoda

Proje her yüklendiğinde adı değiştirmek uygun olur mu?
Nathan W

Yanıtlar:


13

Seni haklı çıkarsam, cevap evet, QGIS dinamik katman adlarını destekliyor.

Proje her açıldığında çalıştırılacak bir Python makrosu yazmanız gerekir. Bu iş akışı olurdu:

  1. Aşağıdaki Python koduna gidin QGIS->Project->Project Propertiesve openProject()onunla değiştirin :

    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 )
    

    resim açıklamasını buraya girin

    Not 1: Shapefiles üzerinde test ettim, bu yüzden tarih aldığım alan traffic_daShapefiles alan adlarında daha fazla harfi desteklemediğinden. Kodunuzda katmanlarınız üzerinde çalışacak şekilde ayarlayın.

    Not 2: Proje yapılandırmanıza bağlı olarak, yalnızca istediğiniz katmanlara işlemek için doğrulama kodu eklemeniz gerekir. Örneğin, kodu raster katmanlarında çalıştırırsanız, hatalar kesinlikle görünür. Bu konuda yardıma ihtiyacınız varsa, yeni bir soru açın, size yardımcı olabilirim.

  2. Projenizde makroları şu şekilde etkinleştirdiğinizden emin olun: Settings->Options->General->Enable macros: Always

  3. Katmanlarınızı projeye yükleyin.

  4. Projenizi kaydedin.

Projenizi bu noktadan her açtığınızda, katman adlarınız dinamik olacak, tarih traffic_dateher katmanın öznitelik tablosundaki alandan alınacaktır .

Projeyi ilk açtıktan sonra, katman adlarım dinamik olarak şu şekilde oluşturuldu:

resim açıklamasını buraya girin

Bence bu başlamanıza yardımcı olabilir. Açık olmayan sorunlarla karşılaşıp karşılaşmadığını söyle.


Yorumunuzu okuyarak anladım, cevabı göndermeden önce 1 saniye yayınladım. Kodda, belirli katman düzenlemesine uyacak şekilde bazı ayarlamalar yapılmalıdır, ancak umarım @mofoyoda onlarla baş edebilir.
Germán Carrillo

1
Evet bu iyi bir başlangıç. Ayrıca onregex kullanarak tasarruf etmek için dizin ve şerit oradan sonuna kadar bulabilirsiniz.
Nathan W

1
@gcarrillo yoğun! Ama harika!
DPSSpatial

1
@gcarrillo Çok havalı, teşekkürler! Hala sadece belirli katmanlara nasıl uygulanacağını anlamaya çalışıyorum, umarım yaparım. Harika bir cevap için teşekkürler!
mofoyoda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.