将数据从Excel连接到QGIS中的属性表而不创建重复项?


15

我在QGIS中有一个带有两个空字段的属性表。

范例_1

我想导入一个Excel数据库来填充QGIS中的空白字段。我的excel文件与我的QGIS属性表中的列匹配。

例_2

我能够正确地将我的Excel(.CSV)加入到shapefile中。但是,该过程没有像我希望的那样填充空白字段,而是创建了重复项。在《表管理器》的帮助下,我可以纠正这种情况,但这需要很多时间。我正在寻找一种更有效的方式来合并我的excel数据。

范例_3

如何在不创建重复项的情况下将excel文件加入属性表?


3
看一下本教程:执行表联接
ArMoraer

Answers:


13

我将做以下事情来使生活更轻松:

在执行此操作之前,请备份shapefile。

  1. 在shapefile中,转到图层属性/字段并打开编辑模式。
  2. 选择除ID字段外的所有字段
  3. 删除ID字段以外的所有字段
  4. 将您的csv文件添加为QGIS中的一个图层(主菜单/图层/添加图层/添加分隔的文本图层)在此处输入图片说明(不选择几何形状)
  5. 在shapefile中,选择“属性/连接”,然后选择源和目标的两个ID字段。如该问题的其他答案所述。
  6. 保存修改后的Shapefile。

在此处输入图片说明

这是我指的“字段”选项卡

在此处输入图片说明

不要忘记在删除不必要的字段前后切换编辑


13

您将需要将excel文件加入shapefile。您将把它们连接到一个公共属性上,结果将是一个连接层,其中每个记录都包含shapefile和excel文件的属性。

好的,首先将excel文件和矢量加载到图层中。我使用了一些测试数据,但您的设置应类似于以下内容。 在此处输入图片说明

现在,右键单击图层(在“图层”面板中)并选择属性,然后选择“连接”。首先点击左下角的绿色+号(下图中的大红色箭头),它将弹出一个新的“添加矢量联接”菜单(如下图所示),这里的联接层将是excel文件(因此请选择适当的excel文件) &sheet)连接字段是excel文件中的字段,其中包含shapefile的公共属性。目标字段是shapefile中的匹配字段。(在我的情况下,两个公共字段碰巧都被命名为unit,但是如果在shapefile中将该字段称为UNIT_,我将使用它代替UNIT作为目标字段)
在此处输入图片说明 还有一些其他选项可让您迷惑联接,例如,如果您只想查看某些字段等,那么无论如何,现在它们已联接在一起,如果您回头查看shapefile的属性,您将看到现在,它具有excel文件的相应属性,如下所示。

在此处输入图片说明

这里有一些方便的教程,逐步向您展示如何做:

https://www.mapbox.com/tilemill/docs/guides/joining-data/

http://maps.cga.harvard.edu/qgis/wkshop/join_csv.php

http://qgis.spatialthoughts.com/2012/03/using-tabular-data-in-qgis.html

如何在QGIS中将外部表与shapefile的属性表联接?

http://www.digital-geography.com/qgis-tutorial-ii-how-to-join-data-with-shapefiles/#.Vs9vpmHXKUk

以及注释中提到的ArMoraer教程。


顺便说一下,我看了教程mapbox.com/tilemill/docs/guides/joining-data,它非常有用。但是,我仍然无法将DBF文件加入shapefile。这让我感到惊讶,因为我的两个表结构都完全匹配。我似乎误会了“加入字段”和“目标字段”。您能补充更多细节吗?
Laurent Robitaille-Lainesse'2

1
@Laurent Robitaille-Lainesse我更新了我的帖子,并提供了逐步指南。我将测试excel文件添加到多边形shapefile中只是为了确保我的步骤正确。
ed.hank,2016年

我成功地将我的excel文件正确地加入了QGIS。我注意到«join»选项在属性表中添加了一个新字段。如果我错了,请纠正我,但是似乎无法将excel文件中的数据添加到属性表中的空字段中。
Laurent Robitaille-Lainesse'2

1
如果您有一个空白字段,则可以使用字段计算器从新加入的字段填充到表中的字段。
ed.hank,2016年

