16.2. 使用属性表
属性表显示有关选定图层的要素的信息。表中的每一行表示一个特征(带或不带几何图形),每列包含有关该特征的一条特定信息。可以搜索、选择、移动甚至编辑表中的要素。
16.2.1. 前言:空间表和非空间表
QGIS允许您加载空间和非空间层。这目前包括GDAL和分隔文本支持的表,以及PostgreSQL、MS SQL Server、SpatiaLite和Oracle提供程序。所有加载的层都列在 Layers 面板。是否在空间上启用了某个图层,决定了您是否可以在地图上与其进行交互。
可以使用属性表视图浏览和编辑非空间表。此外,它们还可用于字段查找。例如,可以使用非空间表的列来定义要在数字化过程中添加到特定矢量图层的属性值或允许的值范围。请仔细查看部分中的编辑小部件 属性表单属性 以了解更多信息。
16.2.2. 介绍属性表接口
要打开矢量层的属性表,请通过在中单击该层来激活该层 图层面板 。然后,从主要的 菜单中,选择 。也可以右键单击该图层并选择
从下拉菜单中,或单击
Open Attribute Table 按钮。如果你喜欢走捷径, F6 将打开属性表。 Shift+F6 将打开过滤至所选要素的属性表 Ctrl+F6 将打开过滤为可见要素的属性表。
这将打开一个新窗口,其中显示该图层的要素属性 (figure_attributes_table) 。根据中的设置 菜单中,属性表将在停靠窗口或常规窗口中打开。图层中的要素总数和当前选定/过滤的要素数将显示在属性表标题中,如果该图层受空间限制,也会显示这些要素。

图 16.67 区域图层的属性表
属性表窗口顶部的按钮提供以下功能:
图标 |
标签 |
目的 |
默认快捷方式 |
---|---|---|---|
切换编辑模式 |
启用编辑功能 |
Ctrl+E |
|
切换多重编辑模式 |
更新多个要素的多个字段 |
||
保存编辑内容 |
保存当前修改 |
||
重新装入该表 |
|||
添加功能 |
添加新的无几何要素 |
||
删除所选要素 |
从图层中移除所选要素 |
||
将所选要素剪切到剪贴板 |
Ctrl+X |
||
将所选要素复制到剪贴板 |
Ctrl+C |
||
从剪贴板粘贴要素 |
从复制的要素插入新要素 |
Ctrl+V |
|
使用表达式选择要素 |
|||
选择所有 |
选择图层中的所有要素 |
Ctrl+A |
|
反选 |
反转层中的当前选定内容 |
Ctrl+R |
|
取消所有 |
取消选择当前图层中的所有要素 |
Ctrl+Shift+A |
|
使用表格过滤/选择要素 |
Ctrl+F |
||
将选定内容移至顶部 |
将选定的行移到表格的顶部 |
||
平移映射到所选行 |
Ctrl+P |
||
将地图缩放至所选行 |
Ctrl+J |
||
新领域 |
向数据源添加新字段 |
Ctrl+W |
|
删除字段 |
从数据源中删除字段 |
||
组织列 |
显示/隐藏属性表中的字段 |
||
开场计算器 |
更新一行中多个要素的字段 |
Ctrl+I |
|
条件格式设置 |
启用表格格式设置 |
||
码头属性表 |
允许停靠/取消停靠属性表 |
||
行为 |
列出与该层相关的操作 |
备注
根据数据的格式和使用您的QGIS版本构建的GDAL库,某些工具可能不可用。
这些按钮下方是快速字段计算栏(仅在 edit mode ),它允许将计算快速应用于层中的全部或部分要素。这个酒吧用的是同样的 expressions 作为 Field Calculator (见 编辑属性值 )。
16.2.2.1. 表视图与窗体视图
QGIS提供了两种查看模式来方便地操作属性表中的数据:
这个
Table view 以表格模式显示多个要素的值,每行表示一个要素,每列表示一个字段。通过右键单击列标题,可以执行以下操作 configure the table display 在单元格上单击鼠标右键可提供 interaction with the feature 。
属性表支持 Shift+Mouse Wheel 在表视图模式下滚动以在垂直和水平滚动移动之间切换。这也可以在MacOS上用触摸板取代鼠标来实现。
这个
Form view 展示会 feature identifiers 在第一个面板中,并且在第二个面板中仅显示所点击的标识符的属性。在第一个面板的顶部有一个下拉菜单,可以在其中使用属性指定“标识符” (Column preview )或 Expression 。该下拉列表还包括最后10个可重复使用的表达式。表单视图使用层字段配置(请参见 属性表单属性 )。
您可以使用第一个面板底部的箭头浏览功能标识。随着您的操作,第二个面板中的要素属性会更新。还可以通过按下底部的任何按钮来识别或移动到地图画布中的活动要素:
您可以通过单击对话框右下角的相应图标从一种模式切换到另一种模式。
您还可以指定 Default view 在中打开属性表时的模式 菜单。它可以是“记住上一个视图”、“表视图”或“窗体视图”。

