大多数数据库的设计指导方针都倾向于将数据库组织成多个表 - 每个表关注一个特定的主题 - 而非一个包含所有必要字段的大型表。设置多个表可以避免数据库中的信息发生重复,因为只会将信息在一个表中存储一次。当需要当前表中未包含的信息时,可以将两个表关联起来。
例如,您可能会从组织中的其他部门获取数据,向供应商购买具有商业价值的数据,或者直接从 Internet 下载数据。如果这些信息本身存储在表文件(如 dBASE、INFO 或地理数据库表)中,您就可以将其与地理要素相关联,而后在地图上显示这些数据。
ArcGIS 允许您通过一个公用字段(也称为键)将一个表中的记录与另一个表中的记录相关联。可通过多种方式进行此类关联,其中包括在地图中临时连接或关联表,或者在地理数据库中创建可以保持更长久关联的关系类。例如,可将宗地所有权信息表与宗地图层进行关联,因为它们共享一个宗地 ID 字段。
当对两表进行连接时,基于两个表的公用字段可以将属性从一个表追加到另一个表上。关联表也用于定义两个表间的关系 - 这也基于公用字段 - 但并不把属性从一个表追加到另一个表;而是在需要时访问关联的数据。
连接表的属性
通常,会根据在这两个表中均可找到的字段值将数据表连接到图层。这一字段的名称可以不同,但数据类型必须相同;例如,必须将数字连接到数字,将字符串连接到字符串,依此类推。可以使用连接数据对话框(通过在 ArcMap 中右键单击某个图层来访问)或添加连接工具执行连接操作。
假设您已获取反映各国家人口百分率变化的数据,并想要根据此信息生成人口增长地图。只要人口数据存储在数据库的表中并且与您当前图层共享公用字段,您就可以将其连接到地理要素,然后使用其他字段来符号化、标注、查询或分析该图层要素。
一对一和多对一的关系
在 ArcMap 中连接表时,将在图层属性表和包含要连接的信息的表之间建立一对一或多对一的关系。下例说明了每个国家与其国家人口数据变化之间的一对一的关系。也就是说,一个国家对应着一个人口变化。
下面是一个多对一的关系示例。假设您有一个图层,按其土地利用类型来对每个面要素进行归类。图层属性表仅存储土地利用编码;而独立表中存储了每个土地利用类型的全部类型描述。连接这两个表可建立一个多对一的关系,因为图层属性表中的许多记录都将连接到土地利用描述表中的同一记录。然后,当为您的地图生成图例时,就可以使用更多的描述文本。
一对多和多对多的关系
使用存在一对多或多对多关系的数据时,应使用关联或关系类来建立数据集之间的关系。但是,也可在这些情况下创建连接。在这种情况下创建连接时,会根据数据的来源,工具和其他特定图层设置的工作方式而存在差别。如果使用地理数据库数据创建连接,则返回所有匹配记录。如果使用 shapefile 或 dBASE 表等非数据库数据创建连接,则只返回第一条匹配记录。
这意味着,如果使用地理数据库数据创建了一对多或多对多连接,则在生成的报表中可以看到多条记录,每个匹配项对应一条记录。在符号化连接图层、标注、识别要素、生成图表和使用“查找”或“超链接”工具时,如果使用连接字段也可以看到多个匹配项。如果使用连接图层作为地理处理工具的输入或用在导出操作中,则将使用多条匹配记录。
按空间位置连接数据
当地图上的图层未共享公共属性字段时,可以使用空间连接将其连接起来,即根据图层中要素的位置连接两个图层的属性。
可以使用连接数据对话框(通过在 ArcMap 中右键单击某个图层来访问)或空间连接工具执行空间连接操作。
使用空间连接,您可以找到以下任意内容:
- 距其他要素最近的要素
- 要素内包括什么
- 什么与要素相交
- 落在每个面要素内的点数
按位置连接(或空间连接)将使用空间关联在所涉及的图层之间将一个图层中的字段追加到另一个图层。空间连接与属性和关系类连接不同,它不是动态连接,而是需要将结果保存到新的输出图层中。
可使用下述三种关联中的其中一种来执行空间连接:
- 将每个要素与最近的一个或多个要素匹配:在此关联中,您可以添加最近要素的属性或最近要素数字属性的一个聚合(最小、最大等)。
- 将每个要素与其所属的要素匹配:在此情况下,追加当前要素所属的要素的属性。例如,这种类似情况包括落在面要素内的点或者完全包含(也就是重叠)在其他线段内的线段。
- 将每个要素与其相交的一个或多个要素匹配:类似于上面提到的最近要素关联,您可以追加一个相交要素的属性或相交要素数值型属性的一个聚合。
对于每个点、面和线的组合,只有最常用的这些关联在连接对话框中才可用。但使用 VBA,可以执行基于任何关联的连接,并可以使用点、线或面要素图层的任何组合。
关联表
与连接表不同,关联表只是在两个表间定义一个关系。关联的数据不会像连接表那样附加到图层的属性表。但是,在使用此图层的属性时可以访问到关联的数据。
例如,如果您选择一个建筑,则可以查找此建筑的所有承租人。同样地,如果您选择一个承租人,则可以查找承租人所在的建筑(或者在多个购物中心的连锁店的情况下为若干建筑 - 多对多关系)。然而,如果您对这些数据上执行连接,ArcMap 将仅查找每个建筑的第一个承租人,而忽略其他承租人。
ArcMap 中定义的关联实质上与地理数据库中定义的简单关系类相同,只是前者是与地图一起保存而不是保存在地理数据库中。
如果数据存储在地理数据库中,并且定义了关系类,您可以直接使用这些关系类而无需在 ArcMap 中建立关联。当您将参与关系类中的一个图层添加到地图中时,该关系类将自动可用。请注意,当数据存储在一个地理数据库中时,要定义不同的多对多关系。一般情况下,如果在您的地理数据库中定义了关系类,则应该使用这些关系类而不是在 ArcMap 中创建新的关系类。
地理数据库中的关系类
关系类中存储了地理数据库中要素和记录之间的关联信息,这有助于确保数据的完整性。
连接与关联
以下为针对数据是选择连接还是关联的一般指导方针:
- 当两个表中的数据存在一对一或多对一的关系时,则可以连接这两个表。
- 当两个表中的数据存在一对多或多对多的关系时,则可以关联这两个表。
保存连接与关联
当您保存包含连接和关联的地图时,ArcMap 将保存两个属性表之间的连接方式定义,而不保存所连接的数据本身。下次打开地图时,不论是连接还是关联,ArcMap 都将通过从数据库中读取这两个表来重新建立二者之间的关系。这样,自上次查看地图上的关系后,在源表中所进行的任何更改都将自动包括并反映在地图上。
连接可存储在 ArcMap 文档或图层文件中。如果您打算在某个时候移动数据,则应该使用相对路径保存您的 ArcMap 文档。如果数据发生了移动,在打开文档后您可以修复表和图层,但除非目标表和连接表位于同一个目录或工作空间中,否则无法修复连接。如果使用相对路径保存文档,只要相对于数据移动的位置相应地移动文档,就可自动恢复表和图层的连接。
通过导出包含连接数据的图层,就可轻松制作该图层的永久磁盘副本。要导出图层,在“内容列表”中右键单击图层,将鼠标指向数据,然后单击导出数据。这样可以创建一个具有所有属性(包含连接字段)的新要素类。
结合使用连接、关联和关系类
如果既要对数据执行连接又要执行关联,则连接和关联的创建顺序将非常重要。如果您的图层或表包含关联,则当该图层或表与数据建立连接时,关联将被移除。如果在连接的图层或表上执行关联操作,则当移除连接时关联也会被移除。作为一般的经验规则,最好先创建连接然后再添加关联。
假设要将 tableA 连接到 layerC 并将 tableB 关联到 layerC,有三种可能的操作方法,其中两种可行。下面分别介绍每种情况:
- 将 tableA 连接到 layerC,然后将 tableB 关联到 layerC:该情况可行。此操作以与 tableB 建立关联的连接图层结束。
- 将 layerC 关联到 tableB,然后将 tableA 连接到 layerC:该情况也可行。由于关联是双向的,因此无论关联隶属于哪个表,所涉及的这两个表都可以使用此关联。在这种情况下,tableB 拥有关联,因此当 tableA 连接到 layerC 时,关联不会被移除。
- 将 tableB 关联到 layerC,然后将 tableA 连接到 layerC:该情况不可行。这种情况与上述情况的不同在于 layerC 拥有关联。因此,当 tableA 连接到 layerC 时,关联将被移除。
连接表所拥有的关联将不会受到连接的影响。但是,目标表或图层无法访问这些关联。
执行连接或取消连接从不会移除关系类。无论数据是包含在连接还是关联中,关系类都可以正常使用。