什么是 ST_Geometry 存储类型?

ST_Geometry 数据类型是一种用户定义数据类型 (UDT),使用该数据类型可定义存储空间数据的列。

ST_Geometry 本身是抽象的、无法实例化的超类。但其子类可以实例化。实例化的数据类型是可定义为表列的数据类型,并且其类型值插入表列之中。

虽然可以将列定义为类型 ST_Geometry,但是您无法将 ST_Geometry 值插入此列,因为无法对 ST_Geometry 进行实例化。相反,您可以插入子类值。

下图说明了 ST_Geometry 数据类型及其子类的等级。请注意 ST_Curve、ST_Surface、ST_MultiCurve 和 ST_MultiSurface 都被定义为无法实例化的类型。没有为这些类型定义构造器。

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_X - 以双精度数返回某一点的 x 坐标值
  • ST_Y - 以双精度数返回某一点的 y 坐标值
  • ST_Z - 以双精度数返回某一点的 z 坐标值
  • ST_M - 以双精度数返回某一点的 m 坐标值

ST_LineString

  • 一维对象,作为一串定义线性插值路径的点来存储
  • ST_LineString 具有长度。
  • 如果 ST_LineString 不与其内部相交,则 ST_LineString 很简单。
  • 闭合的 ST_LineString 的端点(边界)占据空间中的相同点。
  • 如果 ST_LineString 是闭合的并且是简单的,那么它是一个环。
  • 端点通常形成 ST_LineString 的边界,除非 ST_LineString 是闭合的(在这种情况下边界为空)。
  • ST_LineString 的内部是位于端点间的连接路径,ST_LineString 闭合的情况除外,这种情况下内部是连续的。
  • ST_LineString 通常用于定义线状要素,如道路、河流和电力线。

  • ST_StartPoint - 返回线串 (linestring) 的第一点
  • ST_EndPoint - 返回线串的最后一点
  • ST_PointN - 将线串和索引带到第 n 个点并返回该点
  • ST_Length - 以双精度数返回线串的长度
  • ST_NumPoints - 以整数返回线串序列中点的数量
  • ST_IsRing - 如果线串是环则返回 1 (TRUE),否则返回 0 (FALSE)
  • ST_IsClosed - 如果线串闭合则返回 1 (TRUE),否则返回 0 (FALSE)

ST_Polygon

  • 作为点序列存储的二维表面,定义该表面的外部边界环以及零或零以上的内部环
  • ST_Polygon 具有面积并且始终是简单的。
  • 外部环和任意内部环确定了 ST_Polygon 的边界,环之间的封闭空间确定了 ST_Polygon 的内部。
  • ST_Polygon 的环可以在切点相交,但绝不可以交叉。
  • 定义土地的宗地、水体和其他有空间范围的要素

  • ST_Area - 以双精度数返回面的面积
  • ST_ExteriorRing - 以线串返回面的外部环
  • ST_NumInteriorRing - 返回面包含的内部环数
  • ST_InteriorRingN - 获取面和索引并以线串返回第 n 个内部环
  • ST_Centroid - 返回面的包络矩形的中心点
  • ST_PointOnSurface - 返回一定在面表面上的一点。

ST_MultiPoint

  • ST_Point 的集合
  • 有 0 维
  • 如果 ST_MultiPoint 的元素占据的坐标空间互不相同,则 ST_MultiPoint 就是简单的。
  • ST_MultiPoint 的边界为空。
  • 定义航空广播模式和疾病爆发事件之类的事情

ST_MultiLineString

  • ST_LineStrings 的集合
  • ST_MultiLineStrings 具有长度。
  • 如果 ST_MultiLineString 只在 ST_LineString 元素的端点相交,则它是简单的。
  • 如果 ST_LineString 元素的内部相交,则 ST_MultiLineString 是非简单的。
  • ST_MultiLineString 的边界是 ST_LineString 元素的非相交端点。
  • 如果 ST_MultiLineString 的所有 ST_LineString 元素均为闭合的,则它也为闭合的。
  • 如果 ST_MultiLineString 的所有元素的所有端点都相交,则它的边界为空。
  • 用于定义河流或道路网络之类的实体

  • ST_Length - 以双精度数返回多线串 (multilinestring) 所有 ST_LineString 元素的累积长度
  • ST_IsClosed - 如果多线串闭合则返回 1 (TRUE),否则返回 0 (FALSE)

ST_MultiPolygon

  • 面的集合
  • ST_MultiPolygons 具有面积。
  • ST_MultiPolygon 的边界是其元素外部环和内部环的累积长度。
  • ST_MultiPolygon 的内部被定义为其 ST_Polygon 元素的累积内部。
  • ST_MultiPolygon 的元素的边界只能在切点相交。
  • 定义森林地层或土地的不毗连宗地(例如,太平洋岛链)之类的要素。

  • ST_Area - 以双精度数返回多面 (multipolygon) 面元素的累积 ST_Area
  • ST_Centroid - 返回多面包络矩形的中心点
  • ST_PointOnSurface - 返回必位于某一多面面元素表面上的一点

ST_Geometry 子类型

请注意每个子类都继承 ST_Geometry 的属性,但超类还有其本身的属性。适用于 ST_Geometry 数据类型的函数可接受任何子类数据类型。不过,有些函数定义在子类级别,且仅接受特定的子类。例如,ST_GeometryN 函数仅将 ST_MultiLinestring、ST_MultiPoint 或 ST_MultiPolygon 子类型值作为输入。

要搜索 ST_Geometry 的子类,可使用 ST_GeometryType 函数。ST_GeometryType 函数获取 ST_Geometry 并返回字符串形式的实例化子类。要查找包含在同类集合中基础几何元素的数量,可使用 ST_NumGeometries 函数,该函数获取同类集合并返回其包含的基础几何元素的数目。


7/10/2012