我在QGIS中有一个带有两个空字段的属性表。
我想导入一个Excel数据库来填充QGIS中的空白字段。我的excel文件与我的QGIS属性表中的列匹配。
我能够正确地将我的Excel(.CSV)加入到shapefile中。但是,该过程没有像我希望的那样填充空白字段,而是创建了重复项。在《表管理器》的帮助下,我可以纠正这种情况,但这需要很多时间。我正在寻找一种更有效的方式来合并我的excel数据。
如何在不创建重复项的情况下将excel文件加入属性表?
我在QGIS中有一个带有两个空字段的属性表。
我想导入一个Excel数据库来填充QGIS中的空白字段。我的excel文件与我的QGIS属性表中的列匹配。
我能够正确地将我的Excel(.CSV)加入到shapefile中。但是,该过程没有像我希望的那样填充空白字段,而是创建了重复项。在《表管理器》的帮助下,我可以纠正这种情况,但这需要很多时间。我正在寻找一种更有效的方式来合并我的excel数据。
如何在不创建重复项的情况下将excel文件加入属性表?
Answers:
您将需要将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
http://www.digital-geography.com/qgis-tutorial-ii-how-to-join-data-with-shapefiles/#.Vs9vpmHXKUk
以及注释中提到的ArMoraer教程。
只需添加另一种方法,您可以设置一个Project宏,该宏在加载时:
IP1
和IP2
字段首先,创建一个尚未创建的项目,然后转到工具栏:
项目>项目属性...>宏
然后在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文件时,下次加载项目时,字段应自动更新:
为什么那里有空字段?您可以从没有空字段开始,而仅使用联接中产生的两列吗?我认为这是最简单的方法。要么找到一个类似于ArcGIS中“加载”工具的工具。
如果您不使用地理数据库,则强烈建议您这样做。