QGIS Mehrere Stile gleichzeitig auf eine Ebene laden


10

Ich habe eine Reihe von Dateien im XML-Stil gespeichert, die ich auf ähnliche Ebenen in mehreren Projekten anwende. Ein Beispiel wäre eine Linientyp-Shapefile-Ebene mit etwa einem Dutzend verschiedener Stile. Derzeit muss ich den Vorgang des Hinzufügens eines neuen Stils und des Ladens der qml-Datei für jeden der verschiedenen Stile wiederholen. Dann muss ich es in diesem Projekt noch einige Male machen und das Ganze im nächsten Projekt noch einmal wiederholen.

Versuchen Sie nur herauszufinden, ob es eine Möglichkeit gibt, mehrere Stildateien gleichzeitig auf derselben Ebene zu laden? Anstatt zu einer einzelnen qml zu navigieren, könnte ich mehrere qml-Dateien mehrfach auswählen und gleichzeitig laden?

Beispiel für mehrere Stile pro Ebene


1
Was meinst du mit dem gleichzeitigen Laden mehrerer Stile auf derselben Ebene? Würde der zuletzt geladene Stil nicht alle zuvor geladenen Stile überschreiben? Oder möchten Sie viele Stile auf mehrere Kopien derselben Ebene laden?
Artwork21

Mein aktueller Workflow besteht darin, die Ebeneneigenschaften zu öffnen. Verwenden Sie die Stilschaltfläche (unten links), um einen neuen Stil hinzuzufügen, einen Namen zuzuweisen und dann eine gespeicherte XML-Datei zu laden. Wiederholen Sie den Vorgang für so viele (10 bis 20) Stile, die diese Ebene verwendet. Derzeit muss ich dies einzeln für ca. 7-8 Ebenen in> 25 Projekten durchführen. (sich wiederholende Daten, Ebenen und Karten, aber Projektdateien, die geografisch nach Gemeinden getrennt sind - jede Gemeinde ist ein separater Kunde)
CEL-ma

Es gibt eine ähnliche Frage hier, die Python verwenden möchte, aber noch keine Antwort, gis.stackexchange.com/questions/294016/…
artist2121

Antworten:


3

Sie können mehrere Stile mit dem pyqgis-Skript laden (Erläuterungen in Kommentaren):

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)

Sie können es in der QGIS-Python-Konsole ausführen oder an ein Verarbeitungsskript anpassen.

(Getestet mit der aktuellen LTR-Version QGIS 2.18)


1
Vielen Dank! Ich konnte mehrere Stile erfolgreich laden - während der Ausführung des Algorithmus wurde die Fehlermeldung "[Errno 9] Bad File Descriptor" angezeigt, die jedoch weiterhin erfolgreich abgeschlossen wurde. Das erspart mir viel Arbeit!
CEL-ma

An alle anderen, die diesen Beitrag in Zukunft lesen; Die oben erwähnte Fehlermeldung "Ungültige Datei" war darauf zurückzuführen, dass der qml-Pfad sowohl Linien- als auch Knotenvektorschichten aufwies. Einmal getrennt, kein Fehler mehr.
CEL-ma

Kann jemand helfen, diesen Code in Python 3 zu konvertieren, damit er in QGIS 3 funktioniert?
CEL-ma

0

Wenn ich Sie richtig verstehe, möchten Sie nur in der Lage sein, Geometriestile und nicht unbedingt Regeln oder Ausdrücke schnell und einfach auf Ebenen in einem von Ihnen geöffneten Projekt anzuwenden?

Wenn dies der Fall ist, können Sie Ihre Stile einfach mit dem Stil-Manager in der Symbolbibliothek speichern. Öffnen Sie das Ebenenstilfenster und klicken Sie auf die Schaltfläche "Bibliothek öffnen".


Entschuldigung, ja - die Stile, die ich stapelweise laden möchte, basieren auf Regeln.
CEL-ma
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.