SDO_GEOMETRY 和 ArcGIS

在地理数据库中创建带有 SDO_GEOMETRY 存储的要素类时会发生以下情况:

创建了具有 SDO_GEOMETRY 列的表。

如果在 Oracle 的地理数据库中创建要素类时指定已将 GEOMETRY_STORAGE 参数设置为 SDO_GEOMETRY 的 DBTUNE 配置关键字,则 ArcGIS 针对 shape 字段使用 SDO_GEOMETRY 列。

以下示例要素类具有唯一标识符 (ObjectID) 字段、名称和人口属性以及 SDO_GEOMETRY shape 列。

Name数据类型是否允许为空

名称

VARCHAR2(32)*

POPULATION

NUMBER(11)

SHAPE

MDSYS.SDO_GEOMETRY

OBJECTID

NUMBER(38)

NOT NULL

注:

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

在 SDO_GEOMETRY 列上创建空间索引。

默认情况下,ArcGIS 会在要素类的 SDO_GEOMETRY 列上创建 R 树空间索引。ArcGIS 使用 Oracle 的 SDO_FILTER 函数在要素类上执行空间查询;因此,空间查询需要空间索引。

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

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

ArcGIS 创建包含 SDO_GEOMETRY 列的要素类时,所需的 Oracle Spatial 元数据记录会添加到 USER_SDO_GEOM_METADATA 视图中。此元数据包括表名称、SDO_GEOMETRY 列名称、空间参考 ID 和坐标维度信息。

使用 ArcGIS 删除要素类时,也会删除 Oracle Spatial 元数据。

指定坐标维度。

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

  • x 坐标是第一维。
  • y 坐标是第二维。
  • z 坐标是第三维(如果要素类被定义为具有高程)。
  • 如果要素类被定义为具有测量值,则 m 坐标为最后一维(第三维或第四维,具体取决于是否存在 z 坐标)。

填充 SDO_GEOMETRY 列。

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

  • 根据几何的实体类型创建由四位数字组成的 SDO_GTYPE。
  • 设置 SDO_SRID 类型。
  • 在相应的坐标参照系中写入坐标值。
  • 以 x、y、z 和 m 的顺序写入坐标值,仅当源 SE_SHAPE 对象中存在高程和测量坐标时定义高程和测量坐标。
  • 如果在源 SE_SHAPE 对象中存在高程和/或测量坐标,则使用高程和/或测量坐标存储所有坐标。
  • 如果几何中某些特定坐标包含未定义的高程或测量值,则将高程和测量坐标设置为 NaN(“不是数字”)。
  • 对于任何几何类型(而不仅仅是线串)都允许测量值。第一个和最后一个坐标不必包含测量值。
  • 不将测量值限制为升序或降序。
  • 将圆曲线写为 SDO_GEOMETRY 类型。
  • 将非圆弧(例如三次样条或贝塞尔)转换为直边线串,并将弯曲的制图表达存储在 SE_ANNO_CAD_DATA 中。
  • 在将要素写入数据库之前验证所有要素。
  • 使用 SDO_POINT 将单部分 x,y 或 x,y,z 点存储在 SDO_GEOMETRY 对象中。对于其他类型的点要素类,会将折点存储在 SDO_ORDINATE_ARRAY 中。
注:

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

向业务表中添加一个附加列以存储 CAD 和注记属性。

SDO_GEOMETRY 类型无法存储 ArcGIS 存储必定支持的所有类型的几何元素。ArcGIS 在创建或注册要素类时,会向业务表中添加一个名为 SE_ANNO_CAD_DATA 的列。以本主题第一部分中的要素类为例,业务表将包含以下列:

名称数据类型是否允许为空

NAME

VARCHAR2(32)*

POPULATION

NUMBER(11)

SHAPE

MDSYS.SDO_GEOMETRY

SE_ANNO_CAD_DATA

BLOB

OBJECTID

NUMBER(38)

NOT NULL

注:

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

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

  • 来自 ArcMap 的三次样条和贝塞尔曲线等参数对象
  • 来自 ArcGIS Spatial Analyst extension 的表面片

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

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

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