QGIS一次在单层上加载多种样式


10

我保存了一组qml样式文件,将它们应用于多个项目中的相似图层。一个示例是具有大约十二种不同样式的线型shapefile图层;当前,我必须重复添加新样式并为每种不同样式加载qml文件的过程。然后,我必须在该项目中再做几次,然后在下一个项目中再次重复整个过程。

只是想看看是否有一种方法可以一次在同一层上加载多个样式文件?可以浏览多个qml文件并一次加载它们,而不是浏览单个qml,就像这样吗?

每层多种样式的示例


1
在同一层上一次加载多个样式是什么意思?最后加载的样式是否会覆盖所有先前加载的样式?还是想将许多样式加载到同一层的多个副本中?
艺术品

我当前的工作流程是打开图层属性。使用样式按钮(左下角)添加新样式,指定名称,然后加载保存的.qml文件,然后对图层使用的许多样式(10-20)重复进行操作。目前,我必须在25个以上的项目中逐个进行此操作,大约需要7-8层。(重复的数据,图层和地图,但项目文件按城市在地理位置上分开-每个城市都是单独的客户)
CEL-ma

这里有一个类似的问题想使用python,但还没有答案,gis.stackexchange.com
questions /

Answers:


3

您可以使用pyqgis脚本加载多种样式(注释中的解释):

import os
from qgis.core import QgsMapLayerStyle
from qgis.utils import iface

# set path to your styles here
qml_path = '/home/user/qml'

layer = iface.activeLayer()
style_manager = layer.styleManager()

# read valid style from layer
style = QgsMapLayerStyle()
style.readFromLayer(layer)

for qml_file in [f for f in os.listdir(qml_path)
                 if os.path.isfile(os.path.join(qml_path, f)) and
                 f.endswith('.qml')]:
    # get style name from file
    style_name = os.path.basename(qml_file).strip('.qml')
    # add style with new name
    style_manager.addStyle(style_name, style)
    # set new style as current
    style_manager.setCurrentStyle(style_name)
    # load qml to current style
    (message, success) = layer.loadNamedStyle(os.path.join(qml_path, qml_file))
    print message
    if not success:  # if style not loaded remove it
        style_manager.removeStyle(style_name)

您可以在QGIS python控制台中运行它,也可以适应处理脚本。

(在当前的LTR版本QGIS 2.18上测试)


1
非常感谢你!我能够成功加载多种样式-在运行算法时,确实收到了“ [Errno 9]错误的文件描述符”错误消息,但仍然成功完成了!这将为我节省很多工作!
CEL-ma

以后给其他人看这篇文章的人;上面提到的“错误文件”错误消息是由于qml路径同时具有行向量层和节点向量层。一旦分离,就不再有错误。
CEL-ma

有人能够帮助将该代码转换为python 3,以便在QGIS 3中正常工作吗?
CEL-ma

0

如果我正确地理解了您,您只是想能够在打开的任何项目中快速,轻松地将几何样式应用于图层而不一定是规则或表达式?

如果是这种情况,您可以使用样式管理器将样式保存在符号库中吗?打开图层样式面板,然后单击“打开库”按钮。


抱歉,是的-我要批量加载的样式是基于规则的。
CEL-ma
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.