在QGIS中更改图层的数据源


18

有没有一种方法可以将Shapefile转换为QGIS中的图层文件,就像您在ArcGIS图层的属性中执行此操作一样?(即转到图层属性,“源”选项卡,然后只需按下'Set Dat Source'按钮)

我遍历了QGIS中的图层属性,但在任何地方都看不到...

编辑:我已经收到评论,说明您不能使用shapefile进行此操作,但是如果我要更改shapefile的名称,然后打开一个包含该shapefile作为图层的现有项目文件,则将获得“句柄” Bad Layers的对话,这使我可以导航图层并将图层重新来源到想要的任何shapefile。我觉得可以在这种情况下使用资源很奇怪,但是您不能通过图层属性对话框手动进行操作。

Answers:


18

现在,可以使用插件轻松完成此操作:

changeDataSource

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

右键单击矢量层“更改矢量数据源”时,它会添加一个按钮,就像Arc一样容易。


gret功能,但我希望那是核心功能!
hilpers

好办法!对于非GIS人员来说,这将足够容易。
ak112358 '17

不幸的是,如果要切换到的数据源在ESRI文件地理数据库中(通过Open FileGDB),则此功能将不起作用,因为该数据类型未在随后的弹出窗口中列出。
user25644

10

目前这是不可能的,但是有一张票。但是,您可以在.qgs(项目文件)中更改数据源,然后重新打开项目。

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

<datasource>线


4
您可以链接到票证,以便其他人知道是否/何时完成?
RyanKDalton-OffTheGridMaps

当您说有一个然后找不到这个东西时,总是很好:)
Nathan W

谢谢,我看着这样做,但是我的问题是我的用户不是GIS人员,他们只需要项目即可查看一些数据。我想设置一个项目文件并设置所有符号和标签,然后让它们重新为不同站点提供数据层。这种方法超出了她的技能范围。我想我也许可以编写一个脚本,允许她使用插件来更新图层。
Mike

1
DOS批处理如何将一个简单的不同shapefile复制到项目文件中引用的虚拟对象中,然后启动项目文件呢?我不知道如果图层CRS或范围不同,会发生什么。
AndreJ 2013年

1
教他们如何添加数据,设置样式和标签可能更容易。您可以复制样式并将其粘贴,这样应该很容易,不必了解标签。由于您所描述的并不是真正的GIS或编辑工具,所以它并不那么困难。替代方法可能是制作一个独立的程序来替换源文件,因为qgs文件只是文本
Antonio Locandro 2015年

3

在python中,可以使用QgsVectorLayer.writeLayerXML和QgsVectorLayer.readLayerXML直接修改数据源,如下面示例所示,在运行和重新加载层上修改DOM文档。

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)

该功能已包含在PickLayer插件中,该插件允许对单击的图层和特征执行操作


2

从版本2.10开始,QGis Api包含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 

1

如果使用shapefile,则为否(由于格式的特定特征)。如果使用PostGIS或SpatiaLite图层,则单个矢量图层(geometry_columns表)可以连接到多个属性表,并且可以反向连接(使用外键或视图)。

它是在GRASS GIS中本地实现的,一个矢量层有多个表并更改了数据源(v.to.db

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.