Modification de la source de données de la couche dans QGIS

18

Existe-t-il un moyen de générer un fichier de formes dans un fichier de couches dans QGIS, tout comme la façon dont vous procédez dans les propriétés d'une couche ArcGIS? (c.-à-d. Aller aux propriétés du calque, onglet source, puis 'Set Dat Source'appuyez simplement sur le bouton)

J'ai parcouru les propriétés des couches dans QGIS et je ne vois cela nulle part ...

EDIT: J'ai reçu des commentaires expliquant que vous ne pouvez pas faire cela avec des fichiers de formes, mais si je devais changer le nom d'un fichier de formes et ensuite ouvrir un fichier de projet préexistant qui contient ce fichier de formes en tant que couche, j'obtiendrai le 'Handle Le dialogue Bad Layers, qui me permet de naviguer et de ressourcer le calque dans n'importe quel fichier de formes que je veux. Je trouve étrange que vous puissiez utiliser des ressources dans ce scénario, mais vous ne pouvez pas le faire manuellement via la boîte de dialogue des propriétés de la couche.

Mike
la source

Réponses:

18

Cela peut maintenant être fait facilement avec un plugin:

changeDataSource

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

Il ajoute un bouton lorsque vous faites un clic droit sur une couche vectorielle "Changer la source de données vectorielle", donc aussi simple que Arc.

HeikkiVesanto
la source
gret fonctionnalité, je souhaite que ce soit la fonctionnalité de base, cependant!
hilpers
bonne solution! ce serait assez facile à utiliser pour les non-SIG.
ak112358
Malheureusement, cette fonctionnalité ne fonctionnera pas si la source de données vers laquelle vous souhaitez basculer se trouve dans une géodatabase fichier ESRI (via Open FileGDB) car ce type de données n'est pas répertorié dans la fenêtre contextuelle suivante.
user25644
10

Actuellement, ce n'est pas possible, mais il y a un ticket pour cela. Vous pouvez cependant modifier la source de données dans le .qgs (fichier de projet) et rouvrir le projet.

<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>

Changer la <datasource>ligne

Nathan W
la source
4
Pouvez-vous créer un lien vers le ticket pour que les autres sachent si / quand il est terminé?
RyanKDalton-OffTheGridMaps
Toujours bon quand vous dites qu'il y en a un alors vous ne trouvez pas la chose :)
Nathan W
Merci, j'ai envisagé de le faire de cette façon, mais le problème que j'ai est que mes utilisateurs ne sont pas des SIG, ils ont juste besoin du projet pour afficher certaines données. Je voulais mettre en place un fichier de projet et définir toute la symbologie et l'étiquetage, puis les récupérer à nouveau la couche de données pour différents sites. Cette méthode dépasse ses compétences. Je pense que je pourrais être en mesure d'écrire un script qui lui permet d'utiliser un plugin pour mettre à jour les couches.
Mike
1
Qu'en est-il d'un lot DOS qui copie simplement l'un des différents fichiers de formes dans un fichier factice référencé dans le fichier de projet, puis démarrez le fichier de projet. Je ne sais pas ce qui se passe si la couche CRS ou les extensions sont différentes.
AndreJ
1
Probablement plus facile de leur apprendre à ajouter les données, à les styliser et à les étiqueter. Vous pouvez copier le style et le coller pour que ce soit facile, je ne sais pas pour les étiquettes. Puisque ce que vous décrivez n'est pas vraiment un SIG ou une modification, cela ne devrait pas être si difficile. Une alternative pourrait être de créer un programme autonome pour remplacer la source car un fichier qgs est juste du texte
Antonio Locandro
3

en python, il est possible de modifier directement la source de données en utilisant QgsVectorLayer.writeLayerXML et QgsVectorLayer.readLayerXML en modifiant le document DOM à la volée et en rechargeant la couche comme dans l'exemple ci-dessous.

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)

La fonctionnalité a été incluse dans le plugin PickLayer qui permet d'effectuer des actions sur la couche et la fonctionnalité cliquées

Enrico Ferreguti
la source
2

Depuis la version 2.10, QGis Api inclut la méthode QgsVectorLayer :: setDataSource :

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
la source
1

Si vous travaillez avec des fichiers de formes, non (en raison des caractéristiques spécifiques du format). Si vous utilisez des couches PostGIS ou SpatiaLite, une seule couche vectorielle (table geometry_columns) peut être connectée à plusieurs tables d'attributs et inversée (avec des clés étrangères ou des vues).

Il est implémenté nativement dans GRASS GIS, plusieurs tables pour une couche vectorielle et une source de données changeante ( v.to.db

gène
la source