创建关系类 (Data Management)
摘要
此工具可创建用于存储源表和目标表中字段或要素之间关联的关系类。
用法
-
可在空间对象(要素类中的要素)之间、非空间对象(表中的行)之间或空间对象与非空间对象之间建立关系。
-
一旦创建关系类,就无法进行修改;只能添加、删除或优化关系类的规则。与数据库中的任何其他对象的处理方式一样,可使用 ArcCatalog 删除和重命名关系类。
-
对于多对多关系类,会在数据库中创建一个新表,以存储用于将源类与目标类相关联的外键。此表还可包含其他字段以存储不属于源类或目标类的关系自身的属性。例如,在宗地数据库中,宗地与所有者之间可能具有关系类,其中所有者“拥有”宗地,同时宗地“归”所有者所有。该关系的属性可以是所有权的百分比。一对一和一对多关系类还可拥有属性;在这种情况下,会创建一个用于存储关系的表。
-
简单或对等关系将涉及两个或多个对象,而这些对象彼此独立地存在于数据库中。例如,在铁路网络中,可能存在拥有一个或多个相关信号灯的铁路交叉点。但是,铁路交叉点上可以没有信号灯,并且存在信号灯的铁路网络上也可以没有铁路交叉点。简单关系可拥有一对一、一对多或多对多基数。
-
在复杂关系中,一个对象的生存时间可控制其相关对象的生存时间。例如,电线杆支撑变压器,而变压器安装在电线杆上。删除电线杆后,删除消息即会被传递到与之相关的变压器,然后这些变压器将被从变压器要素类中删除。复合关系始终为一对多关系。
-
前向和后向路径标注用于在从一个对象导航到另一个对象时描述关系。前向路径标注用于在从源类导航至目标类时描述关系。在杆式变压器示例中,前向路径标注可以是“电线杆支撑变压器”。后向路径标注用于在从目标类导航至源类时描述关系。在杆式变压器示例中,后向路径标注可以是“变压器安装在电线杆上”。
-
也可在 ArcCatalog 中创建关系类。方法是:从地理数据库的快捷菜单中选择新建 > 关系类。
语法
参数 | 说明 | 数据类型 |
origin_table |
与目标表相关联的表或要素类。 | Table View |
destination_table |
与源表相关联的表。 | Table View |
out_relationship_class |
创建的关系类。 | Relationship Class |
relationship_type |
要在源表和目标表之间创建的关系类型。
| String |
forward_label |
用于在从源表导航至目标表时唯一识别关系的名称。 | String |
backward_label |
用于在从目标表导航至源表时唯一识别关系的名称。 | String |
message_direction |
消息在源表与目标表之间的传递方向。例如,在电线杆与变压器的关系中,当电线杆被删除时,会向与之相关的变压器对象发送一条消息,以告知它们该电线杆已被删除。
| String |
cardinality |
确定在源表的行或要素与目标表的行或要素之间存在多少种关系。
| String |
attributed |
指定关系是否具有属性。
| Boolean |
origin_primary_key |
与关系类表中的“源外键”字段相关联的源表中的字段(通常指 OID 字段)。 | String |
origin_foreign_key |
与源表中的“源主键”字段相关联的关系类表中的字段。 | String |
destination_primary_key (可选) |
与关系类表中的“目标外键”字段相关联的目标表中的字段(通常指 OID 字段)。 | String |
destination_foreign_key (可选) |
与目标表中的“目标主键”字段相关联的关系类表中的字段。 | String |
代码实例
以下 Python 窗口脚本演示了如何使用“创建关系类”工具。
import arcpy
arcpy.env.workspace = "C:/data/Habitat_Analysis.gdb"
arcpy.CreateRelationshipClass_management("vegtype", "vegtable", "veg_RelClass", "SIMPLE",
"Attributes from vegtable", "Attributes and Features from vegtype",
"NONE", "ONE_TO_ONE", "NONE", "HOLLAND95", "HOLLAND95")
在植被要素类与包含附加植被信息的表之间创建关系类。
# Name: CreateRelationshipClass.py
# Description: Create a relationship class between vegetation feature
# class and table with additional vegetation information
# Author: ESRI
# Import system modules
import arcpy
from arcpy import env
# Set environment settings
env.workspace = "C:/data"
# Copy vegtable.dbf to file gdb table, since both tables to be related
# must be in the same database
vegDbf = "vegtable.dbf"
vegTbl = "Habitat_Analysis.gdb/vegtable"
arcpy.CopyRows_management(vegDbf, vegTbl)
# Create simple relationship class between 'vegtype' vegetation layer
# and 'vegtable' table with additional vegetation information
veg = "Habitat_Analysis.gdb/vegtype"
relClass = "Habitat_Analysis.gdb/veg_RelClass"
forLabel = "Attributes from vegtable"
backLabel = "Attributes and Features from vegtype"
primaryKey = "HOLLAND95"
foreignKey = "HOLLAND95"
arcpy.CreateRelationshipClass_management(veg,
vegTbl,
relClass,
"SIMPLE",
forLabel,
backLabel,
"NONE",
"ONE_TO_ONE",
"NONE",
primaryKey,
foreignKey)
在宗地要素类与包含所有者信息的表之间创建关系类。
# Name: CreateRelationshipClass.py
# Description: Create a relationship class between parcels feature
# class and table with owner information
# Author: ESRI
# Import system modules
import arcpy
from arcpy import env
# Set environment settings
env.workspace = "C:/data"
# Copy owners.dat to file gdb table, since both tables to be related
# must be in the same database
ownerDat = "owners.dat"
ownerTbl = "Montgomery.gdb/owners"
arcpy.CopyRows_management(ownerDat, ownerTbl)
# Create simple relationship class between 'parcel' parcel layer
# and 'owner' table with additional parcel owner information
parcel = "Montgomery.gdb/Parcels"
relClass = "Montgomery.gdb/parcelowners_RelClass"
forLabel = "Owns"
backLabel = "Is Owned By"
primaryKey = "PROPERTY_ID"
foreignKey = "PROPERTY_ID"
arcpy.CreateRelationshipClass_management(ownerTbl,
parcel,
relClass,
"SIMPLE",
forLabel,
backLabel,
"BACKWARD",
"ONE_TO_MANY",
"NONE",
primaryKey,
foreignKey)