Чи можливо мати ім’я динамічного шару в проекті QGIS?


9

У мене є проект QGIS з шарами, заснований на PostGIS SQL запитах, які використовують поточну дату. Оскільки дані в базі даних змінюються, ці запити повертають різні дані кожного нового дня.

Чи можливо динамічно змінювати назву шару на панелі дерева шарів, щоб він відображав поточну дату? (тобто назва шару, як Traffic on 24.01.2015, що змінюється кожен новий день). Дані для підпису повинні бути взяті з атрибута будь-якої функції в шарі - всі вони мають однакове значення для поля traffic_date.


Що саме ви отримаєте зі своєї таблиці баз даних, "Трафік" чи поточної дати?
Герман Каррільо

Я витягую дані для поточної дати на один шар, а дані прогнозують на інші шари. Отже, "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: Я перевірив це на форматі файлів, тому поле, з якого я беру, - це traffic_daтому, що Shapefiles не підтримують більше літер у назвах полів. Налаштуйте це в коді для роботи над вашими шарами.

    Примітка 2: Залежно від конфігурації проекту, вам слід додати код перевірки, щоб діяти лише на потрібних шарах. Наприклад, якщо ви запускаєте код на растрових шарах, помилки точно з’являться. Якщо вам потрібна допомога в цьому, відкрийте нове запитання, я можу вам допомогти.

  2. Переконайтеся, що ви ввімкнули макроси для свого проекту таким чином: Settings->Options->General->Enable macros: Always

  3. Завантажте свої шари до проекту.

  4. Збережіть свій проект.

Щоразу, коли ви відкриваєте проект з цього моменту, назви шарів будуть динамічними, дата буде взята з поля traffic_dateв таблиці атрибутів кожного шару.

Після першого відкриття проекту таким чином динамічно генеруються мої назви шарів:

введіть тут опис зображення

Я думаю, що це може допомогти вам почати. Скажіть, якщо ви стикаєтеся з не очевидними проблемами.


Я зрозумів це, прочитавши ваш коментар, розміщений за 1 до того, як я надіслав відповідь. Деякі корективи повинні бути внесені в код, щоб відповідати конкретному розташуванню шарів, але я сподіваюся, що @mofoyoda може впоратися з ними.
Герман Каррільо

1
Так, спочатку добре піти. Ви також можете просто знайти індекс onта смужку звідти до кінця, щоб заощадити на використанні регулярного виразу.
Nathan W

1
@gcarrillo інтенсивно! Але чудово!
DPSSpace 01

1
@gcarrillo Дуже круто, дякую! Ще намагаюся розібратися, як застосовувати лише певні шари, сподіваюся, це вдасться. Дякую за чудову відповідь!
mofoyoda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.