创建带有 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 列中。
- x 坐标是第一维。
- y 坐标是第二维。
- z 坐标是第三维(如果要素类被定义为具有高程)。
- 如果要素类被定义为具有测量值,则 m 坐标为最后一维(第三维或第四维,具体取决于是否存在 z 坐标)。
根据坐标参考设置每个 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 会遵守一组规则:
- 根据几何的实体类型创建由四位数字组成的 SDO_GTYPE。
- 如果 DBTUNE 参数中未提供 Oracle Spatial 坐标参考,请将 SDO_SRID 设置为 NULL。
- 在相应的坐标参照系中写入坐标值。
- 以 x、y、z 和 m 的顺序写入坐标值,仅当源 SE_SHAPE 对象中存在高程和测量坐标时定义高程和测量坐标。
- 如果在源 SE_SHAPE 对象中存在高程和/或测量坐标,则使用高程和/或测量坐标存储所有坐标。
- 如果几何中某些特定坐标包含未定义的高程或测量值,则将高程和测量坐标设置为 NaN(“不是数字”)。
- 对于任何几何类型(而不仅仅是线串)都允许测量值。第一个和最后一个坐标不必包含测量值。
- 不将测量值限制为升序或降序。
- 如果要素类是使用 CAD 实体掩码 (c) 注册的,请将圆曲线写为 SDO_GEOMETRY 类型;否则,将曲线转换为增密的直边线串。
- 将非圆弧(例如三次样条或贝塞尔)转换为直边线串。如果要素类是使用 CAD 实体掩码 (c) 注册的,也会将弯曲的制图表达存储在 SE_ANNO_CAD_DATA 中。
- 在将要素写入数据库之前验证所有要素。验证规则在“ArcSDE 开发人员帮助”中进行了介绍。
- 使用 SDO_POINT 将单部分 x,y 或 x,y,z 点存储在 SDO_GEOMETRY 对象中。对于其他类型的点要素类,会将折点存储在 SDO_ORDINATE_ARRAY 中。
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 组件的数据:
- 来自 ArcSDE CAD 客户端的 AutoCAD 或 MicroStation 数据
- 来自 ArcMap 的三次样条和贝塞尔曲线等参数对象
- 来自 ArcMap Spatial Analyst 的表面片
- 来自 ArcInfo Workstation 的注记(ArcGIS 8 之前的版本)
通过 Oracle Spatial 过滤函数对要素类执行空间查询。
ArcSDE 通过 Oracle Spatial SDO_FILTER 函数执行初级空间查询。ArcSDE 会基于应用程序所请求的空间关系执行 SDO_GEOMETRY 的二级过滤。
应用程序也可以将 Oracle Spatial 初级过滤和二级过滤函数包括在提供给 ArcSDE 的 SQL WHERE 子句中。在 WHERE 子句中使用空间过滤时,应用程序可以将空间查询分发到数据库服务器、ArcSDE 应用程序服务器和应用程序自身。