关于连接和关联表
大多数数据库的设计指导方针都倾向于将数据库组织成多个表 - 每个表关注一个特定的主题 - 而非一个包含所有必要字段的大型表。设置多个表可以避免数据库中的信息发生重复,因为只会将信息在一个表中存储一次。当需要当前表中未包含的信息时,可以将两个表关联起来。
例如,您可以从组织中的其他部门获取数据,购买商业上有价值的数据,或者从 Internet 下载数据。如果这些信息存储在表(如 dBASE、INFO 或地理数据库表)中,您就可以将其与地理要素关联,并在地图上显示这些数据。
ArcGIS 允许您通过一个公用字段(也称为键)将一个表中的记录与另一个表中的记录相关联。可通过多种方式进行此类关联,其中包括在地图中临时连接或关联表,或者在地理数据库中创建可以保持更长久关联的关系类。例如,可将宗地所有权信息表与宗地图层进行关联,因为它们共享一个宗地 ID 字段。
当连接两个表时,基于两个表的公用字段可以将属性从一个表追加到另一个表上。关联表定义两个表间的关系 - 这也基于公用字段 - 但并不把属性从一个表追加到另一个表;而是在需要时访问关联的数据。
连接表的属性
通常,根据在两个表中均可找到的字段值将数据表连接到图层。字段的名称可以不同,但数据类型必须相同;例如,必须将数字连接到数字,将字符串连接到字符串,依此类推。可以使用连接数据对话框(通过在 ArcMap 中右键单击某个图层来访问)或添加连接工具执行连接操作。
假设您已获取反映各国家人口百分率变化的数据,并想要根据此信息生成人口增长地图。只要人口数据存储在数据库的表中并且与您的图层共享公用字段,您就可以将其连接到地理要素,然后使用其他字段来符号化、标注、查询或分析该图层要素。
一对一和多对一关系
在 ArcMap 中连接表时,将在图层属性表和包含要连接的信息的表之间建立一对一或多对一的关系。下例说明了每个国家与国家人口数据变化之间的一对一的关系。也就是说,一个国家对应着一个人口变化。
下面是一个多对一的关系示例。假设您具有一个图层,其中按其土地利用类型来对每个多边形进行归类。图层属性表仅存储土地利用编码;在独立表中存储每个土地利用类型的全部类型描述。连接这两个表可建立一个多对一的关系,因为图层属性表中的许多记录都将连接到土地利用描述表中的同一记录。然后,当为您的地图生成图例时,就可以使用更多的描述文本。
如果您想要建立一个 1:M 关系的连接,在连接结果图层中将仅连接第一个匹配项。
按空间位置连接数据
当地图上的图层未共享公共属性字段时,可以使用空间连接将其连接起来,即根据图层中要素的位置连接两个图层的属性。
可以使用连接数据对话框(通过在 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 时,关联将被移除。
连接表所拥有的关联将不会受到连接的影响。但是,目标表或图层无法访问这些关联。
执行连接或取消连接从不会移除关系类。无论数据是包含在连接还是关联中,关系类都可以正常使用。