10

只需添加另一种方法,您可以设置一个Project宏,该在加载时:

  1. 自动将shapefile加入到csv中
  2. 更新IP1IP2字段
  3. 删除连接的字段,仅保留shapefile的字段(即不重复)

首先,创建一个尚未创建的项目,然后转到工具栏:

项目>项目属性...>宏

然后在def openProject():函数中使用以下代码,并输入图层的名称和要连接的字段。我分别在我的shapefile和csv文件中使用“ Example”和“ spreadsheet”,其字段为ID

from PyQt4.QtCore import *
import qgis
from qgis.core import QgsMapLayerRegistry, QgsVectorJoinInfo

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your shapefile name
    if layer.name() == "Example":
        qgis.utils.iface.setActiveLayer(layer)
        shp = qgis.utils.iface.activeLayer()

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your csv name
    if layer.name() == "spreadsheet":
        qgis.utils.iface.setActiveLayer(layer)
        csv = qgis.utils.iface.activeLayer()

# Set up join parameters
shpField='ID'
csvField='ID'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
shp.addJoin(joinObject)

# Define fields to update and joined fields to copy values from
ip1 = shp.fieldNameIndex('IP1') 
ip1_join = shp.fieldNameIndex('spreadsheet_IP1')
ip2 = shp.fieldNameIndex('IP2') 
ip2_join = shp.fieldNameIndex('spreadsheet_IP2')

shp.startEditing()
for feat in shp.getFeatures():
    shp.changeAttributeValue(feat.id(), ip1, feat.attributes()[ip1_join])
    shp.changeAttributeValue(feat.id(), ip2, feat.attributes()[ip2_join])
shp.commitChanges()

# Remove join 
shp.removeJoin(csv.id())

项目宏

确保连接图层,保存项目并通过转到工具栏启用宏

设置>常规>启用宏


现在,当您关闭项目并编辑csv文件时,下次加载项目时,字段应自动更新:

编辑CSV文件

结果


7

我的建议是使用开源LibreOffice / Open Office编辑您的Excel文件并制作.dbf文件。我为您准备了测试工作簿。 测试工作簿-链接

  1. 在Libre Office / Open Office中打开文件。
  2. 从您的Excel文件粘贴到“ Excel”工作表数据。
  3. 从您的.dbf文件粘贴到“ DBF”工作表数据(仅粘贴ID,X,Y)(IP1,IP2值将自动添加)。
  4. 另存为name.dbf文件(名称与形状文件名相同)。

QGIS中没有重复项的结果表: 在此处输入图片说明


5

为什么那里有空字段?您可以从没有空字段开始,而仅使用联接中产生的两列吗?我认为这是最简单的方法。要么找到一个类似于ArcGIS中“加载”工具的工具。

https://desktop.arcgis.com/zh-CN/arcmap/latest/extensions/production-mapping/loading-data-into-a-geodatabase.htm

如果您不使用地理数据库,则强烈建议您这样做。


我没有使用地理数据库。实际上,我并不熟悉。
洛朗·罗比塔耶·莱西

1
@ LaurentRobitaille-Lainesse我强烈建议创建一个新的文件地理数据库,然后在其中创建一个新的要素类,并使用它来存储数据。我还建议对地理数据库和要素类以及我们为什么使用它们以及它们在shapefile之外提供的内容进行一些简短的研究。
斯特拉

4

我不知道是否存在没有重复的直接连接方式,因为.DBF(数据库文件)中的属性支持.shp文件。该DBF具有其长度和精度的详细信息,例如整数,实数,字符串等列类型的声明。CSV文件仅具有普通列,未声明任何类型。我不知道您的文件有多大。对我来说,我将保留重复的字段,然后使用具有通用公式的字段计算器

原始Field_x =重复Field_x

然后删除所有那些重复的字段(通过QGIS或数据库程序)


3

我相信解决此问题的最简单方法是在联接之前简单地删除QGIS表中有问题的两列。然后,当您加入shapefile时,所需的两列将不会重复并且将保留其原始列名。

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.