图 16.68 表视图中的属性表(上)与窗体视图中的属性表(下)
16.2.2.2. 配置列
在表视图中右键单击列标题可以访问帮助您控制以下内容的工具:
调整列宽的大小
可以通过在列标题上单击鼠标右键并选择以下任一项来设置列宽:
Set width... 若要输入所需值,请执行以下操作。默认情况下,当前值显示在微件中
Set all column widths... 到相同的值
Autosize 以最适合该列的方式调整大小。
Autosize all columns
还可以通过拖动列标题右侧的边界来更改列大小。将为该层保留列的新大小,并在下次打开属性表时恢复该列。
隐藏和组织列并启用操作
通过在列标题中单击鼠标右键,可以选择 Hide column 从属性表(在“表视图”模式下)。有关更高级的控件,请按 Organize columns... 按钮或从对话框工具栏中选择 Organize columns... 在列标题上下文菜单中。在新对话框中,您可以:
选中/取消选中要显示或隐藏的列:隐藏列将从属性表对话框的每个实例中消失,直到它被活动恢复。
拖放项目以重新排序属性表中的列。请注意,此更改针对的是表呈现,不会更改图层数据源中的字段顺序
添加新的虚拟 Actions 在每行中显示已启用操作的下拉框或按钮列表的列。看见 操作属性 有关操作的详细信息,请参阅。
对列进行排序
通过单击列标题,可以按任何列对表格进行排序。小箭头表示排序顺序(向下表示值从顶行向下递减,向上表示值从顶行向下升序)。您还可以选择使用 Sort... 选项,然后编写一个表达式。例如,要使用多列对行进行排序,您可以编写 concat(col0, col1)
。
在窗体视图中,功能标识符可使用 Sort by preview expression 选择。
小技巧
Sorting based on columns of different types
尝试基于字符串和数值类型的列对属性表进行排序可能会导致意外结果,因为 concat("USE", "ID")
返回字符串值的表达式(即, 'Borough105' < 'Borough6'
)。您可以使用例如 concat("USE", lpad("ID", 3, 0))
它会返回 'Borough105' > 'Borough006'
。
16.2.2.3. 使用条件设置表单元格的格式
条件格式设置可用于在属性表中突出显示您可能想要特别关注的要素,并使用要素的自定义条件:
几何学(例如,识别多部分要素、小面积要素或在定义的地图范围内...);
或字段值(例如,将值与阈值进行比较、标识空单元格、重复项等)。
您可以单击启用条件格式设置面板 Conditional formatting 表视图中“属性”窗口右上角的按钮(在窗体视图中未触发)。
新的面板允许用户添加新的规则来格式化呈现 :Guilabel:Field`或 |radioButtonOff| :Guilabel:`整行。添加新规则将打开一个表单以定义:
规则的名称;
一种条件,使用任何 expression builder 功能;
格式设置:可以从预定义的格式列表中选择,也可以根据如下属性创建:
背景和文本颜色;
图标的使用;
粗体、斜体、下划线或删除线;
字体。

