SQL Server 地理数据库中的要素类
要素类是具有相同几何类型(点、线、面、多点、注记、尺寸或多面体)的地理要素集合。例如,可将表示某条铁路沿线所有车站的点存储于一个要素类中。而在另一个要素类中,可存储表示所有铁轨的线。
本主题介绍要素类在目录窗口、数据库管理系统 (DBMS) 和 XML 文档中的显示方式。
ArcGIS for Desktop 中的要素类
在 ArcGIS for Desktop 中可创建七种要素类:点、多点、线、面、注记、尺寸和多面体。
根据图标可在目录树中看出要素类的类型。下表显示了每种要素类的图标。
要素类图标 |
要素类类型 |
---|---|
点或多点 | |
线 | |
面 | |
注记 | |
尺寸 | |
多面体 |
在 Microsoft SQL Server 中,目录树中显示的要素类名称包括要素类所在数据库的名称、拥有该要素类的用户的名称以及要素类本身的名称。
例如,如果名为 parcels 的要素类为用户 sasha 所有,且其所在的地理数据库名为 geodata,则该要素类在目录树中的名称为 geodata.SASHA.PARCELS。
有关不同类型要素类的说明,请参见要素类基础知识。
存储在 Microsoft SQL Server 数据库中的要素类
SQL Server 数据库中的要素类可使用以下三种几何存储类型之一:二进制类型、Microsoft 几何类型或 Microsoft 地理类型。
所有要素类都有一个存储属性信息、对象 ID 和 Shape 字段的基表(又称业务表)。对象 ID 和 Shape 字段可以有不同的名称,但它们必须位于要素类的基表中。
注记和尺寸注记要素类的基表中另外还有一些必填字段。有关这些字段的列表,请参阅管理注记要素类属性和尺寸注记要素属性。
您会注意到,加载数据或创建地理数据库之后,数据库中将出现多个 i 表和存储过程。这些存储过程和 i 表用于为要素类生成要素 ID。i 表的名称中包含一个数字。此数字对应于 SDE_table_registry 表中要素类的 registration_id。不支持对这些表和存储过程进行编辑,强烈建议您不要进行此编辑操作。
使用 Microsoft 几何或地理类型存储在 SQL Server 数据库中的要素类
默认情况下,存储在 SQL Server 数据库中的地理数据库使用 Microsoft 几何存储类型来存储要素。还可以使用 Microsoft 地理存储类型。使用这些存储类型之一的要素类具有基表。基表中包含类型为 GEOMETRY 或 GEOGRAPHY 的列,用于存储要素类几何;不存在关联的要素表。
基表是用于存储属性的 DBMS 表,而且可通过添加空间列的方式实现空间化。基表名称为要素类的名称。
使用几何存储或地理存储的要素类表还具有关联的系统表(GDB_ITEMS、SDE_spatial_references、SDE_table_registry、SDE_column_registry、SDE_geometry_columns 和 SDE_layers)及关联的视图。
View a diagram of a feature class using SQL Server geometry or geography storage..
需要使用 Adobe Acrobat Reader 才能打开此文件。
虚线表示各列之间的隐含关系;实线表示各列之间明确定义的关系。
用于几何或地理要素类的视图 ST_SPATIAL_REFERENCE_SYSTEMS 和 ST_GEOMETRY_COLUMNS 不在图中显示,因为这些视图基于系统表 SDE_spatial_references 和 SDE_geometry_columns,而这些表已经包含在图中。
如果启用要素类存储 CAD 实体,则会为要素类创建端表,以存储 CAD 数据(例如曲线)。通过 ArcGIS for Desktop 创建的所有要素类均被设置为存储 CAD 实体。如果使用 ArcSDE 管理命令将数据导入或注册到 ArcSDE,则可指定是否可将 CAD 数据存储在生成的要素类中。要素类图也会显示 CAD 表 SDE_geometry42。表名中的 42 指的是 SDE_layers 表中要素类的 layer_id。
将 CAD 数据(例如实际曲线)添加到要素类之前,不会启用对 CAD 端表进行的连接。连接启用后,即使 CAD 数据已不存在,对要素类进行的查询也始终会包括 CAD 端表。
以二进制格式存储在 SQL Server 数据库中的要素类
SQL Server 内地理数据库中以二进制格式(ArcSDE 压缩二进制或 OGC 熟知二进制几何表示)存储的要素类由基表和相关联的要素表和空间索引表(如下所述)组成。
- 基表
基表是用于存储属性的 DBMS 表,而且可通过添加空间列的方式实现空间化。基表名称为要素类的名称。在上图中,基表为 PARCELS 表。
实施二进制方案时,基表中的空间列(上例中 PARCELS 表中的 SHAPE 字段)包含唯一引用空间数据的要素 ID。要素 ID 可将基表连接到要素表和空间索引表。
在空间化基表中定义数据库触发器可保持基表记录与要素表记录之间的关系。
所有非版本化的要素类基表都具有一个删除-更新触发器和一个插入触发器。插入触发器可确保基表中的空间列不包含重复值,而删除-更新触发器可对基表、要素表和空间索引表中空间列的活动进行管理。
对独立要素类或要素数据集中的要素类进行版本化时,会自动删除这些触发器。将要素类取消注册为版本时,将重新创建这些触发器。如果对其中一个触发器进行编辑,然后对要素类进行多版本化,则该触发器将被删除。
- 要素表 (F<layer_id>)
要素表用于存储每个要素的几何形状。该表通过 SDE_layers 表的 Layer_ID 列中的编号进行标识。基表和要素表之间的关系通过要素 ID(或 FID)来管理。此键由 ArcGIS 维护,并且对于空间列是唯一的。
要素表定义字段名
字段类型
描述
是否允许为空
fid
int
主键;连接要素表和基表的唯一 ID
NOT NULL
numofpts
int
定义要素的点数
NOT NULL
entity
smallint
存储在空间列中的几何类型(例如点、线或字符串)
NOT NULL
eminx
float
要素中的最小 x 值;与 eminy、emaxx 和 emaxy 共同定义要素的包络矩形
NOT NULL
eminy
float
要素中的最小 y 值;与 eminx、emaxx 和 emaxy 共同定义要素的包络矩形
NOT NULL
emaxx
float
要素中的最大 x 值;与 eminx、eminy 和 emaxy 共同定义要素的包络矩形
NOT NULL
emaxy
float
要素中的最大 y 值;与 eminx、eminy 和 emaxx 共同定义要素的包络矩形
NOT NULL
eminz
float
三维要素中的最小 z 值
emaxz
float
三维要素中的最大 z 值
min_measure
float
要素中的最小测量值
max_measure
float
要素中的最大测量值
area
float
几何面积
NOT NULL
len
float
几何长度或周长
NOT NULL
点
varbinarymax
包含定义几何的点坐标的字节流
插入或更新要素时,会自动重新计算范围和 numofpts 之类的列的值。
- 空间索引表 (S<layer_id>)
二进制实现的空间索引为空间索引表。它用于存储基于简单规则格网的形状参考。该表通过 SDE_layers 表的 Layer_ID 列中的编号进行标识。
空间索引将为每个形状和格网像元组合设立一个条目,以支持空间查询。分布在三个格网像元中的要素在表中包含三个条目。执行空间查询时,搜索区域内的格网像元会被标识出来,并将用于返回一列备选几何。
空间索引表定义字段名
字段类型
描述
是否允许为空
sp_fid
int
主键;连接空间索引表和基表的唯一 ID
NOT NULL
gx
bigint
空间索引格网 x 值
NOT NULL
gy
bigint
空间索引格网 y 值
NOT NULL
eminx
bigint
要素中的最小 x 值;与 eminy、emaxx 和 emaxy 共同定义要素的包络矩形
NOT NULL
eminy
bigint
要素中的最小 y 值;与 eminx、emaxx 和 emaxy 共同定义要素的包络矩形
NOT NULL
emaxx
bigint
要素中的最大 x 值;与 eminx、eminy 和 emaxy 共同定义要素的包络矩形
NOT NULL
emaxy
bigint
要素中的最大 y 值;与 eminx、eminy 和 emaxx 共同定义要素的包络矩形
NOT NULL
所有要素类基表都具有一个 DELETE-UPDATE 触发器和一个 INSERT 触发器。INSERT 触发器可确保基表中的空间列不包含重复值,而 DELETE-UPDATE 触发器可对基表、要素表和空间索引表中空间列的活动进行管理。对独立要素类或要素数据集中的要素类进行版本化时,会自动删除这些触发器。将要素类取消注册为版本时,将重新创建这些触发器。如果对其中一个触发器进行编辑,然后将要素类注册为版本,则该触发器将被删除。保持基表和要素表之间的参照完整性很重要。不应对要素表或空间索引表中的记录进行编辑。已向基表、要素表和空间索引表中添加了若干索引和约束,可确保引用的完整性得到保留。但是,将要素类转换为只加载 I/O 模式(可实现向要素类快速插入数据的一种状态)时,会将这些索引和约束移除。
将要素类转换回正常 I/O 模式(允许用户通过 ArcGIS 查询要素类的一种状态)时,会创建索引并启用约束。如果不能在基表的空间列或要素表的 FID 列构建唯一索引,则无法将要素类转换为正常 I/O 模式。如果基表的空间列中存在要素表的 FID 列中所不具有的值,也无法将要素类转换为正常 I/O 模式。这种情况下,会将对引起问题的基表记录的引用加载到 SDE_EXCEPTIONS 表。
- 与要素类关联的系统表
在数据库中,GDB_ITEMS 系统表是追踪地理数据库中数据集(例如要素类和栅格目录)的主表。
View a diagram of a feature class using binary storage in SQL Server..
注:需要使用 Adobe Acrobat Reader 才能打开此文件。
虚线表示各列之间的隐含关系;实线表示各列之间明确定义的关系。
GDB_ITEMS、SDE_table_registry、SDE_column_registry 和 SDE_layers 表中的数据库名称字段都包含相同的值,但是为了避免图过于凌乱,不会显示这些字段之间的隐含关系。同样,所有这些表中的所有者字段也都包含相同的值,但不会在图上绘制字段间的关系。
XML 文档中的要素类:
要素类在 DataElement 元素中进行定义。要素类的 DataElement 标签设置为 esri:DEFeatureClass 类型。要素类 DataElement 中还有定义要素类的其他元素,例如 Field、Domain、ConfigurationKeyword 和 SpatialReference 元素。
以下是 Parcels 要素类的 XML 文档的一小部分内容:
<DataElement xsi:type="esri:DEFeatureClass">
<CatalogPath>/V=dbo.DEFAULT/FC=geodata.SASHA.Parcels</CatalogPath>
<Name>geodata.SASHA.Parcels</Name>
<DatasetType>esriDTFeatureClass</DatasetType>
<DSID>22</DSID>
<Versioned>false</Versioned>
<CanVersion>true</CanVersion>
<ConfigurationKeyword/>
<HasOID>true</HasOID>
<OIDFieldName>objectid</OIDFieldName>
<Fields xsi:type="esri:Fields">
<FieldArray xsi:type="esri:ArrayOfField">
<Field xsi:type="esri:Field">
<Name>objectid</Name>
<Type>esriFieldTypeOID</Type>
<IsNullable>false</IsNullable>
<Length>4</Length>
<Precision>10</Precision>
<Scale>0</Scale>
<Required>true</Required>
<Editable>false</Editable>
<AliasName>OBJECTID</AliasName>
<ModelName>OBJECTID</ModelName>
</Field>
用于定义要素类的所有其他元素
</DataElement>