两个标准的空间数据格式用于在查询中表示几何对象:
-
Well-Known Text (WKT) 格式
-
Well-Known Binary (WKB) 格式
在内部,MySQL 以一种不相同于 WKT 或 WKB 格式的格式存储几何值。(内部格式类似于 WKB,但具有初始的 4 字节以指示 SRID。)
有可用的函数可以在不同的数据格式之间进行转换;见 第 14.16.6 节,“几何格式转换函数”。
以下部分描述 MySQL 使用的空间数据格式:
Well-Known Text (WKT) 表示几何值的 ASCII 形式,旨在交换几何数据。OpenGIS 规范提供了一个 Backus-Naur 语法,指定了写入 WKT 值的正式生产规则(见 第 13.4 节,“空间数据类型”)。
几何对象的 WKT 表示示例:
-
一个
Point
:POINT(15 20)
点坐标指定无分隔符。与 SQL
Point()
函数的语法不同,该函数需要坐标之间的逗号。请注意在特定上下文中使用适当的语法。例如,以下语句都使用ST_X()
从Point
对象中提取 X 坐标。第一个语句直接使用Point()
函数。第二个语句使用 WKT 表示形式,使用ST_GeomFromText()
将其转换为Point
。mysql> SELECT ST_X(Point(15, 20)); +---------------------+ | ST_X(POINT(15, 20)) | +---------------------+ | 15 | +---------------------+ mysql> SELECT ST_X(ST_GeomFromText('POINT(15 20)')); +---------------------------------------+ | ST_X(ST_GeomFromText('POINT(15 20)')) | +---------------------------------------+ | 15 | +---------------------------------------+
-
一个
LineString
四个点:LINESTRING(0 0, 10 10, 20 25, 50 60)
点坐标对用逗号分隔。
-
一个
Polygon
一个外部环和一个内部环:POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
-
一个
MultiPoint
三个Point
值:MULTIPOINT(0 0, 20 20, 60 60)
空间函数,如
ST_MPointFromText()
和ST_GeomFromText()
,接受 WKT 格式的MultiPoint
值,允许单个点在值中被括号括起来。例如,以下两个函数调用都是有效的:ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)') ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))')
-
一个
MultiLineString
两个LineString
值:MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
-
一个
MultiPolygon
两个Polygon
值:MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
-
一个
GeometryCollection
由两个Point
值和一个LineString
组成:GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
Well-Known Binary (WKB) 表示几何值的二进制流形式,用于交换几何数据。该格式由 OpenGIS 规范定义(见 第 13.4 节,“空间数据类型”)。它也在 ISO SQL/MM Part 3: Spatial 标准中定义。
WKB 使用 1 字节无符号整数、4 字节无符号整数和 8 字节双精度数字(IEEE 754 格式)。一个字节是八位。
例如,WKB 值对应于 POINT(1 -1)
由以下 21 字节序列组成,每个字节由两个十六进制数字表示:
0101000000000000000000F03F000000000000F0BF
该序列由以下表中的组件组成。
表 13.2 WKB 组件示例
Component | Size | Value |
---|---|---|
Byte order | 1 字节 | 01 |
WKB type | 4 字节 | 01000000 |
X coordinate | 8 字节 | 000000000000F03F |
Y coordinate | 8 字节 | 000000000000F0BF |
组件表示如下:
-
字节顺序指示符是 1 或 0,以表示小端或大端存储。小端和大端字节顺序也分别称为网络数据表示(NDR)和外部数据表示(XDR)。
-
WKB 类型是一个代码,指示几何类型。MySQL 使用从 1 到 7 的值来指示
点
、线串
、多边形
、多点
、多线串
、多多边形
和几何集合
。 -
一个
点
值具有 X 和 Y 坐标,每个表示为双精度值。
WKB 值对于更复杂的几何值具有更复杂的数据结构,如 OpenGIS 规范中所详细。
MySQL 使用 4 字节来指示 SRID,然后是 WKB 表示的值。有关 WKB 格式的描述,请参阅 众所周知的二进制 (WKB) 格式。
对于 WKB 部分,以下是 MySQL 特定的考虑:
-
字节顺序指示符字节是 1,因为 MySQL 以小端方式存储几何值。
-
MySQL 支持几何类型
点
、线串
、多边形
、多点
、多线串
、多多边形
和几何集合
。其他几何类型不受支持。 -
只有
几何集合
可以为空。这样的值将以 0 元素存储。 -
多边形环可以以顺时针和逆时针方向指定。MySQL 会在读取数据时自动翻转环。
笛卡尔坐标以空间参考系统的长度单位存储,在 X 坐标中存储 X 值,在 Y 坐标中存储 Y 值。轴方向是空间参考系统指定的。
地理坐标以空间参考系统的角度单位存储,在 X 坐标中存储经度,在 Y 坐标中存储纬度。轴方向和子午线是空间参考系统指定的。
函数 LENGTH()
返回值存储所需的空间字节数。例如:
mysql> SET @g = ST_GeomFromText('POINT(1 -1)');
mysql> SELECT LENGTH(@g);
+------------+
| LENGTH(@g) |
+------------+
| 25 |
+------------+
mysql> SELECT HEX(@g);
+----------------------------------------------------+
| HEX(@g) |
+----------------------------------------------------+
| 000000000101000000000000000000F03F000000000000F0BF |
+----------------------------------------------------+
值的长度为 25 字节,由以下组件组成(可以从十六进制值中看到):
-
4 字节的整数 SRID(0)
-
1 字节的整数字节顺序(1 = 小端)
-
4 字节的整数类型信息(1 =
点
) -
8 字节的双精度 X 坐标(1)
-
8 字节的双精度 Y 坐标(−1)