图 16.69 属性表的条件格式设置
16.2.3. 与属性表中的要素交互
16.2.3.1. 选择要素
在表视图中,属性表中的每一行都显示了图层中唯一要素的属性。选择行会选择要素,同样,在地图画布中选择要素(如果是启用了几何图形的层)也会选择属性表中的行。如果在地图画布(或属性表)中选择的要素集发生更改,则属性表(或地图画布)中的选择也会相应更新。
可以通过单击行左侧的行号来选择行。 Multiple rows 可以通过按住 Ctrl 钥匙。一个 continuous selection 可以通过按住 Shift 键并单击行左侧的几个行标题。当前光标位置和所单击行之间的所有行都将被选中。通过单击表中的单元格移动属性表中的光标位置不会更改行选择。更改主画布中的选择不会移动属性表中的光标位置。
在属性表的表单视图中,要素默认由其显示的字段的值在左侧面板中标识(请参见 显示属性 )。可以使用面板顶部的下拉列表通过选择现有字段或使用自定义表达式来替换此标识符。您还可以从下拉菜单中选择对功能列表进行排序。
单击左侧面板中的某个值可在右侧面板中显示该要素的属性。要选择要素,需要在标识符左侧的正方形符号内单击。默认情况下,该符号变为黄色。与表视图中一样,您可以使用先前显示的键盘组合执行多个功能选择。
除了使用鼠标选择要素外,还可以使用属性表工具条中的工具根据要素的属性执行自动选择,例如(请参阅一节 自动选择 有关更多信息和使用案例,请参阅以下内容):
也可以使用选择要素 使用表单过滤和选择要素 。
16.2.3.2. 过滤功能
在属性表中选择要素后,您可能希望仅在表中显示这些记录。这可以通过使用 Show Selected Features 属性表对话框左下方的下拉列表中的项。此列表提供以下筛选器:
Show Selected Features -与使用相同 Open Attribute Table (Selected Features) 从 Layer 菜单或 Attributes Toolbar 或按下 Shift+F6
Show Features visible on map -与使用相同 Open Attribute Table (Visible Features) 从 Layer 菜单或 Attributes Toolbar 或按下 Ctrl+F6
Show Features with Failing Constraints -功能将被过滤,以仅显示失败的功能 constraints 。根据未满足的约束是硬的还是软的,失败的字段值分别显示在深色或浅橙色单元格中。
Show Edited and New Features -与使用相同 Open Attribute Table (Edited and New Features) 从 Layer 菜单或 Attributes Toolbar
Field Filter -允许用户根据字段的值进行筛选:从列表中选择一列,键入或选择一个值,然后按 Enter 以进行过滤。然后,只有匹配的要素
num_field = value
或string_field ilike '%value%'
表达式显示在属性表中。你可以查一下Case sensitive 对弦不那么宽容。
Advanced filter (Expression) -打开表达式构建器对话框。在其中,您可以创建 complex expressions 以匹配表行。例如,您可以使用多个字段筛选表。应用时,筛选器表达式将显示在表单底部。
:一条通向 saved expressions 经常用于过滤属性表。
此外,还可以 filter features using forms 。
备注
从属性表中过滤记录不会将要素过滤出图层;它们只是暂时从表中隐藏,可以从地图画布或通过删除过滤器进行访问。对于从图层中隐藏要素的过滤器,请使用 Query Builder 。
小技巧
Update datasource filtering with Show Features Visible on Map
出于性能原因,属性表中显示的要素在空间上仅限于画布打开时的范围(请参见 Data Source Options 有关使用方法),请选择 Show Features Visible on Map 在新画布上,范围更新空间限制。
16.2.3.3. 存储筛选器表达式
可以保存用于属性表过滤的表达式,以供将来调用。使用时 Field Filter 或 Advanced Filter (expression) 条目时,使用的表达式显示在属性表对话框底部的文本小部件中。按下按钮 Save expression with text as name 以将表达式保存在项目中。按下按钮旁边的下拉菜单可使用自定义名称保存表达式 (Save expression as... )。显示保存的表达式后,
按钮被触发,其下拉菜单允许您 Edit the expression 和姓名(如有的话),或 Delete stored expression 。
保存的筛选器表达式保存在项目中,并可通过 Stored filter expressions 属性表的菜单。它们不同于 user expressions ,由活动用户配置文件的所有项目共享。
16.2.3.4. 使用表单过滤和选择要素
单击 Filter/Select features using form 或按下 Ctrl+F 将使属性表对话框切换到表单视图,并将每个窗口小部件替换为其搜索变量。
从现在起,此工具功能类似于中所述的功能 按值选择要素 ,您可以在其中找到所有运算符和选择模式的说明。

图 16.70 按筛选器表单筛选的属性表
从属性表中选择/过滤要素时,存在 Filter features 允许定义和优化筛选器的按钮。它的使用会触发 Advanced filter (Expression) 选项,并在表单底部的可编辑文本小部件中显示相应的筛选器表达式。
如果已存在已过滤的要素,则可以使用 Filter features 纽扣。选项包括:
Filter within ("AND")
Extend filter ("OR")
要清除筛选器,请选择 Show all features 选项,或清除该表达式并单击 Apply 或按下 Enter 。
16.2.4. 对要素使用操作
用户有多种使用上下文菜单操作功能的可能性,例如:
Select all (Ctrl+A) the features;
使用复制剪贴板中单元格的内容 Copy cell content ;
Zoom to feature 而无需事先选择;
Pan to feature 而无需事先选择;
Flash feature ,在地图画布中高亮显示;
Open form :它将属性表切换为表单视图,并将焦点放在所单击的特征上。

