3.1.3 属性连接与图层关联

矢量数据具有“定位明显,属性隐含”的特点,其属性数据以属性表的形式存在。多个矢量图层(或数据表)之间的属性可能存在某种关系,如一对一、一对多、多对一、多对多等,这些关系可以通过属性连接或图层关联的方式建立起来。属性连接用于处理一对一或多对一的关系,并直接体现在属性表中,可以进一步用于其他分析和处理。图层关联可以处理上述所有关系,但通常用于处理一对多或多对多的关系,可以体现在属性表的表单视图中,并且可以进一步地通过“relation_aggregate”表达式等方式分析和处理数据。

本节介绍矢量图层的属性表的基本操作,以及属性连接和图层关联的操作方法。

1. 属性表

矢量数据的属性表通过图层右键菜单的“Open Attribute Table”选项打开。QGIS属性表有两种表现形式:表格视图(Table View)和表单视图(Form View),如图3-7所示。

图3-7 矢量数据图层的属性表

表格视图以数据为中心,以数据表的形式展示所有要素的属性。每个要素(Feature)都对应表格的一行(Row),也称为一个记录(Record);每列称为一个字段(Field),采用某种数据类型存储属性信息。

表单视图以要素为中心,以要素标题的方式显示在左侧列表中,被选中的要素属性以表单的形式显示在右侧列表中。左侧列表中的要素标题可以通过表达式计算得出,单击列表上方的“Expression”按钮即可编辑表达式。另外,也可以在“Expression”按钮右侧的下拉菜单中选择“Column Preview”子菜单中的一个属性字段作为要素标题。在“Expression”下拉菜单中,单击“Sort by preview expression”按钮,即可对要素标题进行排序。

单击属性表右下角的按钮,即可切换属性表到表格视图模式;单击按钮,即可将属性表切换到表单视图模式。表格视图和表单视图各有利弊:表格视图可以清楚地展示大量要素属性数据,并且可以直观地对比多个要素的属性特征,在多个要素属性编辑、筛选、排序等操作中更加适用;表单视图可以清楚地展现单个要素的所有属性,常用于单一要素的属性浏览和编辑。

在属性表左下角的“Show All Features”下拉菜单中,可以筛选在属性表中显示的要素,各菜单的具体功能如下:

• Show All Features:显示全部要素。

• Show Selected Features:仅显示被选择的要素。

• Show Features Visible On Map:仅显示在地图画布中可见的要素。

• Field Filter:通过属性字段筛选要素。

• Advanced Filter (Expression):通过表达式进行高级筛选。

• Stored Filter Expressions:保存的筛选表达式。

2. 属性连接

上一节介绍了如何打开无空间信息的电子表格文件。但是在QGIS中如何有效地表达与渲染这些无空间信息的数据呢?一个重要的方法就是将无空间信息的数据通过某个字段与含有空间信息的矢量文件连接起来,即通过矢量数据表达无空间信息的表格数据。上述这种连接方式被称为属性连接(Join),被连接数据的图层称为连接图层,显示连接数据的图层称为目标图层。本节介绍如何将“2017年吉林省各地区降水量(mm).xlsx”文件连接到吉林省地级行政区划文件(jilin_dist.shp)上,具体操作如下。

(1)添加上述两个文件到QGIS图层列表中。

(2)打开“jilin_dist”图层的属性表,“DIST_CODE”字段表示行政区编号,“NAME”字段表示行政区名称。“NAME”字段与2017年吉林省各地区降水量数据中的“city”字段存在一一对应关系,这为属性连接创造了条件。属性连接就是利用这两个字段的信息对应性,将2017年吉林省各地区降水量数据连接到“jilin_dist”数据中。

(3)在“jilin_dist”图层的右键菜单中选择“Properties”选项,在打开的图层对话框中选择“Joins”选项卡,如图3-8所示。

图3-8 “Joins”选项卡

(4)单击“Joins”选项卡下方的按钮,弹出“Add Vector Join”对话框,如图3-9所示。在“Join layer”选项中选择连接图层“2017年吉林省各地区降水量(mm)Sheet1”,在“Join field”选项中选择连接字段“city”,在“Target field”选项中选择属性连接的目标图层字段“NAME”。另外,选中“Custom Field Name Prefix”选项可以自定义连接字段的前缀 “pre_”,以缩短连接字段名称。单击“OK”按钮,即可在图层属性的“Joins”选项卡中看到新增加的连接字段,如图3-10所示。

