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_Geometry 子类分为两类:基础几何子类和同类集合子类。基础几何包括 ST_Point、ST_LineString 和 ST_Polygon,而同类集合包括 ST_MultiPoint、ST_MultiLineString 和 ST_MultiPolygon。与名称的含义一致,同类集合是基础几何的集合。除了共享基础几何属性之外,同类集合还具有某些自身的属性。
每个子类都存储其名称所指的几何类型;例如,ST_MultiPoint 存储多点。下表是子类及其说明的列表:
子类型说明ST_Point在坐标空间中占据单个位置的零维度几何。
具有单个 x,y 坐标值(始终是简单的),并且边界为 NULL。
ST_LineString以点序列的形式存储的一维对象,用于定义线性插值路径。
ST_LineString 具有长度。
如果 ST_LineString 不与其内部相交,则 ST_LineString 很简单。
闭合的 ST_LineString 的端点(边界)占据空间中的相同点。
如果 ST_LineString 是闭合的并且是简单的,那么它是一个环。
端点通常形成 ST_LineString 的边界,除非 ST_LineString 是闭合的(在这种情况下边界为 NULL)。
ST_LineString 的内部是位于端点间的连接路径,ST_LineString 闭合的情况除外,这种情况下内部是连续的。
ST_Polygon以点序列的形式存储的二维表面,用于定义其外接环以及 0 个或更多内部环。
ST_Polygon 具有面积并且始终是简单的。
外部环和任意内部环确定了 ST_Polygon 的边界,环之间的封闭空间确定了 ST_Polygon 的内部。
ST_Polygon 的环可以相切,但绝不可以相交。
ST_MultiPointST_Point 的集合。
具有 0 个维度。
如果 ST_MultiPoint 中的元素占据的坐标空间互不相同,则它是简单的。
ST_MultiPoint 的边界为 NULL。
ST_MultiLineStringST_LineString 的集合。
ST_MultiLineString 具有长度。
如果 ST_MultiLineString 只在 ST_LineString 元素的端点相交,则它是简单的。
如果 ST_LineString 元素的内部相交,则 ST_MultiLineString 是非简单的。
ST_MultiLineString 的边界是 ST_LineString 元素的非相交端点。
如果 ST_MultiLineString 的所有 ST_LineString 元素均为闭合的,则它也为闭合的。
如果 ST_MultiLineString 的所有元素的所有端点都相交,则它的边界为 NULL。
ST_MultiPolygon面的集合。
ST_MultiPolygons 具有面积。
ST_MultiPolygon 的边界是其元素外部环和内部环的累积长度。
ST_MultiPolygon 的内部被定义为其 ST_Polygon 元素的累积内部。
ST_MultiPolygon 的元素的边界只能相切。ST_Geometry 子类型
请注意每个子类不仅继承了 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 的文件的正确库路径。注:
更改库路径的定义使引用该路径的包正文无效;因此,应使用 Oracle 重新编译某些地理数据库存储过程的包正文。
数据库必须了解处理 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 文件夹中找到,也可以从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数据库管理系统说明DAMENGST_Geometry 类型随附在 Dameng 数据库中,但是必须对其进行初始化。
IBM Db2Db2 Spatial Extender(IBM 默认将其作为 Db2 产品的一部分包含在产品中)用于提供 ST_Geometry 支持。ST_Geometry 类型由 Esri 和 IBM 协作开发。
请注意,对于 SQL 语法,Db2 for z/OS 和 Db2 之间存在一些差别。有关正在使用的 Db2 版本的正确语法的信息,请参阅 Db2 文档。
IBM InformixInformix Spatial DataBlade(作为 Informix product 产品的一部分由 IBM 提供)用于在数据库和地理数据库中安装 ST_Geometry 类型。ST_Geometry 是在 Informix 地理数据库中存储要素几何的唯一选择。它由 Esri 和 IBM 协作开发,是一种高性能存储类型,提供了对空间数据进行符合 ISO 和 OGC 标准的 SQL 访问。
IBM NetezzaNetezza 中的 ST_Geometry 类型通过 Netezza Spatial Esri 库 (nzSpatial_Esri) 实现,属于 IBM Netezza Analytics 软件包的一部分。
Oracle当您在 Oracle 中创建地理数据库时,ST_Geometry 数据类型随之安装,且该类型是 Oracle 中地理数据库的默认几何存储类型。如果您不需要地理数据库功能,还可使用
PostgreSQL当您在 PostgreSQL 中创建地理数据库时,ST_Geometry 数据类型随之安装,且该类型是在 PostgreSQL 地理数据库中存储要素几何的默认类型。如果您不需要地理数据库功能,还可使用
SAP HANA默认情况下,SAP HANA 数据仓库安装包括 ST_Geometry 类型。
SQLiteSQLite 中的 ST_Geometry 数据类型通过 st_geometry 库和 geometryblob 列实现。ST_Geometry SQL 函数存储在 st_geometry 库而非数据库中。
您可以使用