图 16.71 复制单元格内容按钮
如果要在外部程序(如Excel、LibreOffice、Qgis或自定义Web应用程序)中使用属性数据,请选择一行或多行(S),然后使用 Copy selected rows to clipboard 按钮或按下 Ctrl+C 。
在……里面 Copy features as 下拉列表:
菜单,您可以定义粘贴到的格式纯文本,无几何图形,
纯文本、WKT几何图形、
GeoJSON
您还可以在此上下文菜单中显示操作列表。这是在 操作属性 有关操作的详细信息,请参阅。
标签。看见16.2.4.1. 将所选要素另存为新图层
所选要素可以保存为任何支持OGR的矢量格式,也可以转换为另一个坐标参考系(CRS)。在层的上下文菜单中,从 Layers 面板,请单击 要定义输出数据集的名称、其格式和CRS(请参见部分 从现有层创建新层 )。你会注意到的 已选中。也可以在该对话框中指定GDAL创建选项。
16.2.5. 编辑属性值
编辑属性值可以通过以下方式完成:
无论属性表是在表视图中还是在窗体视图中,都可以直接在单元格中键入新值。因此,改变是一个接一个细胞、一个特征一个特征地完成的;
使用 field calculator :在一行中更新可能已存在或将为多个要素创建的字段。它可以用来创建虚拟场;
使用快速字段 calculation bar :同上,但仅适用于现有字段;
或使用 multi edit 模式:连续更新多个要素的多个字段。
16.2.5.1. 使用字段计算器
这个 Field Calculator 按钮允许您根据现有属性值或定义的函数执行计算,例如,计算几何要素的长度或面积。结果可用于更新现有字段,或写入新字段(可以是 virtual 一)。
The field calculator is available on any layer that supports edit. When you click on the field calculator icon the dialog opens (see 图 16.72). If the layer is not in edit mode, a warning is displayed and using the field calculator will cause the layer to be put in edit mode before the calculation is made.
基于 Expression Builder 对话框中,字段计算器对话框提供了一个完整的界面,用于定义表达式并将其应用于现有或新创建的字段。要使用字段计算器对话框,必须选择是否要执行以下操作:
对整个图层或仅对所选要素应用计算
创建用于计算的新字段或更新现有字段。

图 16.72 字段计算器
如果选择添加新字段,则需要输入字段名称、字段类型(整数、实数、日期或字符串),如果需要,还需要输入总字段长度和字段精度。例如,如果选择的字段长度为10,字段精度为3,则表示在点之前有7位数字,小数部分有3位数字。
一个简短的示例说明了在使用 Expression 标签。我们想要计算以公里为单位的 railroads
QGIS样例数据集中的图层:
加载shapefile
railroads.shp
在QGIS中和新闻发布会上Open Attribute Table 。
集 Output field name 至
length_km
选择
Decimal number (real)
AS Output field type设置 Output field length 至
10
以及 Precision 至3
双击
$length
在 Geometry 分组以将几何图形的长度添加到字段计算器表达式框中(您将开始看到输出预览,最多60个字符,在表达式框下方随着表达式的汇编而实时更新)。通过键入以下命令来完成表达式
/ 1000
在字段计算器表达式框中,单击 OK 。您现在可以找到一个新的 length_km 属性表中的字段。
16.2.5.2. 创建虚拟领域
虚拟字段是基于动态计算的表达式的字段,这意味着只要基础参数发生更改,它的值就会自动更新。该表达式只需设置一次;您不再需要在每次基础值更改时重新计算该字段。例如,如果需要在数字化要素时评估面积或自动计算可能更改的日期之间的持续时间(例如,使用 now()
功能)。
备注
Use of Virtual Fields
虚拟字段在层属性中不是永久性的,这意味着它们仅在创建的项目文件中保存和可用。
只能在创建字段时将其设置为虚拟字段。在层属性对话框的字段选项卡中,虚拟字段被标记为紫色背景,以区别于常规物理字段或连接的字段。稍后可以通过按注释列中的表达式按钮来编辑它们的表达式。将打开一个表达式编辑器窗口,以调整虚拟字段的表达式。
16.2.5.3. 使用快速字段计算栏
虽然字段计算器始终可用,但仅当图层处于编辑模式时,属性表顶部的快速字段计算栏才可见。多亏了表达式引擎,它提供了更快的访问来编辑已经存在的字段:

