Возможно ли иметь динамические имена слоев в проекте QGIS?

9

У меня есть проект QGIS со слоями, основанный на SQL-запросах PostGIS, использующих текущую дату. Поскольку данные в базе данных изменяются, эти запросы возвращают разные данные каждый новый день.

Можно ли динамически изменить имя слоя на панели дерева слоев, чтобы оно представляло текущую дату? (то есть название слоя Traffic on 24.01.2015, которое меняется каждый новый день). Данные для заголовка должны быть взяты из атрибута любого объекта в слое - все они имеют одинаковое значение для поля traffic_date.

mofoyoda
источник
Что именно вы бы извлекли из таблицы базы данных «Трафик» или текущей даты?
Герман Каррильо
Я извлекаю данные на текущую дату в один слой и прогнозирую данные в другие слои. Таким образом, «24.01.2015» на самом деле является значением поля, которое поступает из базы данных. Мне нужно, чтобы имя слоя в проекте автоматически менялось в соответствии с датой.
Мофойода
Можно ли менять имя при каждой загрузке проекта?
Натан 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что шейп-файлы не поддерживают больше букв в именах полей. Отрегулируйте это в коде, чтобы работать с вашими слоями.

    Примечание 2: В зависимости от конфигурации вашего проекта, вы должны добавить проверочный код, чтобы действовать только на нужные вам слои. Например, если вы запустите код на растровых слоях, ошибки наверняка появятся. Если вам нужна помощь в этом, откройте новый вопрос, я могу вам помочь.

  2. Убедитесь, что вы включили макросы в свой проект, таким образом: Settings->Options->General->Enable macros: Always

  3. Загрузите свои слои в проект.

  4. Сохраните свой проект.

Каждый раз, когда вы открываете свой проект с этой точки, имена ваших слоев будут динамическими, дата будет взята из поля traffic_dateв таблице атрибутов каждого слоя.

После того, как я впервые открыл проект, вот как динамически генерировались имена моих слоев:

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

Я думаю, что это может помочь вам начать. Скажите, если у вас возникли неочевидные проблемы.

Герман Каррильо
источник
Я понял это, прочитав ваш комментарий, опубликованный за 1 до того, как отправил ответ. Некоторые изменения должны быть сделаны в коде, чтобы соответствовать определенному расположению слоев, но я надеюсь, что @mofoyoda справится с ними.
Герман Каррильо
1
Да, это хороший первый шаг. Вы также можете просто найти индекс onи убрать оттуда до конца, чтобы сэкономить на использовании регулярных выражений.
Натан W
1
@gcarrillo интенсивный! Но отлично!
DPSSpatial
1
@gcarrillo Очень круто, спасибо! Все еще пытаясь понять, как применить только к определенным слоям, я надеюсь, что я сделаю это. Спасибо за отличный ответ!
мофойода