Czy w projekcie QGIS można mieć nazwy warstw dynamicznych?

9

Mam projekt QGIS z warstwami, oparty na zapytaniach PostGIS SQL, które używają bieżącej daty. Ponieważ dane w bazie danych ulegają zmianie, zapytania te zwracają różne dane każdego nowego dnia.

Czy można dynamicznie zmieniać nazwę warstwy w panelu drzewa warstw, aby reprezentowała bieżącą datę? (tzn. jak nazwa warstwy Traffic on 24.01.2015, która zmienia się każdego nowego dnia). Dane do podpisu należy pobrać z atrybutu dowolnej cechy w warstwie - wszystkie mają tę samą wartość pola traffic_date.

mofoyoda
źródło
Co dokładnie wyodrębnisz ze swojej tabeli bazy danych „Ruch” lub bieżącą datę?
Germán Carrillo
Wyodrębniam dane dla bieżącej daty do jednej warstwy i prognozuję dane do innych warstw. Tak więc „24.01.2015” jest w rzeczywistości wartością pola, która pochodzi z bazy danych. Potrzebuję nazwy warstwy w projekcie, aby automatycznie zmienić odpowiednią datę.
mofoyoda
Czy zmienianie nazwy przy każdym ładowaniu projektu byłoby w porządku?
Nathan W

Odpowiedzi:

13

Jeśli dobrze zrozumiałem, odpowiedź brzmi tak, QGIS obsługuje dynamiczne nazwy warstw.

Będziesz musiał napisać makro Python, które będzie uruchamiane przy każdym otwarciu projektu. Byłby to przepływ pracy:

  1. Przejdź do QGIS->Project->Project Propertiesi zamień openProject()na następujący kod 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 )

    wprowadź opis zdjęcia tutaj

    Uwaga 1: Przetestowałem to na plikach kształtów, więc pole, z którego biorę daty, jest traffic_daspowodowane tym, że pliki kształtów nie obsługują więcej liter w nazwach pól. Dostosuj to w kodzie, aby działał na twoich warstwach.

    Uwaga 2: W zależności od konfiguracji projektu należy dodać kod weryfikacyjny, aby działał tylko na wybranych warstwach. Na przykład, jeśli uruchomisz kod na warstwach rastrowych, na pewno pojawią się błędy. Jeśli potrzebujesz pomocy, otwórz nowe pytanie, mogę ci pomóc.

  2. Upewnij się, że włączasz makra w swoim projekcie, w ten sposób: Settings->Options->General->Enable macros: Always

  3. Załaduj swoje warstwy do projektu.

  4. Zapisz swój projekt.

Za każdym razem, gdy otworzysz projekt od tego momentu, nazwy warstw będą dynamiczne, data będzie pobierana z pola traffic_datew tabeli atrybutów każdej warstwy.

Po pierwszym otwarciu projektu dynamicznie generowane były moje nazwy warstw:

wprowadź opis zdjęcia tutaj

Myślę, że to może pomóc ci zacząć. Powiedz mi, jeśli napotkasz nieoczywiste problemy.

Germán Carrillo
źródło
Zrozumiałem to, czytając twój komentarz, opublikowałem 1s przed przesłaniem odpowiedzi. W kodzie należy wprowadzić pewne poprawki, aby dopasować je do określonego układu warstw, ale mam nadzieję, że @mofoyoda sobie z tym poradzi.
Germán Carrillo
1
Tak, to dobry początek. Możesz także po prostu znaleźć indeks oni usunąć stamtąd do końca, aby zaoszczędzić na użyciu wyrażenia regularnego.
Nathan W
1
@gcarrillo intensywny! Ale świetnie!
DPSSpatial
1
@gcarrillo Bardzo fajnie, dzięki! Wciąż próbuję wymyślić, jak zastosować tylko niektóre warstwy, mam nadzieję, że mi się uda. Dzięki za świetną odpowiedź!
mofoyoda