图 16.73 快速字段计算栏
16.2.5.4. 编辑多个字段
与以前的工具不同,多重编辑模式允许同时编辑不同要素的多个属性。将图层切换为编辑时,可以访问多重编辑功能:
备注
与属性表中的工具不同,点击
选项为您提供了一个模式对话框来填充属性更改。因此,在执行之前需要选择功能。要编辑一行中的多个字段,请执行以下操作:
选择要编辑的要素。
在属性表的右侧,将显示选定要素的字段(和值)。每个字段旁边都会出现新的小部件,允许显示当前的多重编辑状态:
单击这些小部件中的任何一个都允许您设置字段的当前值或将其重置为原始值,这意味着您可以逐个字段回滚更改。
图 16.74 编辑多个要素的字段
对所需的字段进行更改。
点击 Apply changes 在左面板的上方消息文本或任何其他功能中。
更改将应用于 all selected features 。如果未选择任何功能,则会使用您所做的更改更新整个表格。修改将作为单个编辑命令进行。如此紧迫 Undo 将一次回滚所有选定要素的属性更改。
备注
多重编辑模式仅适用于自动生成的表单和拖放表单(请参见 自定义数据的表单 );它不受自定义用户界面表单的支持。
16.2.6. 创建一种或多对多关系
关系是数据库中经常使用的一种技术。其概念是不同层(表)的要素(行)可以属于彼此。
16.2.6.1. 引入1-N关系
例如,您有一个包含阿拉斯加所有区域的层(多边形),它提供了一些关于其名称和区域类型的属性,以及一个唯一的id(充当主键)。
然后,您将获得另一个点图层或表,其中包含有关位于区域中的机场的信息,并且您还希望跟踪这些机场。如果要将它们添加到Regions层,则需要使用外键创建一对多关系,因为大多数地区都有多个机场。

图 16.75 阿拉斯加地区有机场
1-N关系中的层次
QGIS并不区分表和矢量层。从根本上说,矢量层是一个带有几何体的表。因此,您可以将表添加为矢量层。若要演示1-n关系,可以将 regions
Shapefile和 airports
具有外键字段的shapefile (fk_region
)到层区域。这意味着,每个机场只属于一个区域,而每个区域可以有任意数量的机场(典型的一对多关系)。
1-N关系中的外键
除了机场属性表中已有的属性外,还需要另一个字段 fk_region
它充当外键(如果您有一个数据库,您可能希望对其定义一个约束)。
此字段FK_REGION将始终包含区域的ID。它可以被视为指向它所属地区的指针。您还可以设计一个定制的编辑表单进行编辑,QGIS负责设置。它可以与不同的提供者一起工作(所以你也可以用它来处理Shape和CSV文件),你所要做的就是告诉QGIS你的表之间的关系。
定义1-N关系
我们要做的第一件事是让QGIS了解层之间的关系。这是在 Relations 选项卡,然后单击 Add Relation 。
Name 将被用作标题。它应该是人类可读的字符串,描述关系的用途。我们会打给Say airport_relation 在这种情况下。
Referenced Layer (Parent) 也被视为父层的是具有指向的主键的层,因此在这里它是
regions
一层。您需要定义引用的图层的主键,因此它是ID
。Referencing Layer (Child) 也被视为子层的是具有外键字段的子层。在我们的例子中,这是
airports
一层。对于该层,您需要添加一个指向另一层的引用字段,因此这是fk_region
。Id 将用于内部目的,并且必须是唯一的。您可能需要它来构建 custom forms 。如果您将其保留为空,则会为您生成一个,但您可以自己指定一个,以获得更易于处理的一个
Relationship strength 设置父层和子层之间关系的强度。默认设置 Association 类型表示父层为 simply 链接到子级,而 Composition 类型允许您在复制父要素时还复制子要素,并且在删除要素时,子要素也会被删除,从而导致所有级别的级联(意味着...也被删除)。

图 16.76 添加区域和机场图层之间的关系
从 Relations 选项卡上,您也可以按 Discover Relation 按钮从所加载的层的提供程序中获取可用的关系。这对于存储在数据提供程序(如PostgreSQL或SpatiaLite)中的图层是可能的。
1-N关系的形式
既然QGIS知道了这种关系,它将被用来改进它生成的表单。因为我们没有更改默认的表单方法(自动生成),所以它只会在表单中添加一个新的小部件。因此,让我们选择图例中的层区域并使用识别工具。根据您的设置,该表单可能会直接打开,或者您必须选择在Actions下的标识对话框中打开它。

