我们在 QGIS 项目中将地图主题与图层样式结合使用,以获得越来越多的布局所需的图层可见性和符号系统。
我们想跟踪现有的主题以及正在使用的图层和图层样式,因此我们使用 QGIS python 控制台来获取这些信息。
到目前为止,我们成功地在当前QGIS项目中打印了地图主题和每个图层的可见图层,并且我们有不同的python代码来获取项目中每个图层的所有样式作为参考(因此我们可以识别未使用的样式)。
我们的问题是我们找不到一种方法来打印应用于每个主题中引用的每个图层的样式。
此代码块打印所有图层名称和为每个图层定义的所有样式名称。
mapGeometryType = {
0: "Point",
1: "Line",
2: "Polygon",
3: "UnknownGeometry",
4: "NullGeometry",
}
layers = QgsProject.instance().mapLayers()
for layer in layers.values():
if layer.type() == QgsMapLayer.VectorLayer:
if mapGeometryType[layer.geometryType()] != "NullGeometry":
stlmngr = layer.styleManager()
styles = stlmngr.styles()
for style in styles:
print (str(layer.name()) + ';' + str(style))
此代码打印所有主题名称和每个主题的可见层名称。我们还想展示用于每个主题中每个可见层的样式。
project = qgis.core.QgsProject.instance()
coll = project.mapThemeCollection()
preset_names = coll.mapThemes()
for name in preset_names:
theme_layers = coll.mapThemeVisibleLayers(name)
for layer in theme_layers:
print (str(name) + ':' + str(layer))
起初我们尝试将两个代码块组合起来,但这不是可行的方法,所以我们寻找其他东西。 QgsMapThemeCollection 类中有这个 layerStyleOverrides(theme) 方法(参见here),但我们无法正确使用它。 QGis 项目在每次尝试时都会挂起。
这就是我们现在所拥有的。它不打印样式名称,它挂得非常快。
project = qgis.core.QgsProject.instance()
coll = project.mapThemeCollection()
preset_names = coll.mapThemes()
for name in preset_names:
stls = coll.mapThemeStyleOverrides(name)
for stl in stls:
print (str(name) + ';' + str(stl))