GEOMETRY 数据类型

MatrixOne 支持 GEOMETRY 空间数据类型,用于存储和操作地理与几何数据。几何值以 WKB(Well-Known Binary)格式内部存储,可从 WKT(Well-Known Text)或 WKB 输入创建。SRID 元数据以列或表达式类型级别跟踪,而非存储在 WKB 载荷中。GEOMETRY 值可在列级别通过子类型和 SRID 进行约束。

语法

CREATE TABLEALTER TABLE 语句中的列声明语法:

column_name GEOMETRY [SRID n]
column_name POINT [SRID n]
column_name LINESTRING [SRID n]
column_name POLYGON [SRID n]
column_name MULTIPOINT [SRID n]
column_name MULTILINESTRING [SRID n]
column_name MULTIPOLYGON [SRID n]
column_name GEOMETRYCOLLECTION [SRID n]

32 位浮点坐标变体:

column_name GEOMETRY32 [SRID n]
column_name POINT32 [SRID n]
column_name POLYGON32 [SRID n]

GEOGRAPHY 别名,隐式默认 SRID 为 4326:

column_name GEOGRAPHY
column_name GEOGRAPHY32

例如,声明一个大地测量点坐标列:

CREATE TABLE places (
    id INT,
    loc POINT SRID 4326
);

参数说明

子类型名称

声明 GEOMETRY 列时,可以可选地指定子类型名称。使用特定子类型声明的列(例如 POINT)强制只能存储该子类型的几何值。泛型 GEOMETRY 列接受任何几何子类型。

类型名称

约束

GEOMETRY

接受任何几何子类型(无约束)。

POINT

仅接受 POINT 值。

LINESTRING

仅接受 LINESTRING 值。

POLYGON

仅接受 POLYGON 值。

MULTIPOINT

仅接受 MULTIPOINT 值。

MULTILINESTRING

仅接受 MULTILINESTRING 值。

MULTIPOLYGON

仅接受 MULTIPOLYGON 值。

GEOMETRYCOLLECTION

仅接受 GEOMETRYCOLLECTION 值。

MatrixOne 还提供 32 位浮点坐标变体(GEOMETRY32POINT32POLYGON32)以及大地测量别名 GEOGRAPHYGEOGRAPHY32(默认 SRID 为 4326)。详见类型层次32 位浮点变体

SRID 属性

可选的 SRID n 子句指定列的空间参考系统标识符。带有 SRID 约束的列仅接受 SRID 匹配的几何值。尝试插入 SRID 不匹配的几何值会报错。

示例

以下示例演示子类型约束列、泛型几何存储以及 SRID 列行为:

DROP DATABASE IF EXISTS geo_demo;
CREATE DATABASE geo_demo;
USE geo_demo;

-- 泛型几何列接受任何子类型。
CREATE TABLE any_geom (
    id INT,
    g GEOMETRY
);
INSERT INTO any_geom VALUES
    (1, ST_GeomFromText('POINT(1 2)')),
    (2, ST_GeomFromText('LINESTRING(0 0, 3 4)')),
    (3, ST_GeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))'));
SELECT id, ST_AsText(g) AS wkt FROM any_geom ORDER BY id;
SELECT id, ST_GeometryType(g) AS gtype FROM any_geom ORDER BY id;

-- 子类型约束列仅接受其对应子类型。
CREATE TABLE points_only (g POINT);
INSERT INTO points_only VALUES (ST_GeomFromText('POINT(1 1)'));

-- 此插入被拒绝,因为输入是 LINESTRING 而非 POINT。
-- Expected-Success: false
INSERT INTO points_only VALUES (ST_GeomFromText('LINESTRING(0 0, 1 1)'));
;

-- SRID 列示例。
CREATE TABLE gs (g POINT SRID 4326);
INSERT INTO gs VALUES (ST_GeomFromText('POINT(1 1)', 4326));
SELECT ST_AsText(g) AS wkt, ST_SRID(g) AS srid FROM gs;

-- SRID 不匹配时被拒绝。
-- Expected-Success: false
INSERT INTO gs VALUES (ST_GeomFromText('POINT(3 3)', 0));
;

DROP TABLE any_geom;
DROP TABLE points_only;
DROP TABLE gs;
DROP DATABASE geo_demo;

类型层次

GEOMETRY 是所有空间值的基类型。以下子类型别名可作为列类型名称使用:

类型名称

描述

GEOMETRY

基类型,接受任何几何子类型。

POINT

单个点 (x, y)。

LINESTRING

由一系列点组成的线段。

POLYGON

由一条外环和零条或多条内环(孔)定义的平面表面。

MULTIPOINT

点集合。

MULTILINESTRING

线段集合。

MULTIPOLYGON

多边形集合。

GEOMETRYCOLLECTION

任意几何类型的异构集合。

32 位浮点变体

MatrixOne 提供 32 位浮点坐标变体以减少存储开销,这些是 MO 特有扩展:

类型名称

描述

GEOMETRY32

使用 float32 坐标的通用几何类型。

POINT32

使用 float32 坐标的点类型。

POLYGON32

使用 float32 坐标的多边形类型。

GEOGRAPHY

GEOMETRY 的别名,默认 SRID 为 4326(大地测量)。

GEOGRAPHY32

GEOMETRY32 的别名,默认 SRID 为 4326。

存储格式

几何值以 WKB(Well-Known Binary)格式内部存储。在查询输出中,几何值以其规范 WKT 形式呈现。WKB 二进制 I/O 通过 ST_GeomFromWKB / ST_AsWKB 支持。

WKT / WKB I/O 参考

几何值可从 WKT 和 WKB 创建并转换:

函数

描述

ST_GeomFromText(wkt [, srid])

从 WKT 字符串创建几何值;可选 SRID。

ST_GeometryFromText(wkt [, srid])

ST_GeomFromText 的同义词。

ST_AsText(geom)

返回规范 WKT 表示。

ST_AsWKT(geom)

ST_AsText 的同义词。

ST_GeomFromWKB(wkb)

从 WKB 二进制创建几何值。

ST_AsWKB(geom)

返回 WKB 二进制表示。

ST_AsBinary(geom)

ST_AsWKB 的同义词。

ST_GeomFromBinary(wkb)

ST_GeomFromWKB 的同义词。

子类型构造函数

每个几何子类型都有专用的构造函数,用于验证 WKT 输入是否匹配预期类型:

函数

预期类型

ST_PointFromText(wkt)

POINT

ST_LineFromText(wkt)

LINESTRING

ST_LinestringFromText(wkt)

ST_LineFromText 的同义词。

ST_PolyFromText(wkt)

POLYGON

ST_PolygonFromText(wkt)

ST_PolyFromText 的同义词。

ST_MPointFromText(wkt)

MULTIPOINT

ST_MLineFromText(wkt)

MULTILINESTRING

ST_MPolyFromText(wkt)

MULTIPOLYGON

ST_GeomCollFromText(wkt)

GEOMETRYCOLLECTION

ST_PointFromWKB(wkb)

POINT(从 WKB)

ST_PolyFromWKB(wkb)

POLYGON(从 WKB)

子类型不匹配将以错误形式拒绝。例如,使用 ST_PointFromText 处理 LINESTRING WKT 会产生错误。

另请参阅

完整的空间函数列表,请参见 Geo 函数概览