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