QGIS项目中可以有动态图层名称吗?


9

我有一个基于层的QGIS项目,该层基于使用当前日期的PostGIS SQL查询。由于数据库中的数据发生更改,因此这些查询每天都会返回不同的数据。

是否可以在图层树面板中动态更改图层的名称,使其代表当前日期?(即层名称,例如Traffic on 24.01.2015,每天都会更改)。字幕数据应取自图层中任何要素的属性-它们都具有相同的field值traffic_date


您将从数据库表“流量”或当前日期中准确提取什么?
赫尔曼·卡里略

我正在将当前日期的数据提取到一层,并将数据预测到其他层。因此,“ 24.01.2015”实际上是一个字段值,它来自数据库。我需要项目中的图层名称来自动更改与日期相对应的名称。
mofoyoda

每次加载项目时都可以更改名称吗?
弥敦道W

Answers:


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:我在shapefile上进行了测试,所以我使用的日期字段是traffic_da因为Shapefile在字段名称中不支持更多字母。在代码中进行调整以在您的图层上工作。

    注意2:根据项目配置,应添加验证代码以仅对所需的层起作用。例如,如果您在栅格图层上运行代码,则肯定会出现错误。如果您需要帮助,请打开一个新问题,我可以为您提供帮助。

  2. 确保以这种方式在项目上启用宏: Settings->Options->General->Enable macros: Always

  3. 将图层加载到项目中。

  4. 保存您的项目。

从这一点开始,每次打开项目时,层名称都是动态的,日期将从traffic_date每个层的属性表上的字段中获取。

第一次打开项目后,这就是动态生成图层名称的方式:

在此处输入图片说明

我认为这可以帮助您入门。告诉我您是否遇到非显而易见的麻烦。


我通过阅读您的评论(在提交答案之前发布1秒)找出了答案。应该在代码中进行一些调整以适合特定的图层排列,但是我希望@mofoyoda可以处理它们。
赫尔曼·卡里略

1
是的,这是一个很好的第一步。您还可以找到的索引,on然后从那里删除到最后以节省使用正则表达式的费用。
弥敦道W

1
@gcarrillo激烈!太好了!
DPSSpatial 2015年

1
@gcarrillo非常好,谢谢!仍在尝试弄清楚如何仅应用于某些图层,我希望我能做到。感谢您的答复!
mofoyoda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.