Oracle 中的 ST_Geometry 存储类型
ArcSDE for Oracle 提供了一种几何存储类型,该类型可通过符合国际标准化组织 (ISO) 和开放地理空间联盟 (OGC) 标准的结构化查询语言 (SQL) 来访问地理数据库。通过向表示地理要素的对象(点、线及面)提供存储空间,此存储类型扩展了 Oracle 数据库的功能。此存储类型旨在充分利用 Oracle 数据库资源;可与 Oracle 数据库要素(如复制与分区)兼容;可快速访问空间数据。此外还可将空间数据与其他类型的商业数据进行集成,因此多用户数据库可通过将地理组件添加到分析和数据产品而从中受益。将空间数据与其他业务对象一起存储还可简化数据的多用户访问、管理并增强安全性,因为这样做减少了要管理的数据存储资源。
在 ArcGIS 9.3 及更高版本中,默认情况下,新的 Oracle ArcSDE 地理数据库将使用 ST_Geometry 空间类型进行几何存储。该数据库遵循用户定义数据类型 (UDT) 的 SQL 3 规范,用于创建可存储空间数据(如地标、街道或土地宗地的位置)的列。有关 ST_Geometry 空间类型的说明,请参考本主题的“ST_Geometry 如何存储空间数据”一节。
要在 Oracle DBMS 中安装 ArcSDE 并使用 ST_Geometry 类型和域索引,必须授予 ArcSDE 管理员用户正确的系统权限来实例化类型、运算符及存储过程。有关所需权限的信息,请参阅 Oracle 中地理数据库 (geodatabases) 的用户权限。
在 Oracle 的 ArcSDE 地理数据库中使用 ST_Geometry 空间类型,可通过 SQL 函数访问空间数据,这些函数实现了“ISO SQL/MM 空间标准”及 OGC 的“简单要素规范”。您便可以使用 SQL 命令像处理任何其他类型的数据那样存储、检索及操作空间要素。通过 SQL 命令及存储过程可使用一长串标准化的函数来检索和分析空间数据。通过 SQL 访问数据,用户便可以使用其他应用程序来访问在 Oracle 的 ArcSDE 地理数据库中创建的数据。
Oracle XA 事务不支持 ST_Geometry 类型。
要使用 SQL 访问 Oracle 中使用空间类型的地理数据库,就必须配置“Oracle 侦听器”。有关详细信息,请参阅配置 Oracle 侦听器以使用 SQL。
在 ArcGIS 9.3 及更高版本中,新的 Oracle ArcSDE 地理数据库要求所有 ST 函数和运算符都必须与 sde 方案名连用才能生效。例如,若使用 ST_Union 运算符执行某项查询,则该运算符必须以“sde.ST_Union”的形式输入。ArcSDE 9.2 或更低版本升级的地理数据库不必按此步骤操作。
要通过 SQL 访问空间要素,则需要将 ST_Geometry 函数库与“Oracle 数据库管理系统 (DBMS)”安装在同一台服务器上。若希望在不同于 ArcSDE 的服务器上运行 Oracle DBMS,则请确保 Oracle 服务器的操作系统同样支持 ArcSDE,并确定已在其中安装了 ST_Geometry。
ST_Geometry 如何存储空间数据
以下是有关 ST_Geometry 的 Oracle 描述:
名称 |
类型 |
---|---|
ENTITY |
NUMBER(38) |
NUMPTS |
NUMBER(38) |
MINX |
FLOAT(64) |
MINY |
FLOAT(64) |
MAXX |
FLOAT(64) |
MAXY |
FLOAT(64) |
MINZ |
FLOAT(64) |
MAXZ |
FLOAT(64) |
MINM |
FLOAT(64) |
MAXM |
FLOAT(64) |
AREA |
FLOAT(64) |
LEN |
FLOAT(64) |
SRID |
NUMBER(38) |
POINTS |
BLOB |
空间类型的属性表示以下信息:
- Entity:存储在空间列中的几何要素类型(线串、多线串、多点、多面、点或面),其值为从 st_geom_util 存储过程获得的位掩码。
- Numpts:定义几何的点数;对于多部分 (multipart) 几何,还包括各个部分之间的分隔符,每个分隔符对应一个点。
- Minx、miny、maxx、maxy:几何体的空间包络矩形
- Area:几何体的面积
- Len:几何体的周长
- SRID:包含几何体的标识符,该标识符将此几何体与在 ST_Spatial_References 表中的相关空间参考(坐标系)记录进行关联。
- Points:包含定义几何的点坐标的字节流
与其他对象类型一样,ST_Geometry 数据类型包含一个构造函数方法和多个函数。构造函数方法是一种可返回数据类型的新实例(对象)并设置其属性值的函数。
构造函数名与类型 (ST_Geometry) 名相同。在实例化 ST_Geometry 类型对象时,可调用其构造函数方法。例如:
CREATE TABLE hazardous_sites (name varchar2(128), location st_geometry);
以下是 ST_Geometry 存取器函数的调用示例,这些函数将单个 ST_Geometry 作为输入并以数字形式返回请求的属性值。
- ST_Area 成员函数返回几何的面积。
- ST_Len 返回几何的长度。
- ST_Entity 返回一个包含位掩码(该位掩码描述了实体类型)的数字。
- ST_NumPoints 返回定义几何的点(折点)数。
- ST_MinM、ST_MinX、ST_MinY 和 ST_MinZ 返回几何所需的最小坐标。
- ST_MaxM、ST_MaxX、ST_MaxY 和 ST_MaxZ 返回几何所需的最大坐标。
- ST_SRID 返回几何的空间参考标识符。
- Get_release 为静态成员函数,可内部应用于空间类型管理(即升级和修补程序)。
例如,以下查询可返回美国各个州的名称和面积。
SELECT name, st_area(geometry) FROM us_states ORDER BY name;
ST_LineString、ST_MultiLineString、ST_MultiPoint、ST_MultiPolygon、ST_Point 和 ST_Polygon 均为 ST_Geometry 的子类型(或子类)。ST_Geometry 及其子类型共享通用属性与函数。ST_LineString、ST_MultiLineString、ST_MultiPoint、ST_MultiPolygon、ST_Point 和 ST_Polygon 的构造函数定义是相同的。构造函数名与其构造的类型名相同。
由于 ST_Point 为有限对象(单一点值),因此还可通过以下方法进行创建。
本方法使用了坐标点与 SRID。
METHOD FINAL CONSTRUCTOR FUNCTION ST_POINT RETURNS SELF AS RESULT Argument Name Type In/Out Default? PT_X NUMBER IN PT_Y NUMBER IN SRID NUMBER IN SQL> INSERT INTO sample_pt VALUES (ST_Point (10, 20, 1) );
此方法允许用户指定坐标点和每个点的高程值。
METHOD FINAL CONSTRUCTOR FUNCTION ST_POINT RETURNS SELF AS RESULT Argument Name Type In/Out Default? PT_X NUMBER IN PT_Y NUMBER IN PT_Z NUMBER IN SRID NUMBER IN SQL> INSERT INTO sample_pt VALUES (ST_Point (10, 20, 5, 1) );
另外,ST_Point 的这种最新方法可将度量值指定为创建的点对象的一部分。
METHOD FINAL CONSTRUCTOR FUNCTION ST_POINT RETURNS SELF AS RESULT Argument Name Type In/Out Default? PT_X NUMBER IN PT_Y NUMBER IN PT_Z NUMBER IN MEASURE NUMBER IN SRID NUMBER IN SQL> INSERT INTO sample_pt VALUES (ST_Point (10, 20, 5, 401, 1) );
SP_GRID_INFO
SP_Grid_Info 可作为 ST_Geometry_Index 表中字段 GRID 的数据类型。它包含空间索引的格网级别信息。
SQL> desc sp_grid_info Name Null? Type GRID1 NUMBER GRID2 NUMBER GRID3 NUMBER
元数据模式
Oracle 的 ST_Geometry 类型和元数据表归 SDE 方案所有。此方案定义是元数据表的基表描述,此元数据表用于定义及描述列/表类型、空间索引(ST_Spatial_Index 域索引)和空间参考信息。所有类型与域索引类型的定义、包和元数据表都是在 SDE 方案中创建的。
由于对 ST_Geometry 的定义归 SDE 用户所有,因此若在数据库中存在包含 ST_Geometry 列的表,则切勿将 SDE 用户从数据库中删除。若删除,则会导致这些表不可访问。
正如在|《Oracle 应用程序开发人员指南》(Oracle's Application Developers Guide) 中所提到的,从数据库中删除某个用户时,已执行的某个 drop 语句为带有 FORCE 选项的 DROP TYPE。此语句可删除属于该用户的所有类型,以便能将该用户从数据库中删除。DROP TYPE FORCE 可删除所有类型,即使这些类型具有与其相关联的从属类型或表。完成删除之后,关联表将被标记为无效,表中的数据将呈现为无法访问状态。
有关以下 ST_Geometry 元数据表的描述,请参阅存储在 Oracle 中的地理数据库 (geodatabase) 的系统表:
- ST_COORDINATE_SYSTEMS
- ST_GEOMETRY_COLUMNS
- ST_GEOMETRY_INDEX
- ST_SPATIAL_REFERENCES
在 Oracle 中使用 ST_Geometry 存储创建要素类
用于要素类的几何存储类型由创建要素类时指定的配置关键字中的 GEOMETRY_STORAGE 设置来确定。
设置 ST_Geometry 为新要素类的默认存储类型
从 ArcGIS 9.3 开始,在 Oracle 的地理数据库中,ST_Geometry 即为要素类的默认存储类型。这意味着 DBTUNE 表中 DEFAULTS 关键字的 GEOMETRY_STORAGE 参数将被设置为 ST_GEOMETRY。
若要以 ST_Geometry 格式存储大量要素类数据,则将 DEFAULTS 关键字的 GEOMETRY_STORAGE 参数设置为 ST_GEOMETRY。
若地理数据库最初是使用 ArcGIS 9.3 之前版本创建的,并且现在希望默认情况下使用 ST_Geometry 存储类型创建所有新要素类,则此时必须更改 DBTUNE 表中 DEFAULTS 关键字下的 GEOMETRY_STORAGE 参数。将 GEOMETRY_STORAGE 参数设置为 ST_GEOMETRY。
使用 sdedbtune 管理命令更改 DBTUNE 设置。有关使用 sdedbtune 命令的详细信息,请参阅创建 DBTUNE 表后更改其内容及随 ArcGIS Server Enterprise 的 ArcSDE 组件提供的《ArcSDE 管理命令参考》。
针对部分要素类使用 ST_Geometry 存储
ArcSDE for Oracle 支持许多不同的几何存储方案 - 可以在同一个数据库中一起使用这些不同的方案。虽然只能有一个默认几何方案,但可以使用不同的几何方案创建各个表。
若只需将部分要素类存储为空间类型,则可将 DEFAULTS GEOMETRY_STORAGE 设置为不同的存储类型,然后在创建这些要素类时指定 ST_GEOMETRY 关键字即可。如果这样操作,则创建的特定要素类将具有一个 ST_Geometry 列。在 dbtune 文件中,出现的 ST_GEOMETRY 关键字如下:
##ST_GEOMETRY GEOMETRY_STORAGE "ST_GEOMETRY" ATTRIBUTE_BINARY "BLOB" RASTER_STORAGE "BLOB" ST_GEOM_LOB_STORAGE " STORE AS ( # TABLESPACE <tablespace_name> ENABLE STORAGE IN ROW CHUNK 8K RETENTION CACHE)" UI_TEXT "User Interface text description for ST_GEOMETRY" COMMENT "Any general comment for ST_GEOMETRY keyword" END
创建哪些数据库对象并将其存储在何处?
在使用 ArcGIS 创建使用 ST_Geometry 存储类型的要素类时,会创建三种数据库对象。在下表中列出了用于控制其存储的对象和 DBTUNE 参数:
数据库对象 | 存储参数 |
---|---|
包含 ST_Geometry 列的表 | B_STORAGE 参数定义表的存储类型。 ST_GEOM_LOB_STORAGE 参数定义表中 LOB 段的存储类型。 |
空间索引 | S_STORAGE 参数定义空间索引存储类型。 |
ObjectID 列的索引 | B_INDEX_ROWID 参数定义此索引的存储类型。 |
有关配置参数的详细信息,请参阅 Oracle DBTUNE 配置参数和下面的 LOB 存储一节。
设置 LOB 段的存储类型
可更改 DEFAULTS 关键字列表下的 ST_GEOM_LOB_STORAGE 参数。不过,在添加到 DEFAULTS 关键字时,不应该在参数定义中包含 LOB 段名。如果包含 LOB 段名,除非更改其名称值,否则创建第二个要素时会失败,这是因为针对给定的方案每个 LOB 段名都必须为唯一的。以下 ST_GEOM_LOB_STORAGE 参数示例不包含对象名,因而避免了在同一个方案内的名称冲突:
ST_GEOM_LOB_STORAGE " STORE AS ( ENABLE STORAGE IN ROW CHUNK 8K RETENTION CACHE)"
以下为 ST_GEOM_LOB_STORAGE 参数有效值的示例:
##ST_GEOMETRY GEOMETRY_STORAGE "ST_GEOMETRY" ATTRIBUTE_BINARY "BLOB" RASTER_STORAGE "BLOB" ST_GEOM_LOB_STORAGE " STORE AS (TABLESPACE TERRA_NDX ENABLE STORAGE IN ROW CHUNK 8K RETENTION CACHE)" UI_TEXT "User Interface text description for ST_GEOMETRY" COMMENT "Any general comment for ST_GEOMETRY keyword" END
##ST_GEOMETRY GEOMETRY_STORAGE "ST_GEOMETRY" ATTRIBUTE_BINARY "BLOB" RASTER_STORAGE "BLOB" ST_GEOM_LOB_STORAGE " STORE AS (ENABLE STORAGE IN ROW CHUNK 8K RETENTION CACHE)" UI_TEXT "User Interface text description for ST_GEOMETRY" COMMENT "Any general comment for ST_GEOMETRY keyword" END
正如在本节先前所述,若定义了 LOB 和 LOB 索引表空间名,则必须在创建每个要素类前更改这些值。若不按此要求执行,则创建后续要素类时将会失败,因为每个段名都必须是唯一的。
有关创建和维护 Oracle LOB 段的更多示例及详细信息,请在 ArcGIS 资源中心中搜索“LOB 段”,并过滤“文档 > 知识库”查找关于此主题的技术文章。