图 16.77 与机场相关的标识对话框区域
如您所见,分配给此特定区域的机场都显示在一个表中。还有一些按钮可用。让我们简单回顾一下它们:
这个
按钮用于切换编辑模式。请注意,它会切换AirPort层的编辑模式,尽管我们处于Region层的要素形式中。但该表表示的是机场层的功能。
这个
按钮使您可以数字化地图画布中的机场几何图形,并默认将新要素指定给当前区域。请注意,该图标将根据几何图形类型而变化。
这个
按钮将新记录添加到AirPort Layer属性表中,并默认将新要素分配给当前区域。几何图形可以在以后使用 Add part 数字化工具。
这个
符号打开一个新对话框,您可以在其中选择任何现有机场,然后将其分配给当前区域。如果您不小心在错误的区域创建了机场,这可能会很方便。
两个按钮
和
向右切换到 table view and form view 相关的子功能的。
如果您使用 Drag and Drop Designer 对于区域功能,您可以选择可用的工具。您甚至可以决定在添加新功能时是否打开新表单 Force hide form on add feature 选择。请注意,此选项意味着非空属性必须采用有效的缺省值才能正常工作。

图 16.78 用于配置区域-机场关系工具的拖放设计器
在上面的例子中,参考层有几何图形(因此它不只是一个字母数字表),所以上面的步骤将在没有相应几何特征的层属性表中创建一个条目。要添加几何图形,请执行以下操作:
如果您处理AirPort表,则会自动为 fk_region
字段(用于创建关系的字段),请参见 Relation Reference widget 。
在机场表单中,您将看到 按钮右侧的
fk_region
区域:如果您点击该按钮,将打开区域层的表单。此小部件允许您轻松、快速地打开链接的父功能的表单。

图 16.79 与地区相关的识别对话框机场
关系引用小部件还可以选择将父层的表单嵌入到子层中。它可以在 fk_region
字段,并选中 Show embedded form
选择。
如果您现在查看Feature对话框,您将会看到,区域的表单嵌入到Airport表单中,甚至会有一个组合框,允许您将当前机场分配给另一个区域。

此外,如果切换Airport图层的编辑模式, fk_region
字段还具有自动补全功能:在键入时,您将看到 id
Region层的字段。在这里,可以使用来数字化区域图层的面 按钮,如果您选择了该选项
Allow adding new features
在 机场层的菜单。
子层也可用于 按值选择要素 工具,以便根据其子层的属性选择父层的要素。
In 图 16.80, all the regions where the mean altitude of the airports is greater than 500 meters above sea level are selected.
您会发现表单中提供了许多不同的聚合函数。

