Alterando a fonte de dados da camada no QGIS

18

Existe uma maneira de originar um shapefile para um arquivo de camada no QGIS, assim como você faz isso nas propriedades de uma camada do ArcGIS? (ou seja, vá para as propriedades da camada, guia fonte e pressione o 'Set Dat Source'botão)

Estive em todas as propriedades da camada no QGIS e não vejo isso em nenhum lugar ...

EDIT: recebi comentários explicando que você não pode fazer isso com shapefiles, mas se eu alterar o nome de um shapefile e abrir um arquivo de projeto preexistente que contenha esse shapefile como uma camada, receberei o 'Handle O diálogo Bad Layers ', que permite navegar e reorientar a camada para qualquer shapefile que eu desejar. Acho estranho que você possa recorrer nesse cenário, mas não pode fazê-lo manualmente através da caixa de diálogo de propriedades da camada.

Mike
fonte

Respostas:

18

Agora isso pode ser feito facilmente com um plugin:

changeDataSource

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

Ele adiciona um botão quando você clica com o botão direito do mouse em uma camada de vetor "Alterar fonte de dados de vetor", tão fácil quanto o Arc.

HeikkiVesanto
fonte
No entanto, gostaria que essa fosse a funcionalidade principal!
Hilpers 19/12/16
boa solução! isso seria fácil o suficiente para pessoas que não são de GIS.
ak112358
Infelizmente, esse recurso não funcionará se a fonte de dados para a qual você deseja alternar estiver em um geodatabase de arquivo ESRI (por meio do Open FileGDB), pois esse tipo de dado não está listado na janela pop-up subsequente.
user25644
10

Atualmente, isso não é possível, mas há um ticket para isso. No entanto, você pode alterar a fonte de dados no arquivo .qgs (arquivo de projeto) e reabrir o projeto.

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

Mude a <datasource>linha

Nathan W
fonte
4
Você pode criar um link para o ticket para que outras pessoas saibam se / quando estiver completo?
precisa saber é o seguinte
Sempre bom quando você diz que existe um, então não consegue encontrar a coisa :)
Nathan W
Obrigado, olhei para fazê-lo dessa maneira, mas o problema que tenho é que meus usuários não são pessoas de GIS, eles só precisam do projeto para visualizar alguns dados. Eu queria configurar um arquivo de projeto e definir toda a simbologia e rotulagem e, em seguida, apenas re-originar a camada de dados para sites diferentes. Este método está além do seu conjunto de habilidades. Estou pensando em poder escrever um script que permita que ela use um plug-in para atualizar as camadas.
Mike
1
Que tal um lote do DOS que simplesmente copia um dos diferentes shapefiles para um fictício referenciado no arquivo do projeto e, em seguida, inicie o arquivo do projeto. Não sei o que acontece se a camada CRS ou extensões forem diferentes.
Andrej
1
Provavelmente, é mais fácil ensiná-los a adicionar, estilizar e rotular os dados. Você pode copiar o estilo e colá-lo para que seja fácil, não conheça rótulos. Como o que você está descrevendo não é realmente GIS ou edição, não deve ser tão difícil. Alternativa talvez seja para fazer um programa autônomo para substituir fonte como um arquivo QGS é apenas texto
Antonio Locandro
3

em python, é possível modificar diretamente a fonte de dados usando QgsVectorLayer.writeLayerXML e QgsVectorLayer.readLayerXML modificando o documento DOM rapidamente e recarregando a camada, como no exemplo abaixo.

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)

O recurso foi incluído no plug-in PickLayer que permite executar ações na camada e no recurso clicados

Enrico Ferreguti
fonte
2

A partir da versão 2.10, a QGis Api inclui o método 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
fonte
1

Se você trabalha com shapefiles, não (devido às características específicas do formato). Se você usar as camadas PostGIS ou SpatiaLite, uma única camada vetorial (tabela geometry_columns) poderá ser conectada a várias tabelas de atributos e inversa (com chaves estrangeiras ou Views).

É implementado nativamente no GRASS GIS, várias tabelas para uma camada vetorial e alteração da fonte de dados ( v.to.db

gene
fonte