ArcSDE 如何使用 Oracle Spatial?
ArcSDE 支持 Oracle Spatial 或 Oracle Locator 在 Oracle 数据库中存储和管理几何。要使用它,必须为一个配置关键字的 GEOMETRY_STORAGE 参数指定 SDO_GEOMETRY。如果要在大部分时间使用 Oracle Spatial 几何存储,请为 DEFAULTS 配置关键字中的 GEOMETRY_STORAGE 参数指定 SDO_GEOMETRY。如果仅对某些数据集使用它,则在创建每个单独的数据集时使用 SDO_GEOMETRY 关键字。
在 ArcGIS 中使用 Oracle Spatial
首次安装 ArcSDE 组件时,ST_Geometry 是默认几何存储类型。通过 GEOMETRY_STORAGE 参数在 DBTUNE 表中定义 ArcSDE 存储的默认设置。
如果只是使用 Oracle 存储的空间类型存储某些要素类,可以在创建要素类时指定关键字 SDO_GEOMETRY。如果这样操作,创建的特定要素类将有一个 SDO_GEOMETRY 列。在 dbtune 文件中,出现的 SDO_GEOMETRY 关键字如下:
##SDO_GEOMETRY GEOMETRY_STORAGE "SDO_GEOMETRY" ATTRIBUTE_BINARY "BLOB" RASTER_STORAGE "SDO_GEORASTER" SDO_COMMIT_INTERVAL 1000 UI_TEXT "User Interface text description for SDO_GEOMETRY" COMMENT "Any general comment for SDO_GEOMETRY keyword" END
如果打算对大多数要素类使用 SDO_Geometry 存储类型,可以将默认 ArcSDE 几何存储更改为 Oracle Spatial 类型。
要更改默认几何存储,使用 sdedbtune 管理命令更改 DBTUNE DEFAULTS 关键字,将 GEOMETRY_STORAGE 参数从 ST_GEOMETRY 改为 SDO_GEOMETRY。将默认 GEOMETRY_STORAGE 设置更改为 SDO_GEOMETRY 后,默认情况下,ArcSDE 创建具有 SDO_GEOMETRY 列的要素类。
有关使用 sdedbtune 命令的详细信息,请参阅随企业级 ArcGIS Server 的 ArcSDE 组件一起安装的《ArcSDE 管理命令参考》。
ArcSDE for Oracle 支持许多不同的几何存储方案 - 可以在同一个数据库中一起使用这些不同的方案。虽然只能有一个默认几何方案,但可以使用不同的几何方案创建单个表。
现有 Oracle Spatial 表与 ArcSDE 配合使用的先决条件
ArcSDE 可以成功使用包含 SDO_GEOMETRY 列的表(由其他应用程序或使用 SQL 在外部创建,有时称为第三方表),只要这些表满足以下先决条件:
- 必须归注册此表的用户所有。
- 必须具有单个 SDO_GEOMETRY 列。
- 必须没有属于用户定义类型的其他列。
- 必须在视图 USER_SDO_GEOM_METADATA 中具有有效条目。
- 几何的类型必须单一(点、线或面)。几何可以为多部分 (multipart) 几何。
- 必须具有适合作注册行 ID 列的整数、唯一和非空列。
- 应具有空间索引。
- 应通过 Oracle 的几何验证测试;否则,访问这些几何可能造成意外结果。
- 所有空间记录必须在 SDO_ORDINATES 数组中具有非空有效数值。
互操作注意事项
一个常见的误解是,应用程序能够互操作只是因为他们支持相同的基础几何类型。但是,几何类型只是地理数据库以及其他 GIS 数据库方案的一个方面。还需要普遍了解规则、约束、方案和实现。将 Oracle Spatial 与 ArcSDE 和 ArcSDE 客户端配合使用时,还需要考虑以下几点:
ArcSDE 和 ArcGIS 不支持表中的多个几何列。
包含多个 SDO_GEOMETRY 列的表应通过只包含一个 SDO_GEOMETRY 列的视图进行访问。
要使用包含多个空间列的 Oracle Spatial 表中的数据,可以使用 SQL 创建空间视图。此视图应该只包含一个空间列。接着使用 sdelayer –o register 将空间视图注册到 ArcSDE。
要了解如何创建和注册只包含一个 SDO_GEOMETRY 列的视图,请参阅知识库文章创建 Oracle Spatial 图层的 Oracle 视图(包含多个几何列)并注册到 ArcSDE。
ArcSDE 和 ArcGIS 仅支持 SDO_GEOMETRY 列中的单一几何类型。
如果表中的单个 SDO_GEOMETRY 列包含多个几何类型(例如,一些记录是点,一些记录是面),则该表不能注册到 ArcSDE 或地理数据库;要素类必须注册为只包含一个几何类型。
Oracle Spatial 不一定对 SDO_GEOMETRY 列强加几何类型约束。没有此强制措施,一些应用程序可能试图支持单一几何类型约束,但另一些应用程序可能会插入不同几何类型。从 Oracle9i 开始提供一个选项,使用空间索引创建参数对插入表的几何类型进行约束。早前版本 Oracle 还有一个强加几何类型约束的方法,即创建检查 SDO_GEOMETRY GTYPE 属性的插入-更新触发器。
ArcSDE 和 SDO_GEOMETRY 的几何验证不相同。
ArcSDE 会在插入或更新几何时对几何进行验证。在 Oracle 10g 中,如果使用 ArcSDE 客户端以外的方法(如 SQL)插入或更新几何,则插入或更新 SDO_GEOMETRY 值时,Oracle Spatial 本身不会自动强制执行几何验证。在 Oracle 11g 中,Oracle Spatial 在插入索引时验证几何。
如果将不合法的或格式设置不正确的几何值传送到 ArcSDE 客户端应用程序,就会产生问题。为减少这些潜在问题的出现次数,应该验证通过除了 ArcSDE 客户端应用程序之外的任何其他方法创建或更改的所有几何。
在 ArcSDE 9.1 中,不验证 SDO_GEOMETRY 要素,因为这些要素是从数据库提取的。进行此更改旨在提高提取性能。
从 ArcSDE 9.2 开始,提取 shape 时进行验证,但只是在 ArcSDE 外创建空间表然后注册到 ArcSDE 时。如果使用 ArcGIS 或 ArcSDE API 创建图层,提取 shape 时不进行验证。
有两个工具可用于验证几何。Oracle 的 VALIDATE_GEOMETRY_WITH_CONTEXT 使用 Oracle 的 shape 验证规则检查几何,而 sdelayer –o feature_info 使用 ArcSDE 规则检查几何。feature_info 操作可以选择包括有关 shape 的几何对 ArcSDE 是否有效的信息作为输出的一部分。有关如何使用此操作的详细信息,请参阅 ArcSDE 安装中包括的《管理命令参考》文档。
ArcSDE 几何验证与 Oracle Spatial 几何验证不同。虽然几何通过 Oracle Spatial 验证非常重要,但是使用 Oracle 的验证例程成功验证几何并不保证 ArcSDE 将成功验证几何。
可以创建用于触发 SDO_VALIDATE 函数的插入-更新触发器,以便强制执行 SDO_GEOMETRY 类型的验证。
即使要素未能通过 ArcSDE shape 验证,也可以使用 ArcSDE C API 编写检索这些要素的应用程序。但是,之后需要由客户端应用程序决定几何是否合适或者如何修复。
大多数读取 SDO_GEOMETRY 对象的应用程序不能解释由其他应用程序创建的 SDO_ETYPE 0 数据。
Oracle Spatial 允许应用程序将特定于应用程序的数据插入 SDO_GEOMETRY 对象。应用程序通过使用 SDO_ETYPE 值 0 嵌入其数据来完成此操作。这为应用程序提供非常大的灵活性,可以存储许多类型的非传统几何和其他数据。但是,特定于应用程序的数据的意义只是对生成特殊 SDO_GEOMETRY 对象的应用程序重要。在互操作环境中,无法可靠支持此类特定于应用程序的数据。读取 SDO_GEOMETRY 对象的应用程序会无法解释由其他应用程序创建的 SDO_ETYPE 0 数据。更新 SDO_GEOMETRY 对象的应用程序会无法编辑或保留 SDO_ETYPE 0 数据。
读取包含 SDO_ETYPE 0 元素的 SDO_GEOMETRY 对象时,ArcSDE 忽略 SDO_ETYPE 0 数据,只将支持的简单要素几何元素传送到应用程序。
更新包含 SDO_ETYPE 0 元素的 SDO_GEOMETRY 对象时,ArcSDE 不保留 SDO_ETYPE 0 数据。因此,需要保留 SDO_ETYPE 0 数据的应用程序应该禁止用户拥有表的 UPDATE 权限。
ArcSDE 要求一列中的所有 SDO_GEOMETRY 值在同一个坐标参照系中。
如果未定义坐标参照,SRID 值应为空值,如《Oracle Spatial 用户指南和参考》中所述。
在 Oracle9i 之前,Oracle Spatial 不自动对插入或更新 SDO_GEOMETRY 值强制执行空间参考 ID 验证。要强制验证这些早期 Oracle 实例的 SDO_GEOMETRY 类型,可以创建用于触发 SDO_VALIDATE 函数的插入-更新触发器。Oracle Spatial 要求,每个几何中的 SRID 必须互相匹配,并且必须与空间元数据中的 SRID 匹配,即使此值为空值。
Oracle Spatial 和 ArcSDE 都假设 SDO_GEOMETRY 的第一个和第二个维度分别为 x 和 y。
如果 SDO_GEOMETRY 对象有三个维度,在第三个维度的维度名称(在空间元数据中)以字母“m”开头时,ArcSDE 将第三个维度解释为测量,否则假设第三个维度是高程。可以控制 ArcSDE 如何解释第三个维度,方法是设置要素类的实体标记使其含有高程或测量。
Oracle9i 版本 2 扩展了 SDO_GEOMETRY 类型的 SDO_GTYPE 成员,允许对哪个维度包含测量纵坐标进行编码。四位数 SDO_GTYPE 的第二位数可以是 0、3 或 4。如果此位数是 3 或 4,则此位数指示哪个维度包含测量纵坐标。ArcSDE 9 及更高版本读取此编码。否则,如果 SDO_GEOMETRY 对象有四个维度,则将测量解释为最后一个纵坐标。
在此示例中,sdelayer 将要素类的实体类型设置为存储线串和高程:
sdelayer –o add –e l3
在此示例中,sdelayer 将要素类的实体类型设置为存储线串和测量:
sdelayer –o add –e lM
Oracle Spatial(并非 Oracle Locator)提供使用测量值进行线性参考系 (LRS) 计算的函数。
Oracle Spatial LRS 函数要求,几何中的所有测量值单纯按升序或降序排列,没有 NaN 值。Oracle Spatial LRS 还限制测量值只能为线串。
ArcSDE 允许对所有几何类型执行测量和 LRS 计算,并支持随意排序测量值和 NaN 值。
如果打算使用 Oracle Spatial LRS 函数,请确保设计应用程序和数据库在 Oracle Spatial LRS 约束中进行操作。
ArcSDE 需要空间表中有唯一要素标识符以执行空间查询、日志文件查询、单行操作和多版本化数据库操作。
利用 ArcSDE 压缩二进制方案,几何列可担当此用途。因为几何列是插入要素表的外键,并定义为非空唯一整数值。SDO_GEOMETRY 不包括唯一标识值,因此,ArcSDE 将 SDO_GEOMETRY 列添加到现有表时,可能同时还添加唯一标识列。此列是注册行 ID 列。此列通常命名为 OBJECTID,但也可以使用其他名称。也可以使用现有列作为注册行 ID 列,只要此列已建立索引并且是整数、UNIQUE 和 NOT NULL。由 ArcSDE 维护的注册行 ID 列必须为 NUMBER(38) UNIQUE NOT NULL。
可以使用 sdetable 管理命令或 ArcCatalog 应用程序添加注册行 ID 列。许多应用程序(如 ArcGIS)要求每个表或每个要素类都有注册行 ID 列。每个应用程序都有自己的要求和限制。
对参与网络、拓扑、关系或约束的 Oracle Spatial 要素类的修改应该仅限于 ArcGIS 应用程序。
ArcGIS 可以从使用 SDO_GEOMETRY 类型的简单要素类创建和维护网络和集成拓扑要素类。ArcGIS 跨许多不同数据源强加关系和约束。ArcGIS 管理关系和维护数据的拓扑完整性;通过 ArcGIS 对基础要素的修改反映在这些集成网络、拓扑和关系中。
对参与网络、拓扑、关系和约束的 Oracle Spatial 要素类的修改应该仅限于 ArcGIS 应用程序。其他应用程序可以自由读取数据,但它们编辑的内容不会正确反映在地理数据库中。