ST_Geometry 数据类型遵循用户定义数据类型 (UDT) 的 SQL 3 规范,用于创建可存储空间数据(如地标、街道或土地宗地的位置)的列。该数据类型可通过符合国际标准化组织 (ISO) 和开放地理空间联盟 (OGC) 标准的结构化查询语言 (SQL) 来访问地理数据库和数据库。通过向表示地理要素的对象(点、线及面)提供存储空间,此存储类型扩展了数据库的功能。此存储类型旨在充分利用数据库资源;与数据库要素(如复制与分区)兼容;以及快速访问空间数据。
Esri 已经在 Oracle、PostgreSQL 和 SQLite 中实现 ST_Geometry 类型。ArcGIS 帮助中解释的正是这一 ST_Geometry 数据类型。
ST_Geometry 本身是抽象的、无法实例化的超类。但其子类可以实例化。实例化的数据类型是可定义为表列的数据类型,并且其类型值插入表列之中。
虽然可以将列定义为类型 ST_Geometry,但是您无法将 ST_Geometry 值插入此列,因为无法对 ST_Geometry 进行实例化。相反,您可以插入子类值。
以下图表显示了 ST_Geometry 数据类型及其子类型的等级:
子类
ST_Geometry 子类分为两类:基础几何子类和同类集合子类。基础几何包括 ST_Point、ST_LineString 和 ST_Polygon,而同类集合包括 ST_MultiPoint、ST_MultiLineString 和 ST_MultiPolygon。与名称的含义一致,同类集合是基础几何的集合。除了共享基础几何属性之外,同类集合还具有某些自身的属性。
每个子类都存储其名称所指的几何类型;例如,ST_MultiPoint 存储多点。下表是子类及其说明的列表:
子类型 | 说明 |
---|---|
ST_Point |
|
ST_LineString |
|
ST_Polygon |
|
ST_MultiPoint |
|
ST_MultiLineString |
|
ST_MultiPolygon |
|
请注意每个子类不仅继承了 ST_Geometry 超类的属性,还具有其自身的属性。适用于 ST_Geometry 数据类型的函数可接受任何子类实体类型。不过,有些函数定义在子类级别,且仅接受特定的子类。例如,ST_GeometryN 函数仅将 ST_MultiLinestring、ST_MultiPoint 或 ST_MultiPolygon 子类型值作为输入。
要搜索 ST_Geometry 的子类,可使用 ST_GeometryType 函数。ST_GeometryType 函数获取 ST_Geometry 并返回字符串形式的实例化子类。要查找包含在同类集合中基础几何元素的数量,可使用 ST_NumGeometries 函数,该函数获取同类集合并返回其包含的基础几何元素的数目。
ST_Geometry 函数调用
Oracle 和 PostgreSQL 中的 ST_Geometry 函数在 SQL 中实现。这是一门数据库级语言。在 Oracle 中,即为“面向过程的结构化查询语言 (PL/SQL)”。在 PostgreSQL 中,即为 PL/pgSQL。
在 Oracle 或 PostgreSQL 数据库中使用 SQL 函数访问 ST_Geometry 列时,将直接访问数据库;因此,数据库必须能够访问 ST_Geometry 库。在 Oracle 中,数据库也生成 extproc 进程。
在 SQLite 中,ST_Geometry 函数在 ST_Geometry 库中使用 C 语言实现。必须访问 ST_Geometry 库才能使用 ST_Geometry 函数。
Oracle
函数在 PL/SQL 中实现,并且在用 C 编程语言编写的外部共享库文件中调用函数。函数通过 PL/SQL 使用将库名称映射到库文件名称的别名进行调用,对于 Oracle 中的 ST_Geometry,即使用库 st_shapelib 的名称映射到库文件的名称。(有关详细信息,请参阅 Oracle CREATE LIBRARY 命令的相关文档。) 首次调用空间类型函数需要 st_shapelib,数据库请求侦听器为 SQL 会话生成 extproc 进程。将为 extproc 给定 st_shapelib 的位置、要调用函数的名称及其参数。extproc 会加载 st_shapelib 并调用函数。在此会话期间,当外部函数完成调用时,extproc 会返回结果并保持活动状态,等待其他函数调用。extproc 进程会在 SQL 会话断开连接时终止。
这需要执行如下配置:
- 数据库需要知道包含 st_shapelib 的文件的位置,这样才能将位置信息传递到侦听器进程,最后传递到 extproc。
- 如果 user_libraries 表中 st_shapelib 的 file_spec 不匹配服务器上 st_shapelib 的物理文件位置,ST_Geometry 运算符和函数将不起作用。因此,您必须使用 CREATE LIBRARY 命令来更新 Oracle 用户库中的库定义,以包括包含 st_shapelib 的文件的正确库路径。
- 数据库必须了解处理 extproc 请求的服务。这要在 tnsnames.ora 文件中配置。
- 必须允许 extproc 加载包含 st_shapelib 的文件。这可通过定义 extproc.ora 文件中的环境变量 EXTPROC_DLLS 来完成。
- extproc(通常以拥有 ORACLE_HOME 的用户身份运行)必须对库文件的位置具有读取权限,并且对文件具有执行权限。
PostgreSQL
St_geometry 库必须存储在 PostgreSQL 安装目录中,以便 PostgreSQL 能够访问 ST_Geometry 函数。您必须将 st_geometry.dll (Windows) 文件复制到 PostgreSQL 安装目录的 lib 文件夹中。对于 Linux 服务器,复制 st_geometry.so (Linux) 文件到 PostgreSQL 服务器上的 /usr/lib/pgsql 目录。这两个文件均可在 ArcMap 或 ArcGIS Server 安装文件的 DatabaseSupport 文件夹中找到,也可以从 My Esri 中下载。
SQLite
必须指定 ST_Geometry 库的位置并进行加载,以便 SQLite 客户端能够访问 SQL 函数。可以在客户端的 PATH (Windows) 或 LIBPATH (Linux) 系统环境变量中设置库的位置,然后装载库;或者可以在装载 ST_Geometry 库时指定路径。有关说明,请参阅加载 SQLite ST_Geometry 库。
如何实现 ST_Geometry?
ST_Geometry 以用户定义类型的形式实现,该类型可在 IBM Db2、IBM Informix、Oracle、PostgreSQL 和 SAP HANA 中的数据库或地理数据库中使用。ST_Geometry 也可用在 SQLite、Dameng 和 IBM Netezza 数据库中。
每个数据库管理系统支持如下 ST_Geometry:
数据库 ST_Geometry
数据库管理系统 | 说明 |
---|---|
DAMENG | ST_Geometry 类型随附在 Dameng 数据库中,但是必须对其进行初始化。 |
IBM Db2 | Db2 Spatial Extender(IBM 默认将其作为 Db2 产品的一部分包含在产品中)用于提供 ST_Geometry 支持。ST_Geometry 类型由 Esri 和 IBM 协作开发。 请注意,对于 SQL 语法,Db2 for z/OS 和 Db2 之间存在一些差别。有关正在使用的 Db2 版本的正确语法的信息,请参阅 Db2 文档。 |
IBM Informix | Informix Spatial DataBlade(作为 Informix product 产品的一部分由 IBM 提供)用于在数据库和地理数据库中安装 ST_Geometry 类型。ST_Geometry 是在 Informix 地理数据库中存储要素几何的唯一选择。它由 Esri 和 IBM 协作开发,是一种高性能存储类型,提供了对空间数据进行符合 ISO 和 OGC 标准的 SQL 访问。 |
IBM Netezza | Netezza 中的 ST_Geometry 类型通过 Netezza Spatial Esri 库 (nzSpatial_Esri) 实现,属于 IBM Netezza Analytics 软件包的一部分。 |
Oracle | 当您在 Oracle 中创建地理数据库时,ST_Geometry 数据类型随之安装,且该类型是 Oracle 中地理数据库的默认几何存储类型。如果您不需要地理数据库功能,还可使用创建空间类型地理处理工具在 Oracle 数据库中安装 ST_Geometry 类型。 |
PostgreSQL | 当您在 PostgreSQL 中创建地理数据库时,ST_Geometry 数据类型随之安装,且该类型是在 PostgreSQL 地理数据库中存储要素几何的默认类型。如果您不需要地理数据库功能,还可使用创建空间类型地理处理工具在 PostgreSQL 数据库中安装 ST_Geometry 类型。 |
SAP HANA | 默认情况下,SAP HANA 数据仓库安装包括 ST_Geometry 类型。 |
SQLite | SQLite 中的 ST_Geometry 数据类型通过 st_geometry 库和 geometryblob 列实现。ST_Geometry SQL 函数存储在 st_geometry 库而非数据库中。 您可以使用创建 SQLite 数据库地理处理工具来创建包含 ST_Geometry 类型的 SQLite 数据库。还可使用 CreateOGCTables SQL 功能在现有 SQLite 数据库中创建 ST_Geometry 数据类型。 |