Ändern der Datenquelle eines Layers in QGIS

17

Gibt es eine Möglichkeit, ein Shapefile in eine Layer-Datei in QGIS zu importieren, ähnlich wie Sie dies in den Eigenschaften eines ArcGIS-Layers tun? (dh Gehe zu Ebeneneigenschaften, Registerkarte Quelle und drücke dann einfach die 'Set Dat Source'Taste)

Ich habe alle Layereigenschaften in QGIS durchgesehen und sehe das nirgendwo ...

BEARBEITEN: Ich habe Kommentare erhalten, in denen erklärt wird, dass dies mit Shapefiles nicht möglich ist. Wenn ich jedoch den Namen eines Shapefiles ändere und dann eine bereits vorhandene Projektdatei öffne, die dieses Shapefile als Ebene enthält, erhalte ich das Handle Das Dialogfeld "Fehlerhafte Ebenen", in dem ich navigieren und die Ebene in ein beliebiges Shapefile umwandeln kann, das ich verwenden möchte. Ich finde es seltsam, dass Sie in diesem Szenario Ressourcen bereitstellen können, dies jedoch nicht manuell über das Dialogfeld mit den Ebeneneigenschaften tun können.

Mike
quelle

Antworten:

18

Das geht jetzt ganz einfach mit einem Plugin:

changeDataSource

https://geogear.wordpress.com/2015/09/30/changedatasource-plugin-release-1-0/

Es fügt eine Schaltfläche hinzu, wenn Sie mit der rechten Maustaste auf eine Vektorebene klicken und "Vektordatenquelle ändern" auswählen. Dies ist genauso einfach wie bei "Bogen".

HeikkiVesanto
quelle
tolle Funktionalität, ich wünschte, das wäre die Kernfunktionalität!
Helfer
gute Lösung! Dies wäre für Nicht-GIS-Benutzer einfach genug.
ak112358
Leider funktioniert diese Funktion nicht, wenn sich die Datenquelle, zu der Sie wechseln möchten, in einer ESRI File Geodatabase (über Open FileGDB) befindet, da dieser Datentyp nicht im nachfolgenden Popup-Fenster aufgeführt ist.
User25644
10

Derzeit ist dies nicht möglich, aber es gibt ein Ticket dafür. Sie können jedoch die Datenquelle in der .qgs-Datei (Projektdatei) ändern und das Projekt erneut öffnen.

<projectlayers layercount="1">
    <maplayer minimumScale="-4.65661e-10" maximumScale="1e+08" minLabelScale="0" maxLabelScale="1e+08" geometry="Point" type="vector" hasScaleBasedVisibilityFlag="0" scaleBasedLabelVisibilityFlag="0">
        <id>graduated_classes20130603233806207</id>
        <datasource>../Downloads/Grauated_classes_test_sample/graduated_classes.shp</datasource>
        <title></title>
        <abstract></abstract>

Ändern Sie die <datasource>Zeile

Nathan W
quelle
4
Können Sie auf das Ticket verlinken, damit andere wissen, ob / wann es vollständig ist?
RyanKDalton-OffTheGridMaps
Immer gut, wenn man sagt, es gibt einen, dann kann man das Ding nicht finden :)
Nathan W
Danke, ich habe es so gesehen, aber das Problem, das ich habe, ist, dass meine Benutzer keine GIS-Leute sind, sie brauchen nur das Projekt, um einige Daten anzuzeigen. Ich wollte eine Projektdatei einrichten, die gesamte Symbologie und Beschriftung festlegen und dann nur die Datenebene für verschiedene Sites neu beschaffen. Diese Methode übersteigt ihre Fähigkeiten. Ich denke, ich könnte ein Skript schreiben, mit dem sie ein Plugin zum Aktualisieren der Ebenen verwenden kann.
Mike
1
Was ist mit einem DOS-Stapel, bei dem einfach eines der verschiedenen Shapefiles in ein Dummy kopiert wird, auf das in der Projektdatei verwiesen wird? Starten Sie dann die Projektdatei. Ich weiß nicht, was passiert, wenn Layer CRS oder Extents unterschiedlich sind.
AndreJ
1
Wahrscheinlich ist es einfacher, ihnen beizubringen, wie sie Daten hinzufügen, formatieren und beschriften. Sie können den Stil kopieren und einfügen, damit er einfach ist und Sie keine Informationen zu Beschriftungen haben. Da das, was Sie beschreiben, nicht wirklich GIS oder Bearbeitung ist, sollte es nicht so schwierig sein. Eine Alternative könnte sein, ein eigenständiges Programm zu erstellen, das den Quellcode als QGS-Datei ersetzt
Antonio Locandro,
3

In Python ist es möglich, die Datenquelle mithilfe von QgsVectorLayer.writeLayerXML und QgsVectorLayer.readLayerXML direkt zu ändern, das DOM-Dokument im laufenden Betrieb zu ändern und die Ebene wie im folgenden Beispiel neu zu laden.

from PyQt4.QtXml import *
from qgis.core import *
from PyQt4.QtXml import *

layer = self.iface.legendInterface().currentLayer()
newDatasource = "NEW DATASOURCE STRING" # get datasource from layer properties general     tab
newDatasourceProvider = "ogr" # possible values: (ogr, )

# read layer DOM definition
XMLDocument = QDomDocument("style")
XMLMapLayers = QDomElement()
XMLMapLayers = XMLDocument.createElement("maplayers")
XMLMapLayer = QDomElement()
XMLMapLayer = XMLDocument.createElement("maplayer")
layer.writeLayerXML(XMLMapLayer,XMLDocument)

# modify DOM element with new layer reference
XMLMapLayer.firstChildElement("datasource").firstChild().setNodeValue(newDatasource)
XMLMapLayer.firstChildElement("provider").firstChild().setNodeValue(newDatasourceProvider)
XMLMapLayers.appendChild(XMLMapLayer)
XMLDocument.appendChild(XMLMapLayers)

# reload layer definition
self.layer.readLayerXML(XMLMapLayer)
self.layer.reload()

# apply to canvas and legend
self.iface.actionDraw().trigger()
self.iface.legendInterface().refreshLayerSymbology(self.layer)

Die Funktion wurde in das PickLayer-Plugin aufgenommen , mit dem Aktionen für angeklickte Ebenen und Features ausgeführt werden können

Enrico Ferreguti
quelle
2

Ab Release 2.10 enthält QGis Api die QgsVectorLayer :: setDataSource- Methode:

void QgsVectorLayer::setDataSource  (   QString     dataSource,
        QString     baseName,
        QString     provider,
        bool    loadDefaultStyleFlag = false 
    )       

Update the data source of the layer.

The layer's renderer and legend will be preserved only if the geometry type of the new data source matches the current geometry type of the layer.

Parameters
    dataSource  new layer data source
    baseName    base name of the layer
    provider    provider string
    loadDefaultStyleFlag    set to true to reset the layer's style to the default for the data source 
Enrico Ferreguti
quelle
1

Wenn Sie mit Shapefiles arbeiten, nein (aufgrund der spezifischen Eigenschaften des Formats). Wenn Sie PostGIS- oder SpatiaLite-Layer verwenden, kann ein einzelner Vektor-Layer (geometry_columns-Tabelle) mit mehreren Attributtabellen verbunden und umgekehrt (mit Fremdschlüsseln oder Ansichten) werden.

Es ist nativ in GRASS GIS implementiert, mit mehreren Tabellen für eine Vektorebene und wechselnder Datenquelle ( v.to.db

Gen
quelle