11.4.3 支持的空间数据格式
两种标准空间数据格式用于 table 示查询中的几何对象:
-
知名 Literals(WKT)格式
-
众所周知的二进制(WKB)格式
在内部,MySQL 以与 WKT 或 WKB 格式不同的格式存储几何值。 (内部格式类似于 WKB,但以 4 个初始字节 table 示 SRID.)
有一些功能可以在不同的数据格式之间进行转换。参见第 12.16.6 节“几何格式转换函数”。
以下各节描述了 MySQL 使用的空间数据格式:
众所周知的文本(WKT)格式
几何值的熟知文本(WKT)table 示旨在交换 ASCII 形式的几何数据。 OpenGIS 规范提供了 Backus-Naur 语法,该语法指定用于编写 WKT 值的正式生产规则(请参见第 11.4 节“空间数据类型”)。
WKT 几何对象 table 示的示例:
- A
Point
:
POINT(15 20)
指定的点坐标不带逗号。这与 SQL Point()函数的语法不同,后者需要在坐标之间使用逗号。注意使用适合给定空间操作上下文的语法。例如,以下语句都使用ST_X()从Point
对象提取 X 坐标。第一个直接使用Point()函数生成对象。第二种使用 WKTtable 示形式,将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))
- 具有三个
Point
值的MultiPoint
:
MULTIPOINT(0 0, 20 20, 60 60)
从 MySQL 5.7.9 开始,接受MultiPoint
值的 WKT 格式 table 示的空间函数(例如ST_MPointFromText()和ST_GeomFromText())允许值内的各个点用括号括起来。例如,以下两个函数调用均有效,而在 MySQL 5.7.9 之前的第二个函数调用会产生错误:
ST_MPointFromText('MULTIPOINT (1 1, 2 2, 3 3)')
ST_MPointFromText('MULTIPOINT ((1 1), (2 2), (3 3))')
从 MySQL 5.7.9 开始,MultiPoint
值的输出在每个点周围都包含括号。例如:
mysql> SET @mp = 'MULTIPOINT(1 1, 2 2, 3 3)';
mysql> SELECT ST_AsText(ST_GeomFromText(@mp));
+---------------------------------+
| ST_AsText(ST_GeomFromText(@mp)) |
+---------------------------------+
| MULTIPOINT((1 1),(2 2),(3 3)) |
+---------------------------------+
在 MySQL 5.7.9 之前,相同值的输出在每个点周围不包含括号:
mysql> SET @mp = 'MULTIPOINT(1 1, 2 2, 3 3)';
mysql> SELECT ST_AsText(ST_GeomFromText(@mp));
+---------------------------------+
| ST_AsText(ST_GeomFromText(@mp)) |
+---------------------------------+
| MULTIPOINT(1 1,2 2,3 3) |
+---------------------------------+
- 具有两个
LineString
值的MultiLineString
:
MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
- 具有两个
Polygon
值的MultiPolygon
:
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))
众所周知的二进制(WKB)格式
几何值的众所周知的二进制(WKB)table 示用于交换几何数据,作为由包含几何 WKB 信息的BLOB值 table 示的二进制流。此格式由 OpenGIS 规范定义(请参见第 11.4 节“空间数据类型”)。它还在 ISO * SQL/MM 第 3 部分:空间*标准中定义。
WKB 使用 1 字节无符号整数,4 字节无符号整数和 8 字节双精度数字(IEEE 754 格式)。一个字节是八位。
例如,对应于POINT(1 -1)
的 WKB 值由 21 个字节的序列组成,每个字节由两个十六进制数字 table 示:
0101000000000000000000F03F000000000000F0BF
序列由下 table 所示的组件组成。
table11.2 WKB 组件示例
Component | Size | Value |
---|---|---|
Byte order | 1 byte | 01 |
WKB type | 4 bytes | 01000000 |
X coordinate | 8 bytes | 000000000000F03F |
Y coordinate | 8 bytes | 000000000000F0BF |
组件 table 示如下:
-
字节 Sequences 指示符为 1 或 0table 示小端或大端存储。小字节序和大字节序分别也称为网络数据 table 示(NDR)和外部数据 table 示(XDR)。
-
WKB 类型是指示几何类型的代码。 MySQL 使用从 1 到 7 的值来 table 示
Point
,LineString
,Polygon
,MultiPoint
,MultiLineString
,MultiPolygon
和GeometryCollection
。 -
Point
值具有 X 和 Y 坐标,每个坐标都 table 示为双精度值。
如 OpenGIS 规范中所述,用于更复杂的几何值的 WKB 值具有更复杂的数据结构。
内部几何存储格式
MySQL 使用 4 个字节存储几何值,以指示 SRID,后跟该值的 WKBtable 示。有关 WKB 格式的说明,请参见众所周知的二进制(WKB)格式。
对于 WKB 部分,这些特定于 MySQL 的注意事项适用:
-
字节 Sequences 指示符字节为 1,因为 MySQL 将几何存储为低端值。
-
MySQL 支持
Point
,LineString
,Polygon
,MultiPoint
,MultiLineString
,MultiPolygon
和GeometryCollection
的几何类型。不支持其他几何类型。
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 个字节,table 示整数字节 Sequences(1 =小字节序)
-
4 个字节,用于整数类型信息(1 =
Point
) -
8 个双精度 X 坐标字节(1)
-
8 个双精度 Y 坐标的字节(-1)