图3-9 “Add Vector Join”对话框

图3-10 属性连接后的“Joins”选项卡

在“Add Vector Join”对话框中,其他几个选项的说明如下。

• Cache join layer in virtual memory:在虚拟内存中缓存连接图层,勾选该选项后,将连接的内容在虚拟内存中构建缓存。

• Dynamic form:动态表单,勾选该选项后,连接图层中的记录发生变化时,会立刻将变化更新到目标图层中。

• Editable join layer:可编辑的连接图层,勾选该选项后,可以编辑被连接的字段内容,并将其更新到连接图层中。

• Joined Fields:选择需要连接的字段。

(5)单击图层属性的“OK”按钮,回到“jilin_dist”图层属性表,即可看到2017年吉林省各地区降水量数据被连接到“jilin_dist”图层属性表之中,如图3-11所示。

图3-11 属性连接后的“jilin_dist”图层属性表

此时属性表中的连接字段并不存储在该连接图层的数据源中,如果需要将降水量数据永久地与“jilin_dist”图层关联,可以通过导出图层要素的方式实现,具体的操作方法如下:在“jilin_dist”图层的右键菜单中选择“Export”—“Save Features As…”命令,弹出“Save Vector Layer as…”对话框。在“Format”选项中选择输出格式“ESRI Shapefile”,在“File name”选项中选择输出文件位置,在“Select fields to export and their export options”选项中勾选被连接的字段(如降水量数据字段“pre_Jan”和“pre_Feb”等),单击“OK”按钮,如图3-12所示。

图3-12 导出“jilin_dist”图层

3. 图层关联

与属性连接类似,图层关联也用于处理多个矢量图层(或数据表)之间的属性关系,但是多处理一对多或多对多的关系。在图层关联中,关联的基准图层称为被参考图层(Referenced Layer),也称为父图层(Parent Layer);被关联的图层称为参考图层(Referencing Layer),也称为子图层(Child Layer)。父图层的要素称为父要素,父要素关联的子图层要素称为子要素。此处仍然以“2017年吉林省各地区降水量(mm).xlsx”文件与吉林省地级行政区划文件(jilin_dist.shp)为例,介绍图层关联的操作方法及其特点。

(1)添加上述两个文件到QGIS图层列表中。

(2)选择“Project”—“Properties…”菜单命令(快捷键:Ctrl+Shift+P),打开QGIS项目属性对话框。在该对话框中,选择“Relations”选项卡,列表中显示工程中所有图层之间的图层关系,如图3-13所示。

图3-13 图层关系

(3)单击“Add Relation”按钮,弹出添加图层关联对话框,如图3-14所示。在“Name”文本框中输入关联名称“降水量关系”;在“Referenced layer (parent)”选项中选择父图层“jilin_dist”及其关联字段“NAME”;在“Referencing layer (child)”选项中选择子图层“2017年吉林省各地区降水量(mm) Sheet1”及其关联字段“city”。

图3-14 添加图层关联

另外,单击按钮还可以增加其他关联字段;通过“Id”选项可以自定义关联标识符;通过“Relationship strength”选项可以定义关联强度,包括弱关联(Association)和强关联(Composition)两个选项。弱关联建立父要素和子要素之间的联系,强关联复制父要素的同时也相应地复制子要素。

(4)单击添加图层关联对话框的“OK”按钮即可添加图层关联。

此时,打开父图层“jilin_dist”的属性表,并切换到表单模式(表格模式没有任何变化),在属性表单下方的“降水量关系”组合框中可以看见每个父要素关联的子要素列表,并且可以通过右上角的按钮和按钮切换表单模式和表格模式,如图3-15所示。

图3-15 在父要素属性表单中查看子要素属性信息

在子要素显示的组合框中,其上方的各个按钮的功能如下:

Toggle editing mode for child layer:切换子图层的编辑模式。

Save child layer edits:保存子图层的编辑结果。

Add child feature:增加子要素。

Duplicate child feature:复制子要素。

Delete child feature:删除子要素。

Link existing child features:关联已经存在的子要素。

Unlink child feature:解除关联的子要素。

Zoom to child feature:缩放到子要素。