创建带有 SDO_GEOMETRY 几何存储的要素类时会发生什么?

创建带有 SDO_GEOMETRY 存储的要素类时会发生以下情况:

向要素类的业务表中添加 SDO_GEOMETRY 列。

ArcSDE 通过向指定的业务表中添加一个几何列来创建要素类。如果将 GEOMETRY_STORAGE 参数设置为 SDO_GEOMETRY,ArcSDE 会向业务表中添加一个 SDO_GEOMETRY 列。

在以下示例中,业务表有 name 和 population 属性。添加几何列之后,业务表还会包含一个名为 Borders 的 SDO_GEOMETRY 列。必要时,还会添加和填充一个唯一要素标识符列(在本示例中为 OBJECTID)。

名称

数据类型

是否允许空值

名称

VARCHAR2(32)*

POPULATION

NUMBER(11)

BORDERS

MDSYS.SDO_GEOMETRY

OBJECTID

NUMBER(38)

非空

注意注意:

*如果使用 Unicode 字符串,则使用 NVARCHAR2(32),而非 VARCHAR2(32)。

可使用 ArcCatalog、sdelayer 管理工具或 ArcSDE C 和 Java API 将几何列添加到业务表中。

在 SDO_GEOMETRY 列上创建空间索引。

向业务表中添加 SDO_GEOMETRY 列时,通常会为此几何列创建一个空间索引。默认情况下,ArcSDE 会为 SDO_GEOMETRY 列创建 R 树索引。

ArcSDE 也可以创建不带任何空间索引的要素类;但是,只有创建了空间索引,才能进行空间查询。由 ArcSDE 使用的 Oracle 的 SDO_FILTER 函数要求必须存在空间索引。

可通过多种方式创建空间索引:在 ArcCatalog 中创建;使用 sdelayer 管理工具;使用 Oracle Spatial Index Advisor;使用 SQL;使用 ArcSDE C 和 Java API 进行编程。

每次在 LOAD_ONLY_IO 和 NORMAL_IO 模式之间切换要素类时,ArcSDE 就会自动删除并重新创建由 ArcSDE 创建的 Oracle 空间索引。当 ArcSDE 将要素类切换到 LOAD_ONLY_IO 模式时,由 Oracle Spatial Index Advisor 应用程序定义或使用 SQL 创建的空间索引不会被删除。

将一条记录添加到 Oracle Spatial 元数据视图。

当 ArcSDE 将 SDO_GEOMETRY 列添加到业务表时,它还会将所需的 Oracle Spatial 元数据记录添加到 USER_SDO_GEOM_METADATA 视图。此元数据包括表名称、SDO_GEOMETRY 列名称、空间参考 ID 和坐标维度信息。

如果使用第三方应用程序或 SQL 创建表、空间列和表的元数据并在随后将表注册到 ArcSDE,则在从 ArcSDE 取消对表的注册时 ArcSDE 将不会删除元数据。然而,ArcSDE 始终会在删除表时删除元数据,这与使用 sdetable -o delete 命令相同。

指定坐标维度。

可以 2D (x,y)、带有测量值的 2D、3D (x,y,z) 或带有测量值的 3D 形式创建 ArcSDE 几何。创建新要素类或向现有表中添加 SDO_GEOMETRY 列时,ArcSDE 会将 Oracle Spatial 维度信息置于元数据视图的 DIMINFO 列中。

根据坐标参考设置每个 SDO_GEOMETRY 值的 SRID。

Oracle Spatial 在 MDSYS.CS_SRS 表中提供了预定义的坐标参考。使用 ArcSDE 创建新要素类以为 SDO_GEOMETRY 列设置特定的 SRID 时,请找到相应的 Oracle Spatial 坐标参考描述,然后将要素类的 SDO_SRID DBTUNE 存储参数设置为该值。

例如:

#MY_SDO_KEYWORD GEOMETRY_STORAGE SDO_GEOMETRY SDO_SRID 8307 UI_TEXT "MY_SDO_KEYWORD" END

如果未设置 SDO_SRID 存储参数,ArcSDE 会将每个 SDO_GEOMETRY 值的 SRID 以及相应元数据记录中的 SRID 设置为 NULL。

ArcSDE 不需要 Oracle Spatial SRID。ArcSDE 会将每个要素类的坐标参考信息保存在自己的独立于 Oracle Spatial 的 SPATIAL_REFERENCES 表中。有关支持的坐标参考的信息,请参阅《Oracle Spatial 用户指南和参考》

填充 SDO_GEOMETRY 列。

在数据库中存储几何时,ArcSDE 会通过名为 SE_SHAPE 的 ArcSDE API 对象填充 SDO_GEOMETRY 值。SE_SHAPE 对象可以包含简单几何以及可能包括高程、测量值、CAD 数据、注记和表面片的复杂几何。SDO_GEOMETRY 数据类型支持这些几何属性的一部分。由于 SDO_GEOMETRY 和 SE_SHAPE 对象中的各个组成部分没有一对一映射关系,因此在将 ArcSDE 数据存储到 Oracle Spatial 表中时,ArcSDE 会遵守一组规则:

注意注意:

ArcSDE 不支持 SDO_GEOMETRY 对象中的异类几何集合,而且 ArcSDE 不会在 SDO_GEOMETRY 对象中编码 SDO_ETYPE 0 元素。SDO_ETYPE 0 元素是特定于应用程序的。

如果存储 CAD 和注记属性,则会向业务表中添加一个附加列。

SDO_GEOMETRY 类型无法存储 ArcSDE 存储必定支持的所有类型的几何元素。当需要存储这些元素时(由创建要素类时所指定的几何类型标记决定),ArcSDE 会向业务表中添加名为 SE_ANNO_CAD_DATA 的列。以本主题第一部分中的要素类为例,业务表现在将包含以下内容:

名称

数据类型

是否允许空值

名称

VARCHAR2(32)*

POPULATION

NUMBER(11)

BORDERS

MDSYS.SDO_GEOMETRY

SE_ANNO_CAD_DATA

BLOB

OBJECTID

NUMBER(38)

非空

注意注意:

*如果使用 Unicode 字符串,则使用 NVARCHAR2(32),而非 VARCHAR2(32)。

每当 ArcSDE 检测到数据源中含有 CAD 数据时,ArcSDE 就会将 CAD 数据的简单几何表示写入 SDO_GEOMETRY 值中并将未修改的 CAD 数据写入 SE_ANNO_CAD_DATA 值中。如果数据源中不含 CAD 数据,ArcSDE 会将 SE_ANNO_CAD_DATA 值设置为 NULL。SE_ANNO_CAD_DATA 属性包含来自大量 ArcGIS 组件的数据:

通过 Oracle Spatial 过滤函数对要素类执行空间查询。

ArcSDE 通过 Oracle Spatial SDO_FILTER 函数执行初级空间查询。ArcSDE 会基于应用程序所请求的空间关系执行 SDO_GEOMETRY 的二级过滤。

应用程序也可以将 Oracle Spatial 初级过滤和二级过滤函数包括在提供给 ArcSDE 的 SQL WHERE 子句中。在 WHERE 子句中使用空间过滤时,应用程序可以将空间查询分发到数据库服务器、ArcSDE 应用程序服务器和应用程序自身。


3/7/2012