Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


GEOMETRY类型

📄字数 4.3K
👁️阅读量 加载中...

功能说明

GEOMETRY数据类型,即几何数据类型,实现了OGC简单要素模型。它是抽象类型,包含多种几何子类型。

语法格式

sql
GEOMETRY[(TYPMOD,SRID)]

参数说明

  • TYPMOD:空间类型修饰符,即几何子类型,表示各种类型和各种维度的几何形状。
  • SRID:空间参考系统标识符,默认为:0。

几何子类型

几何子类型实现了SFA的几何对象模型。

基础类型

类型名称功能说明WKT示例
Point点是表示坐标空间中单个位置。
一个点是一个零维的对象。
  • 二维点:POINT (1 2)
  • 三维点:POINT Z (1 2 3)
  • 带 M 值的二维点:POINT M (1 2 3)
  • 带 M 值的三维点:POINT ZM (1 2 3 4)
  • LineString线串是表示两个或多个位置之间的路径,它的形式是由两个或多个点组成的有序序列。
  • 如果线串的起始点和结束点是同一个点,则称其是闭合的(Closed)。
  • 如果线串不自身交叉(如果线串是闭合的,则排除结束点),则称其是简单的(Simple)。
  • 有3个节点的线:
    LINESTRING (1 2, 3 4, 5 6)
    LinearRing线性环是一个既闭合又简单的线串。第一个点和最后一个点必须相等,并且线不得自相交 1个线环:
    LINEARRING (0 0 0, 4 0 0, 4 4 0, 0 4 0, 0 0 0)
    Polygon多边形是一个二维平面区域,包含一个外部边界(即外壳)以及可能存在的一个或多个内部边界(即孔)。这些边界都是线性环(LinearRing)。有1个外环和1个内环的多边形:
    POLYGON ((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))
    Triangle三角形是由三个不同的非共线顶点定义的多边形,是一个多边形的子类型,第一和第四个相等。 1个三角形:
    TRIANGLE ((0 0, 0 9, 9 0, 0 0))

    集合类型

    类型名称功能说明WKT示例
    MultiPoint多点是点的集合。有2个点的多点:
    MULTIPOINT ( (0 0), (1 2) )
    MultiLineString多线是线串的集合,如果多线的每个元素都已闭合,则该多线闭合。有2条线的多线:
    MULTILINESTRING ( (0 0,1 1,1 2), (2 3,3 2,5 4) )
    MultiPolygon多多边形是非重叠、不相邻多边形的集合。集合中的多边形只能在有限数量的点处接触。有2个多边形的多多边形(只有一个外环的多边形+三角形):
    MULTIPOLYGON (((1 5, 5 5, 5 1, 1 1, 1 5)), ((6 5, 9 1, 6 1, 6 5)))
    GeometryCollection几何集合是任意几何图形的异构(混合)集合。有1个点和1条线的几何集合:
    GEOMETRYCOLLECTION ( POINT(2 3), LINESTRING(2 3, 3 4))
    PolyhedralSurface多面体表面是多边形的集合,且他们共享共同的边界。如果多边形坐标具有 Z 坐标,则表面是三维的。1个立方体的体表面:
    POLYHEDRALSURFACE Z (
    ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
    ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)),
    ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),
    ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),
    ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)),
    ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )
    TIN不规则三角网是一组不重叠的三角形,表示了一个三角不规则网络的结构。有2个三角形的TIN:
    TIN Z ( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )

    曲线类型

    支持参数化存储圆、圆弧、椭圆、椭圆弧几何对象,支持由这些对象组合成的复合线和复合面。

    类型名称功能说明WKT 示例
    CircularString圆弧是基本曲线类型,类似于线性世界中的线串。
    单个圆弧段由三个点指定:起点、控制点和终点,控制点是控制弧线的曲率。
    要指定闭合圆,起点和终点相同,中点是圆直径上的相对点(即圆弧的中心)。
    在弧序列中,前一个弧的终点是下一个弧的起点。 圆弧串必须具有大于1的奇数个点。
  • 1个圆弧串:CIRCULARSTRING(0 0, 1 1, 1 0)
  • 1个闭合圆:CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0)
  • CompoundCurve复合曲线是一条连续曲线,可以包含圆弧段和直线段。
    每个线段(最后一个除外)的终点必须与下一个线段的起点重合。
    1个圆弧(CircularString)和1个线串(LineString)组成的复合曲线:
    COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))
    CurvePolygon曲线多边形与多边形相似,有一个外环和零个或多个内环。区别在于多边形的环是线串,而曲线多边形环是复合曲线或圆弧。
  • 1个圆弧(CircularString)外环和1个线串(LineString)内环组成的曲线多边形:
    CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1) )
  • 1个复合曲线(CompoundCurve)外环和1个圆弧(CircularString)内环组成的曲线多边形:
    CURVEPOLYGON(COMPOUNDCURVE( CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)),CIRCULARSTRING(1.7 1, 1.4 0.4, 1.6 0.4, 1.6 0.5, 1.7 1) )
  • MultiCurve多曲线是曲线的集合,可以包括线串、圆弧或复合曲线。1个线串(LineString)和一个圆弧(CircularString)组成的多曲线:
    MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4))
    MultiSurface多曲面是曲面的集合,可以是多边形(Polygon)或曲线多边形(CurvePolygon)。1个曲线多边形(CurvePolygon)和2个不同大小的多边形(Polygon)组成的多曲面:
    MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING( 0 0, 4 0, 4 4, 0 4, 0 0), (1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10, 10 10), (11 11, 11.5 11, 11 11.5, 11 11)))

    使用说明

    • 几何子类型的WKT格式,类型名称只支持大写。
    • 几何子类型可以使用GeometryTypeST_GeometryType查询。
    • 几何维度:几何子类型的属性。
      • 几何图形在二维笛卡尔平面上对形状进行建模,每个坐标都有X和Y坐标轴值。
      • 点类型的维度为0,线性类型的维度为1,多边形类型的维度为2,集合具有最大元素维度的维度。
      • 坐标可包含Z或M纵坐标值。Z值通常用于表示高程。M值表示测量值,可表示时间或距离。
      • 如果具有Z或M纵坐标,则坐标尺寸为3D;如果同时具有Z和M,则坐标尺寸为4D。
    • 几何值可以为空。空值不包含顶点(对于原子几何类型)或不包含元素(对于集合)。
    • SRID详细信息请参见空间参考系统章节和ST_SRID
    • 不推荐将GEOMETRY类型作为主键、分区建、约束使用。
    • GEOMETRY类型支持UNION ALL操作,但不支持UNION操作。

    地理类型与几何类型区别

    • 地理类型的函数少于几何类型。
    • 地理类型支持存储经度/纬度坐标,基于球面模型,计算更精确,更占用CPU资源。
    • 根据工作范围选择数据类型,以确保性能和功能的最大化。
    • 对于局限于较小的地理区域数据集,如州、县或直辖市,推荐使用投影和几何类型。
    • 对于覆盖全球或广大大陆的数据集,推荐使用地理数据类型。

    示例

    创建空间表

    创建了一个带有几何列的表,该列存储具有CGCS2000椭球地理坐标系(SRID 4490)的2D线串:

    sql
    CREATE TABLE roads (
        id INTEGER IDENTITY(1,1) PRIMARY KEY,
        name VARCHAR(64),
        geom GEOMETRY(LINESTRING,4490)
      );

    创建一个表,其中包含具有默认SRID的任何类型的几何图形:

    sql
    CREATE TABLE geoms(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geom GEOMETRY );

    为2D点创建具有SRID默认值的表:

    sql
    CREATE TABLE pts(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geom GEOMETRY(POINT) );

    创建一个包含3D(XYZ)点和显式SRID 4490的表:

    sql
    CREATE TABLE pts(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geom GEOMETRY(POINTZ,4490) );

    使用默认SRID创建具有4D(XYZM)LINESTRING几何图形的表:

    sql
    CREATE TABLE lines(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geom GEOMETRY(LINESTRINGZM) );

    使用SRID 3857(Web 墨卡托)创建包含2D POLYGON几何图形的表:

    sql
    CREATE TABLE polys(gid INTEGER IDENTITY(1,1) PRIMARY KEY, geom GEOMETRY(POLYGON,3857) );

    一个表可以有多个几何列。可以在创建表时指定,或使用ALTER TABLE语句添加。

    下面的示例演示如何添加列以存储3D LineStrings:

    sql
    ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ,4326);

    加载空间数据

    空间数据可以转换为文本表示(如WKT或WKB),可以使用SQL INSERT语句将数据插入到空间库。

    SQL加载文件:

    sql
    INSERT INTO roads ( NAME,geom) VALUES 
      ('Jeff Rd','LINESTRING(191232 243118,191108 243242)'),
      ('Geordie Rd','LINESTRING(189141 244158,189265 244817)'),
      ('Paul St','LINESTRING(192783 228138,192612 229814)'),
      ('Graeme Ave','LINESTRING(189412 252431,189631 259122)'),
      ('Phil Tce','LINESTRING(190131 224148,190871 228134)'),
      ('Dave Cres','LINESTRING(198231 263418,198213 268322)');

    提取空间数据

    使用SQL SELECT查询来获取要提取的数据集:

    sql
    SQL> SELECT id, name, TO_CHAR(ST_AsText(geom)) AS geom FROM roads;
    
    +----+------------+-----------------------------------------+
    | ID |    NAME    |                  GEOM                   |
    +----+------------+-----------------------------------------+
    | 1  | Jeff Rd    | LINESTRING(191232 243118,191108 243242) |
    | 2  | Geordie Rd | LINESTRING(189141 244158,189265 244817) |
    | 3  | Paul St    | LINESTRING(192783 228138,192612 229814) |
    | 4  | Graeme Ave | LINESTRING(189412 252431,189631 259122) |
    | 5  | Phil Tce   | LINESTRING(190131 224148,190871 228134) |
    | 6  | Dave Cres  | LINESTRING(198231 263418,198213 268322) |
    +----+------------+-----------------------------------------+