Esri ST_Geometry 空间数据类型可用于包含和不包含地理数据库的 Oracle 数据库。此外还可将空间数据与其他类型的商业数据进行集成,因此多用户数据库可通过将地理组件添加到分析和数据产品而从中受益。将空间数据与其他业务对象一起存储还可简化数据的多用户访问、管理并增强安全性,因为这样做减少了要管理的数据存储资源。
Esri ST_Geometry 空间数据类型是 Oracle 地理数据库的默认几何存储类型。使用创建空间类型地理处理工具,还可在 Oracle 数据库中安装 ST_Geometry 类型。
要在 Oracle DBMS 中创建地理数据库并使用 ST_Geometry 类型和域索引,必须授予地理数据库管理员用户 (sde) 正确的系统权限来实例化类型、运算符及存储过程。有关所需权限的信息,请参阅 Oracle 中地理数据库的权限。要在 Oracle 数据库中安装 ST_Geometry 类型,还必须存在 sde 用户,并且必须授予其特定权限来实例化类型、运算符及存储过程。有关详细信息,请参阅向 Oracle 数据库添加 ST_Geometry 类型。
在 Oracle 或 Oracle 数据库的地理数据库中使用 Esri ST_Geometry 空间类型,可通过 SQL 函数访问空间数据,这些函数实现了“ISO SQL/MM 空间标准”及 OGC 的“简单要素规范”。您便可以使用 SQL 命令像处理任何其他类型的数据那样存储、检索及操作空间要素。通过 SQL 命令及存储过程可使用一长串标准化的函数来检索和分析空间数据。通过 SQL 访问数据,用户便可以使用其他应用程序来访问在 Oracle 中创建的数据。
要通过 SQL 访问空间要素,必须将 ST_Geometry 库安装在与 Oracle 实例相同的服务器上。确保 Oracle 服务器的操作系统受到 ST_Geometry 库的支持。
您还必须配置 Oracle extproc 以使用 SQL 来访问包含 ST_Geometry 空间类型的表。
ST_Geometry 如何存储空间数据
以下是有关 Oracle 中 ST_Geometry 的描述:
名称 | 类型 |
---|---|
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:定义几何的点数;对于多部分几何,还包括各个部分之间的分隔符,每个分隔符对应一个点。
- 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_Length 返回几何体的长度。
- 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, sde.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 (sde.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 (sde.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 (sde.ST_Point (10, 20, 5, 401, 1) );
元数据模式
Oracle 的 ST_Geometry 类型和元数据表归 sed 方案所有。此方案定义是元数据表的基表描述,此元数据表用于定义及描述列/表类型、空间索引(ST_Spatial_Index 域索引)和空间参考信息。所有类型与域索引类型的定义、包和元数据表都是在 sed 方案中创建的。
由于对 ST_Geometry 的定义归 sed 用户所有,因此若在数据库中存在包含 ST_Geometry 列的表,则切勿将 sed 用户从数据库中删除。若删除,则会导致这些表不可访问。
正如在《Oracle 应用程序开发人员指南》(Oracle Application Developer's Guide) 中所提到的,从数据库中删除某个用户时,已执行的某个 drop 语句为带有 FORCE 选项的 DROP TYPE。此语句可删除属于该用户的所有类型,以便能将该用户从数据库中删除。DROP TYPE FORCE 可删除所有类型,即使这些类型具有与其相关联的从属类型或表。完成删除之后,关联表将被标记为无效,表中的数据将呈现为无法访问状态。
有关以下 ST_Geometry 元数据表的描述,请参阅 Oracle 中的地理数据库的系统表:
- ST_COORDINATE_SYSTEMS
- ST_GEOMETRY_COLUMNS
- ST_GEOMETRY_INDEX
- ST_SPATIAL_REFERENCES
在 Oracle 中使用 ST_Geometry 存储创建要素类
在安装了 ST_Geometry 空间数据类型的数据库中,在创建要素类时指定 ST_Geometry 作为存储类型。
在地理数据库中,用于要素类的几何存储类型由创建要素类时指定的配置关键字中的 GEOMETRY_STORAGE 设置来确定。
设置 ST_Geometry 为新地理数据库要素类的默认存储类型
在 Oracle 的新地理数据库中,ST_Geometry 即为要素类的默认存储类型。这意味着 DEFAULTS 配置关键字的 GEOMETRY_STORAGE 参数被设置为 ST_GEOMETRY。
若使用 ArcGIS 9.3 之前版本创建的地理数据库已经升级,并且现在希望默认情况下使用 ST_Geometry 存储类型创建所有新要素类,则必须将 DEFAULTS 关键字下的 GEOMETRY_STORAGE 参数设置为 ST_GEOMETRY。有关说明,请参阅更改配置关键字。
针对部分地理数据库要素类使用 ST_Geometry 存储
Oracle 中的地理数据库支持许多不同的几何存储类型 - 可以在同一个数据库中一起使用这些不同的类型。虽然默认的几何存储类型只能有一种,但创建各表时允许使用不同的几何存储类型。
若只想要部分要素类使用 ST_Geometry 空间类型存储,则可将 DEFAULTS GEOMETRY_STORAGE 设置为不同的存储类型,并创建 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
添加关键字后,可在创建使用 ST_Geometry 数据类型存储的要素类时使用此关键字。例如,如果您有一个必须使用 SQL 访问的小数据子集,只需创建该要素类子集即可使用几何存储的 ST_Geometry 空间数据类型。
为要素类创建哪些数据库对象?
在使用 ArcGIS 创建使用 ST_Geometry 存储类型的要素类时,会创建三种数据库对象。在下表中列出了用于控制其存储的对象和配置参数:
数据库对象 | 存储参数 |
---|---|
包含 ST_Geometry 列的表 | B_STORAGE 参数定义表的存储类型。 ST_GEOM_LOB_STORAGE 参数定义表中 LOB 段的存储类型。 |
空间索引 | S_STORAGE 参数定义空间索引存储类型。 |
ObjectID 列的索引 | B_INDEX_ROWID 参数定义此索引的存储类型。 |
设置 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 索引表空间名,则必须在创建每个要素类前更改这些值。若不按此要求执行,则创建后续要素类时将会失败,因为每个段名都必须是唯一的。