图 16.80 选择具有子值的父要素
16.2.6.2. 引入多对多(N-M)关系
N-M关系是两个表之间的多对多关系。例如, airports
和 airlines
层次:一个机场接待几家航空公司,一家航空公司飞往几个机场。
此SQL代码在名为的PostgreSQL/PostGIS方案中创建N-M关系所需的三个表 locations 。您可以使用 pgAdmin 。Airways表存储了 airports
层和Airways表存储 airlines
一层。在这两个表中,为了清楚起见,几乎没有使用字段。这个 tricky 部分是 airports_airlines
桌子。我们需要它列出所有机场的所有航空公司(反之亦然)。这种类型的表称为 pivot table 。这个 constraints 在此表中,强制机场和航空公司只有在各自的层中都已存在时才能关联。
CREATE SCHEMA locations;
CREATE TABLE locations.airports
(
id serial NOT NULL,
geom geometry(Point, 4326) NOT NULL,
airport_name text NOT NULL,
CONSTRAINT airports_pkey PRIMARY KEY (id)
);
CREATE INDEX airports_geom_idx ON locations.airports USING gist (geom);
CREATE TABLE locations.airlines
(
id serial NOT NULL,
geom geometry(Point, 4326) NOT NULL,
airline_name text NOT NULL,
CONSTRAINT airlines_pkey PRIMARY KEY (id)
);
CREATE INDEX airlines_geom_idx ON locations.airlines USING gist (geom);
CREATE TABLE locations.airports_airlines
(
id serial NOT NULL,
airport_fk integer NOT NULL,
airline_fk integer NOT NULL,
CONSTRAINT airports_airlines_pkey PRIMARY KEY (id),
CONSTRAINT airports_airlines_airport_fk_fkey FOREIGN KEY (airport_fk)
REFERENCES locations.airports (id)
ON DELETE CASCADE
ON UPDATE CASCADE
DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT airports_airlines_airline_fk_fkey FOREIGN KEY (airline_fk)
REFERENCES locations.airlines (id)
ON DELETE CASCADE
ON UPDATE CASCADE
DEFERRABLE INITIALLY DEFERRED
);
除了PostgreSQL,您还可以使用GeoPackage。在这种情况下,这三个表可以使用
。在GeoPackage中没有架构,因此 locations 不需要前缀。中的外键约束 airports_airlines
不能使用创建表格 或 因此,它们应该使用 。GeoPackage不支持 ADD CONSTRAINT 语句,因此 airports_airlines
应该分两步创建表:
仅将桌子设置为
id
字段使用vbl.使用
,键入并执行以下SQL代码:ALTER TABLE airports_airlines ADD COLUMN airport_fk INTEGER REFERENCES airports (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED; ALTER TABLE airports_airlines ADD COLUMN airline_fk INTEGER REFERENCES airlines (id) ON DELETE CASCADE ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED;
然后在QGIS中,您应该设置两个 one-to-many relations 如上所述:
两国之间的关系
airlines
表和数据透视表;和第二个之间的
airports
表和数据透视表。
更简单的方法(仅适用于PostgreSQL)是使用 Discover Relations 在……里面 。QGIS将自动读取数据库中的所有关系,您只需选择所需的两个关系。请记住,首先要加载QGIS项目中的三个表。

图 16.81 关系和自动发现
如果您想要删除 airport
或者是一个 airline
,qgis不会删除中的关联记录(S) airports_airlines
桌子。如果我们指定权限,则此任务将由数据库执行 constraints 在创建数据透视表时,如当前示例所示。
备注
Combining N-M relation with automatic transaction group
您应该在中启用交易模式
当在这样的背景下工作时。QGIS应该能够在所有表(航空公司、机场和透视表)中添加或更新行(S)。最后,我们必须在 airports
和 airlines
层次感。对于第一个,我们应该选择 airlines (id) 选项,对于第二个选项, airports (id) 选择。

图 16.82 设置关系基数
现在可以使用以下命令将机场与航空公司(或航空公司与机场)相关联 Add child feature 或 Link existing child feature 在子表单中。一条记录将自动插入到 airports_airlines
桌子。

图 16.83 机场与航空公司的N-M关系
备注
vbl.使用 Many to one relation 基数
有时,以N-M关系隐藏数据透视表是不可取的。主要是因为关系中的某些属性只有在建立关系时才能具有值。如果您的表是图层(具有几何字段),激活 On map identification 选择权 ( )用于透视表中的外键字段。
备注
Pivot table primary key
避免在数据透视表的主键中使用多个字段。QGIS假定有一个主键,因此约束如下 constraint airports_airlines_pkey primary key (airport_fk, airline_fk)
不会奏效的。
16.2.6.3. 引入多态关系
多态关系是1-N关系的特例,其中单个引用(文档)层包含多个引用层的特征。这与正常关系不同,正常关系要求每个参考层都有不同的参考层。单个参考(文档)层是通过添加一个放射状的 layer_field
参考(文档)层中的列,用于存储标识被引用层的信息。在其最简单的形式中,引用(文档)层只会将被引用层的层名插入到该字段中。
更准确地说,多态关系是具有相同参考层但具有动态定义的参考层的一组正常关系。层的多态设置通过使用一个表达式来解决,该表达式必须匹配被引用层的一些属性,如表名、层ID、层名称。
想象一下,我们要去公园,想要拍摄不同物种的照片 plants
和 animals
我们在那里看到了。每种植物或动物都有多张与之相关联的图片,因此如果我们使用正常的1:N关系来存储图片,我们将需要两个单独的表, animal_images
和 plant_images
。这对两张桌子来说可能不是问题,但想象一下,如果我们想要分别为蘑菇、鸟类等拍摄照片。
多态关系解决了这一问题,因为所有参考要素都存储在同一个表中 documents
。对于每个要素,引用的图层都存储在 referenced_layer
字段和引用的要素ID referenced_fk
菲尔德。
定义多态关系
首先,让QGIS了解层之间的多态关系。这是在 Relations 选项卡上,然后单击 Add Relation 按钮,这样您就可以选择 Add Polymorphic Relation 新出现的下拉列表中的选项。

图 16.84 使用添加多态关系 documents
作为参照的层和 animals
和 plants
作为参考层。
Id 将用于内部目的,并且必须是唯一的。您可能需要它来构建 custom forms 。如果您将其保留为空,则会为您生成一个,但您可以自己指定一个,以获得更易于处理的一个
Referencing Layer (Child) 也被视为子层的是具有外键字段的子层。在我们的例子中,这是
documents
一层。对于该层,您需要添加一个指向另一层的引用字段,因此这是referenced_fk
。Layer Field 是引用表中的字段,用于存储作为此要素所属的引用表的求值的层表达式的结果。在我们的示例中,这将是
referenced_layer
菲尔德。Layer expression 计算为层的唯一标识符。这可以是图层名称
@layer_name
,层ID@layer_id
,图层的表名称decode_uri(@layer, 'table')
或任何可以唯一标识某一层的信息。Relationship strength 设置父层和子层之间生成的关系的强度。默认设置 Association 类型表示父层为 simply 链接到子级,而 Composition 类型允许您在复制父要素时还复制子要素,并且在删除要素时,子要素也会被删除,从而导致所有级别的级联(意味着...也被删除)。
Referenced Layers 也被视为父层的是那些主键指向的层,因此在这里它们将是
plants
和animals
层次感。您需要定义下拉列表中引用的图层的主键,因此它是fid
。请注意,有效主键的定义要求所有参照的图层都具有该名称的字段。如果没有这样的字段,则无法保存多态关系。
添加后,可以通过 Edit Polymorphic Relation 菜单项。

图 16.85 预览新创建的动物和植物的多态关系及其子关系。
上面的示例使用以下数据库架构:
CREATE SCHEMA park;
CREATE TABLE park.animals
(
fid serial NOT NULL,
geom geometry(Point, 4326) NOT NULL,
animal_species text NOT NULL,
CONSTRAINT animals_pkey PRIMARY KEY (fid)
);
CREATE INDEX animals_geom_idx ON park.animals USING gist (geom);
CREATE TABLE park.plants
(
fid serial NOT NULL,
geom geometry(Point, 4326) NOT NULL,
plant_species text NOT NULL,
CONSTRAINT plants_pkey PRIMARY KEY (fid)
);
CREATE INDEX plants_geom_idx ON park.plants USING gist (geom);
CREATE TABLE park.documents
(
fid serial NOT NULL,
referenced_layer text NOT NULL,
referenced_fk integer NOT NULL,
image_filename text NOT NULL,
CONSTRAINT documents_pkey PRIMARY KEY (fid)
);
16.2.7. 存储和获取外部资源
字段可以指向存储在外部存储系统上的资源。可以配置属性表单,使其充当外部存储系统的客户端,以便在用户需要时直接从表单存储和获取这些资源。
16.2.7.1. 配置外部存储
为了设置外部存储,您必须首先从矢量中配置它 attribute form properties 并选择 Attachment 小工具。

图 16.86 编辑给定字段的WebDAV外部存储
从 Attachment 小部件,您必须首先选择 Storage type :
Select Existing File :目标URL已存在。当您选择一个资源时,不会实现任何存储操作,只是使用URL更新属性。
Simple Copy :在文件磁盘目标(可以是本地或网络共享文件系统)上存储资源的副本,并使用副本的路径更新该属性。
WebDAV Storage :将资源推送到支持 WebDAV 协议,并使用其URL更新该属性。 Nextcloud , Pydio 或其他文件托管软件支持该协议。
AWS S3 :将资源推送到支持的服务器 AWS Simple Storage Service 协议,并使用其URL更新该属性。亚马逊Web服务和 MinIO 托管软件支持此协议。
然后,您必须设置 Store URL 参数,该参数提供需要存储新资源时使用的URL。可以使用 data defined override widget 以便根据特征属性具有特定值。
变量 @selected_file_path 可以在该表达式中使用,并表示用户所选文件的绝对文件路径(使用文件选择器或拖放)。
备注
使用 WebDAV 或 AWS S3 外部存储,如果URL以“/”结尾,则将其视为文件夹,并附加所选文件名以获得最终URL。
如果外部存储系统需要,可以配置一个 authentication 。
备注
要使用 AWS S3 外部存储,则必须使用 AWS S3 身份验证类型。
16.2.7.2. 使用外部存储
配置完成后,您可以使用按钮选择本地文件 ... 编辑要素的属性时。取决于配置的 storage type ,则文件将存储在外部存储系统上(除非 Select existing file 已选择),并且该字段将使用新的资源URL进行更新。

图 16.87 将文件存储到WebDAV外部存储
备注
如果用户在整个附件小部件上拖放文件,也可以达到相同的结果。
使用 Cancel 按钮中止存储过程。可以使用配置查看器 Integrated document viewer 因此,资源将自动从外部存储系统获取并显示在URL的正下方。以上内容
图标表示无法从外部存储系统获取资源。在这种情况下,更多详细信息可能会出现在 日志消息面板 。