# 关系类
现实世界中的各种现象是普遍联系的,而联系本身也是一种特殊现象,具有多种表现形式。在面向实体的空间数据模型中,对象之间的联系被称作关系,是一种特殊的对象。
房屋所有者和房屋之间的产权关系,具有公共边界的行政区之间的相邻关系,甲乙双方之间的合同关系,都是对象之间关系的实例。
在该模型中,关系被分为空间关系和非空间关系。其中:
①空间关系与对象的位置和形态等空间特性有关,包括距离关系和拓扑关系。拓扑关系如水管和阀门的连接关系、两条道路的相交关系;
②非空间关系是对象属性之间存在的关系,如甲乙方之间的合同关系。
关系类是关系的集合,一般在对象类、简单要素类、注记类任意两者之间建立关系类。
空间关系是与实体的空间位置或形态引起的空间特性关系,包括距离关系和拓扑关系。其中拓扑关系包括分离、包含、相接、相等、相交、覆盖等九种。
非空间关系是对象的语义引起的对象属性之间存在的关系,如甲乙方之间的合同关系。,包括:关联、继承(完全、部分)、组合(聚集、组成)、依赖。非空间关系具有多重性:一对一1-1、一对多1-M、多对多N-M。
# 相关主题
# 创建关系类
创建关系类是对关系进行操作管理的第一步。MapGIS 10中提供可创建的关系有三种:关联关系、组合关系、继承关系。
创建一个完整、可用的关系类需要包括两大步:创建关系类→编辑关系。以下将逐一介绍MapGIS 10中的三种关系类的创建和编辑方法。
# 关联关系
关联关系也叫一般关系。如果多个对象之间互相独立,不存在依赖,则这种关系称为关联关系。关联关系有1-1、1-M和N-M的映射。
# 操作说明
1. 右键关系类文件夹,选择“创建”项,弹出关系类创建向导。
2. 关系类基本信息设置。在“关系类创建向导”的“基本信息”页面上填写关系名称,并选择关系类型为“关联关系”。在原始类列表和目标类列表中选择相互关联的原始类和目标类。系统将在目的数据中创建外键来与原始数据进行关联。完成设置,单击“下一步”。
3. 关系类常规属性设置。在“关系类创建向导”的“常规属性”页面上设置关系类的标签、通知类型、关系映射类型等信息。该页面上有一个“关系类属性化”选择框,可以勾选是否为关系类属性化,不勾选,单击“下一步”按钮,进入关键字设置页面;若勾选,左侧会增加“属性结构”页面,单击“下一步”进入属性结构设置。
- 【向前/向后标签】:标签分为前向标签和后向标签。这两个标签用于描述原始类和目的类之间的关系,例如:定义前向标签为“管理”,后向标签为“被管理”。
- 【通知类型】:通知是作用在原始类和目的类上的一个管理机制,它分为四种类型:不通知、向前通知、向后通知和互相通知。
- 【关系映射类型】:表示非空间关系的原始类和目的类对应关系的多重性,包括一对一1-1、一对多1-M、多对多N-M。
- 【关系类属性化】:属性化(表格化)的关系是指两对象间的关系还需要用额外的属性字段来表现它们间的联系,这种关系也需要建立独立的表格(关系表)。例如:在土地和所有者的关系中,若某个所有者只拥有某块土地20%的股份,对于这个属性,它既不能存在于所有者要素类中,也不能存在于土地要素类中,它是在两个要素类有了关系之后才存在,所以需要创建一个独立的表格,来存放这样的属性。N-M的关系需要独立的表格(关系表)来存储关系。
4. 属性结构设置。若在上一步骤勾选了“关系属性化”,则需要进行属性关系类属性结构设置。与创建简单要素类和对象类时的属性结构设置相同,可以在属性结构表单中手动创建属性字段,也可以通过“导入”按钮导入已存在的属性结构。完成属性结构设置,单击“下一步”。
5. 关键字设置。设置对象的外键关键字。有以下两种情况:
(1)当进行了关系类属性化设置之后,在关键字设置页面上,需要设置原始类和目的类的外键关键字。在如下图页面上,您只需要在相应的编辑框中输入关键字的名称,系统会自动在关系类属性表中为原始类和目的类创建对应名称的Int64型外键关键字。
(2)若上一步骤没有进行关键字属性化设置,那么在创建向导的“关键字设置”页面(如下图),可以通过“编辑”选项,为原始对象编辑外键关键字。需要注意的是外键关键字的类型必须是Int64型。完成关键字设置,单击“下一步”;
6. 信息确认。创建向导中的最后一页,列出了新建的关系类的所有信息,仔细查看确认信息,若信息有误,单击“上一步”,在相应的步骤位置进行修改;若确定信息无误,单击"完成"按钮完成关系类的创建。
提示:
1. 【关系类属性化】为新建的关系类创建一个属性结构,用以记录关系类中需要附加的字段。在关系类创建完成之后,在经过关系属性化的关系类的右键菜单中,可以对它的属性结构进行设置,而没有进行关系类属性化的关系则没有“属性结构设置”项。如下图所示;
2. 关系类可以指定属性或非属性化,但映射为M-N时,必须属性化。
3. 关系类外键关键字只能为Int64型字段;
# 组合关系
如果一个对象控制其它对象的生命,则这种关系称为组合关系。例如:电线杆(原始类)和变压器(目的类)属于一对多的组合关系,一旦电线杆被删除,一个删除消息就会发送给与它相关联的变压器,随之变压器也从其要素类中被删除。
组合关系的映射只能是1-1或1-M,且通知类型只包括向后通知(原始通知目的)和相互通知两种。
创建组合关系的创建向导和流程与创建关联关系时一致。
# 操作说明
1. 右键关系类文件夹,选择“创建”项,弹出关系类创建向导。
2. 关系类基本信息设置。在“关系类创建向导”的“基本信息”页面上填写关系名称选择关系类型为“组合关系”。在原始类列表和目标类列表中选择相互关联的原始类和目标类。应该注意的是,目标类会被“组合”到原始类上。完成设置,单击“下一步”。
3. 关系类常规属性设置。在“关系类创建向导”的“常规属性”页面上设置关系类的标签、通知类型、关系映射类型等信息。该页面上有一个“关系属性化”选择框,可以勾选是否为关系类属性化,不勾选,单击“下一步”按钮,进入关键字设置页面;若勾选,左侧会增加“属性结构”页面,单击“下一步”,则进入属性结构设置。
常规属性页面中相关的参数意义可参见“关联关系”中的相应内容。
4. 属性结构设置。若在上一步骤勾选了“关系属性化”,则需要进行属性关系类属性结构设置。与创建简单要素类和对象类时的属性结构设置相同,可以在属性结构表单中手动创建属性字段,也可以通过“导入”按钮导入属性结构。完成属性结构设置,单击“下一步”。
5. 关键字设置。设置对象的外键关键字。有以下两种情况:
(1)当进行了关系类属性化设置之后,在关键字设置页面上,需要设置原始类和目的类的外键关键字。在如下图页面上,您只需要在相应的编辑框中输入关键字的名称,系统会自动在关系类属性表中,为原始类和目的类创建对应名称的Int64型的外键关键字。
(2)若上一步骤没有进行关键字属性化设置,那么在创建向导的“关键字设置”页面(如下图),可以通过“编辑”选项,为原始对象编辑外键关键字。需要注意的是外键关键字的类型必须是Int64型。完成关键字设置,单击“下一步”;
6. 信息确认。创建向导中的最后一页,列出了新建的关系类的所有信息,仔细查看确认信息,若信息有误,单击“上一步”,在相应的步骤位置进行修改;若确定信息无误,单击"完成"按钮完成关系类的创建。
提示:
1. 创建组合关系时,“常规属性”中的通知类型只能选择原始对象通知目的对象,或原始对象与目的对象互相通知。
2. MapGIS支持对建立了组合关系的空间实体进行移动和旋转的联动操作。即对创建成功的组合关系进行编辑,添加关系,然后在地图编辑器中,对已经添加关系的源类进行移动或旋转,目的类也会随着移动或旋转。
# 继承关系
继承关系是指目的对象类继承原始对象类的某些或全部特性。继承关系分为部分继承关系和完全继承关系。继承关系通过子类继承父类的字段体现。
# 操作说明
1. 右键关系类文件夹,选择“创建”项,弹出关系类创建向导,该向导框与创建关联关系和组合关系的向导相同。
2. 关系类基本信息设置。在“关系类创建向导”的“基本信息”页面上填写关系名称,选择关系类型为“继承关系”。在原始类列表和目标类列表中选择相互关联的原始类和目标类,完成设置,单击“下一步”。
3. 关系类常规设置。在“关系类创建向导”的“常规属性”页面上设置通知类型、关系映射类型信息,完成常规属性设置,单击“下一步”。
4. 继承字段设置。在来自父类的可继承字段列表中,选择需要被继承的字段。注意,在成功创建了继承关系之后,选中的继承字段会自动添加到目的数据属性表中。完成设置,单击“下一步”。
5. 关键字设置。在创建向导的“关键字设置”页面,设置原始对象类和目标对象类的主关键字,并设置原始对象的外关键字,可以通过“编辑”按钮,为原始对象添加外键关键字。完成关键字设置,单击“下一步”;
6. 信息确认。创建向导中的最后一页,列出了新建的关系类的所有信息,仔细查看确认信息,若信息有误,单击“上一步”,在相应的步骤位置进行修改;若确定信息无误,单击"完成"按钮完成关系类的创建。
提示:
1. 继承关系中映射关系只有1—1和1—N两种,同时也没有关系类的属性化项。
2. 在选择继承字段时,不能是目的对象中已有的字段,否则关系创建不成功。
# 关系编辑
完成关系类的创建后,只是建立原始类和目的类关系的第一步,相当于只是在目的类中创建了与原始类相关联的外键,而这个外键并没有与原始类进行连接。关系编辑就是添加原始类和目的类之间对应的连接关系的操作。
您可以通过关系编辑界面,进行关系的添加和删除,以及关系的批量添加操作。
在关系编辑中,若您建立的关系是1—1的关系,那么在添加关系时,1个原始类要素只能连接一个目的类要素;若建立关系是1—N,那么添加关系时,一个原始类要素可以对应多个目的类要素;若建立的是M—N的关系,一个原始类可以连接多个目的类,一个目的类也可以连接多个原始类。
以下是详细的编辑操作说明:
一、逐条添加关系
# 操作说明
1. 右键关系类名称,选择“关系编辑”项,弹出“编辑关系”对话框。
2. 进行原始类和目的类的关系编辑。在关系源类中选中一个对象ID,在关系目的类中选中一个对象ID,然后点击右键,可以添加关系,或者对已经存在的关系删除。
如上图正在添加的组合关系表示:将目标类中OID为16的要素,组合到OID为2的要素中。添加这种关系之后,在目的类的属性表中每个元素的外键值就对应所组合到的原始类OID值。如下图:
二、批量添加关系
要进行关系的批量添加,要求原始类和目标类中有用以进行批量操作的匹配字段。匹配字段是原始和目标中具有相同数据类型的字段,系统会对匹配字段中值相同的记录自动添加关系。
您可以参考以下步骤进行批量关系的添加和编辑。
# 操作说明
1. 确认原始类和目的类中,有无相应的用以批量添加关系的匹配字段。若进行批量关系的添加前,原始类和目标类中,没有对应的匹配字段,那么,您或许需要进行以下的属性数据准备:
(1)为原始类新增一个字段,如LID,设置字段类型为短整型;同样,在目的类中增加相同名称的一个短整型字段。
(2)为匹配字段赋值。在原始类和目的类中,将需要在批量添加关系中进行关联的元素对应的匹配字段值赋上相同的值。如下图所示:
2. 用以建立目标类和原始类批量添加关系的字段已存在。在相应关系类的右键菜单中,选择“关系编辑”项,弹出关系编辑窗口,如下(以继承关系为例):
3. 点击【批量添加关系】按钮,弹出批量操作窗口(如下图)。你需要在对话框中选择原始类和目的类建立关系的连接字段,若字段下包含子类型,还可以选择相应的子类型的编码进行连接。
4. 在“批量添加关系”对话框中选择好连接字段后,点击"确定",系统执行批量添加关系的结果如图:
如下图为一个继承关系的目的类在批量添加了关系后的属性表。其中,FKey为原始类外键,添加关系后,FKey中的值对应原始类中的OID值;Name和Descripe项为目的类继承原始类的字段,其值对应原始类中的相应值。
# 关系类属性结构设置
若在创建关系类时,使用了关系类属性化(即编辑了关系类的属性结构)操作,那么在对应建立起来的关系类右键菜单中则会有“属性结构设置”项。
在关系类右键菜单中单击“属性结构设置”,就弹出属性结构编辑和浏览对话框,可以增加和删除字段,选择字段类型等信息。具体方法请参照简单要素类中属性管理章节的属性结构设置。
# 其他操作
# 预览关系类
查看创建好的关系类的信息。包括了名称、类型、原始类、目的类、映射类型和标签等信息。
右键要查看的关系类名称,选择“预览”项。内容视图中将显示相关的属性信息。
# 删除关系类
MapGIS GDBCatalog目录关系类文件夹下的右键功能。删除用户不需要的关系类。
右键要删除关系类名称,选择“删除”项,即完成了相应关系的删除。
提示:
请确保删除对应的关系类时,该类不在使用中,否则会使删除操作不成功。
# 复制关系类
系统提供了关系类的复制功能。您可以复制关系类图属信息(包括关系和与之相关的要素类信息),或复制关系类所在位置的URL。
右键要复制的关系类名称,选择“复制”或“复制URL”项,然后在目标位置右键,选择“粘贴”,完成关系类的复制。