GEOMETRY 数据类型¶
MatrixOne 支持 GEOMETRY 空间数据类型,用于存储和操作地理与几何数据。几何值以 WKB(Well-Known Binary)格式内部存储,可从 WKT(Well-Known Text)或 WKB 输入创建。SRID 元数据以列或表达式类型级别跟踪,而非存储在 WKB 载荷中。GEOMETRY 值可在列级别通过子类型和 SRID 进行约束。
语法¶
CREATE TABLE 和 ALTER 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 列接受任何几何子类型。
类型名称 |
约束 |
|---|---|
|
接受任何几何子类型(无约束)。 |
|
仅接受 POINT 值。 |
|
仅接受 LINESTRING 值。 |
|
仅接受 POLYGON 值。 |
|
仅接受 MULTIPOINT 值。 |
|
仅接受 MULTILINESTRING 值。 |
|
仅接受 MULTIPOLYGON 值。 |
|
仅接受 GEOMETRYCOLLECTION 值。 |
MatrixOne 还提供 32 位浮点坐标变体(GEOMETRY32、POINT32、POLYGON32)以及大地测量别名 GEOGRAPHY 和 GEOGRAPHY32(默认 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 是所有空间值的基类型。以下子类型别名可作为列类型名称使用:
类型名称 |
描述 |
|---|---|
|
基类型,接受任何几何子类型。 |
|
单个点 (x, y)。 |
|
由一系列点组成的线段。 |
|
由一条外环和零条或多条内环(孔)定义的平面表面。 |
|
点集合。 |
|
线段集合。 |
|
多边形集合。 |
|
任意几何类型的异构集合。 |
32 位浮点变体¶
MatrixOne 提供 32 位浮点坐标变体以减少存储开销,这些是 MO 特有扩展:
类型名称 |
描述 |
|---|---|
|
使用 float32 坐标的通用几何类型。 |
|
使用 float32 坐标的点类型。 |
|
使用 float32 坐标的多边形类型。 |
|
|
|
|
存储格式¶
几何值以 WKB(Well-Known Binary)格式内部存储。在查询输出中,几何值以其规范 WKT 形式呈现。WKB 二进制 I/O 通过 ST_GeomFromWKB / ST_AsWKB 支持。
WKT / WKB I/O 参考¶
几何值可从 WKT 和 WKB 创建并转换:
函数 |
描述 |
|---|---|
|
从 WKT 字符串创建几何值;可选 SRID。 |
|
|
|
返回规范 WKT 表示。 |
|
|
|
从 WKB 二进制创建几何值。 |
|
返回 WKB 二进制表示。 |
|
|
|
|
子类型构造函数¶
每个几何子类型都有专用的构造函数,用于验证 WKT 输入是否匹配预期类型:
函数 |
预期类型 |
|---|---|
|
POINT |
|
LINESTRING |
|
|
|
POLYGON |
|
|
|
MULTIPOINT |
|
MULTILINESTRING |
|
MULTIPOLYGON |
|
GEOMETRYCOLLECTION |
|
POINT(从 WKB) |
|
POLYGON(从 WKB) |
子类型不匹配将以错误形式拒绝。例如,使用 ST_PointFromText 处理 LINESTRING WKT 会产生错误。
另请参阅¶
完整的空间函数列表,请参见 Geo 函数概览。