Suchen Sie eine Bereinigungsfunktion, um Ebenen aus der qgs-Datei zu entfernen, die im Ebenenbereich von QGIS nicht vorhanden sind?

8

Ich habe einige QGIS-Projekte, die ich seit langer Zeit verwende, Ebenen hinzufügen und entfernen, Verweise auf gelöschte oder verschobene Dateien aktualisieren usw.

Öffnen der qgs-Datei mit einem Texteditor Ich sehe, dass sie zahlreiche Verweise auf verschiedene Dateien enthält, und diese Verweise werden im Ebenenbaumbereich nicht angezeigt.

Ich habe drei verschiedene Fälle: Verweise auf vorhandene Dateien, Verweise auf fehlende Dateien, Verweise auf Datenbankverbindungen. Dies wurde mir bewusst, als ich mein Projekt auf einem anderen Computer öffnete und QGIS eine fehlende Datenbankverbindung zu Vektortabellen meldete, die in der Ebenenbaumansicht nicht vorhanden waren.

Das manuelle Löschen von Referenzen aus der qgs-Datei löste das Problem, aber ich verwalte große Projekte und es ist nahezu unmöglich, die Projektkonsistenz manuell zu überprüfen. Ich habe das Plugin "Leere Ebenen entfernen" ausprobiert, aber diejenigen, die ich entfernen möchte, sind keine leeren Ebenen.

Gibt es eine Möglichkeit, die QGIS-Datei zu löschen?

Bradypus
quelle
Haben Sie dies überprüft, indem Sie relative Pfade in der .qgs-Datei gespeichert haben? Es ist bei Setting--> Project Properties-->save paths-->relativeCheers N
Naresh
Was ist mit "Speichern unter ..." in einer neuen Projektdatei?
AndreJ
1
Das hat nicht funktioniert! Ich werde eine GQIS-Projektdatei mit einer Phantomschicht, die nicht im Ebenenbereich vorhanden ist, an die QGIS-Benutzer-Mailingliste senden.
Bradypus
1
Könnten Sie diese qgs-Datei irgendwo posten, wo wir sie finden könnten? Ich kann Ihre Situation nicht duplizieren. Vielleicht brauchen Sie nur einen einfachen Parser.
wie am
1
@ike Bitte überprüfen Sie hier: lists.osgeo.org/pipermail/qgis-user/2012-September/019327.html . Dort finden Sie das Testprojekt, das ich an die Mailingliste gesendet habe. Um es zu reproduzieren, sollten Sie eine TIF-Datei in diesen relativen Pfad einfügen: ./Planimetrie/2012/plan01_2012.tif. Bitte lesen Sie auch die folgenden Nachrichten für weitere Details.
Bradypus

Antworten:

7

Die fraglichen Ebenen befinden sich in der Ebenenregistrierung, jedoch nicht in der Legende .

Das folgende Python-Skript entfernt alle Ebenen, die geladen, aber nicht in der Legende angezeigt werden.

Entfernen der Ebenen:

registryLayers = QgsMapLayerRegistry.instance().mapLayers().keys()
legendLayers = [ layer.id() for layer in iface.legendInterface().layers() ]
layersToRemove = set( registryLayers ) - set( legendLayers )
QgsMapLayerRegistry.instance().removeMapLayers( list( layersToRemove ) )

Es sollte über die Python-Konsole in QGIS ausgeführt werden. Nach dem Anwenden können Sie den Vorgang überprüfen, indem Sie überprüfen, ob die Ebenen aus Datei (Projekt in 2.0) entfernt wurden => Projekteigenschaften => Identifizierbare Ebenen . Änderungen werden nicht automatisch gespeichert

Durch Hinzufügen der folgenden Zeile am Ende werden Änderungen ebenfalls automatisch gespeichert.

iface.actionSaveProject().trigger()

Bitte erstellen Sie eine Sicherungskopie Ihrer Projektdatei (.qgs), bevor Sie Ihre Projektdatei überschreiben, nachdem Sie dieses Skript angewendet haben.

Für QGIS 1.8 muss zunächst die folgende Zeile ausgeführt werden:

iface = qgis.utils.iface
Matthias Kuhn
quelle
Ok, ich erhalte Fehler, wenn ich es eingebe. Traceback (letzter Aufruf zuletzt): Datei "<Eingabe>", Zeile 1, in <Modul> NameError: Name 'legendLayerNames' ist nicht definiert
Ger
1
QGIS 1.8 erfordert eine andere Möglichkeit, auf iface zuzugreifen. Die Antwort wird aktualisiert, um dies widerzuspiegeln.
Matthias Kuhn
1
Ich denke du hast es hier. Nun, in meinem Fall hat es funktioniert. Dadurch funktioniert QGIS Cloud auch besser, da die Ebenen jetzt hochgeladen werden können. Ausgezeichnet.
Ger
0

Zusätzlich zu vielen anderen nützlichen Funktionen verfügt das Plugin mit dem Namen " Layer Board " (im Plugin-Installationsprogramm verfügbar) über eine integrierte Schaltfläche zum Entfernen von Ghost-Layern, mit der dieses Problem behoben wird.

Neben der 1-Klick-Schaltfläche zum Entfernen von Ghost-Ebenen können Sie auch einzelne Ebenen in einer schönen Benutzeroberfläche anzeigen und entfernen, in der jede Ebene und ihre Eigenschaften aufgelistet sind. Sie können jede dieser einzelnen Ebenen aus der Tabelle auswählen und auf die Schaltfläche "Ebene entfernen" klicken, um jedes Problem einzeln zu beheben.

In meinem Fall war die Möglichkeit, einzelne Ebenenreferenzen zu entfernen, sehr wichtig, da ich einige "Ghost-Ebenen" hatte, die denselben Namen hatten, aber 2-3 Mal in der Registrierung referenziert wurden. Ich habe die Ebenenplatine verwendet, um die richtigen Einträge einzeln zu entfernen und zur richtigen Einzelschichtreferenz zurückzukehren.

RyanKDalton
quelle